User prompt
Make sure roombas only spawn on floor tiles
User prompt
Add 2 more roombas
User prompt
Please fix the bug: 'TypeError: LK.effects.explode is not a function' in or related to this line: 'LK.effects.explode(character, 1000); // Explode character over 1 second' Line Number: 696
User prompt
Create an explosion when character dies
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var playTimeDisplay = new Text2('00:00', {' Line Number: 281
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var playTimeDisplay = new Text2('00:00', {' Line Number: 280
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var playTimeDisplay = new Text2('00:00', {' Line Number: 280
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var playTimeDisplay = new Text2('00:00', {' Line Number: 280
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var playTimeDisplay = new Text2('00:00', {' Line Number: 367
User prompt
Check and fix the codebase for bug and smelly code
User prompt
Optimize the codebase, simplify it
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'var playTimeDisplay = new Text2('00:00', {' Line Number: 379
User prompt
Optimize the code base, simplify it
User prompt
Add collecting cheese event
User prompt
Refactor scoring logic and printing the score on screen
User prompt
Character must be immune to damage as long as it on the hole tile
User prompt
Fix the bug, score text is always 0
User prompt
Make sure the score text gets updated every time a cheese is collected
User prompt
Print the score on screen add it to the score board
User prompt
Delete line 422
User prompt
Lerp the cheese from the tile hole to the cheese icon instead of the scoreboard container
Code edit (1 edits merged)
Please save this source code
User prompt
Delete score text on the score board
User prompt
Delete any unused redundant or broken code about scoring points
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toString')' in or related to this line: 'window.cheeseScoreIcon.setText(cheeseScore.toString());' Line Number: 397
/****
* Classes
****/
var Cheese = Container.expand(function () {
var self = Container.call(this);
// Attach cheese asset with anchor point set to center
var cheeseShadow = self.attachAsset('CircularShadow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5,
alpha: 0.5,
y: 20
// zIndex removed
});
var cheeseGraphics = self.attachAsset('cheese', {
anchorX: 0.5,
anchorY: 0.5
// zIndex removed
});
// Lerp cheese to a target position
self.lerpToPosition = function (startPos, endPos, duration, onComplete) {
var startTime = Date.now();
var lerpInterval = LK.setInterval(function () {
var currentTime = Date.now();
var timeElapsed = currentTime - startTime;
var lerpFactor = timeElapsed / duration;
if (lerpFactor >= 1) {
LK.clearInterval(lerpInterval);
self.x = endPos.x;
self.y = endPos.y;
if (onComplete) {
onComplete();
}
} else {
self.x = startPos.x + (endPos.x - startPos.x) * lerpFactor;
self.y = startPos.y + (endPos.y - startPos.y) * lerpFactor;
}
}, 16); // Update approximately every 16ms (~60fps)
};
});
// Modular Enemy class to support different enemy types
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var shadowAssetId, enemyAssetId, shadowScale, enemySpeed;
// Enemy type enumerator with stats
var EnemyTypes = {
Roomba: {
shadowAssetId: 'CircularShadow',
enemyAssetId: 'Roomba',
shadowScale: 3.2,
enemySpeed: 2.64
}
// Define additional enemy types here
};
// Retrieve enemy type stats
var enemyStats = EnemyTypes[type];
if (!enemyStats) {
console.error('Unknown enemy type:', type);
return;
}
shadowAssetId = enemyStats.shadowAssetId;
enemyAssetId = enemyStats.enemyAssetId;
shadowScale = enemyStats.shadowScale;
enemySpeed = enemyStats.enemySpeed;
// Attach a shadow asset to the enemy and make it semitransparent
var shadowGraphics = self.attachAsset(shadowAssetId, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
scaleX: shadowScale,
scaleY: shadowScale
// zIndex removed
});
var enemyGraphics = self.attachAsset(enemyAssetId, {
anchorX: 0.5,
anchorY: 0.5
// zIndex removed
});
// Adjust shadow position relative to the enemy
shadowGraphics.x = enemyGraphics.x;
shadowGraphics.y = enemyGraphics.y + 40; // Slightly below the enemy for a realistic shadow effect
// Set enemy speed
self.speed = enemySpeed;
// Enemy movement logic
self.move = function () {
// Implement avoidance behavior for Roombas
enemies.forEach(function (otherEnemy) {
if (otherEnemy !== self) {
var dx = self.x - otherEnemy.x;
var dy = self.y - otherEnemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 150) {
// Calculate direction to move away from the other Roomba
var awayX = dx / distance;
var awayY = dy / distance;
self.x += awayX * self.speed; // Move self away from the other Roomba
self.y += awayY * self.speed;
}
}
});
// Introduce a collision counter to track continuous collisions
if (!self.collisionCounter) {
self.collisionCounter = 0;
}
// Increase collision counter on collision
if (self.colliding) {
self.collisionCounter++;
} else {
self.collisionCounter = 0; // Reset counter if not colliding
}
// Change target tile if colliding for too long or reached current target
if (!self.targetTile || self.collisionCounter > 30 || Math.sqrt(Math.pow(self.x - self.targetTile.x, 2) + Math.pow(self.y - self.targetTile.y, 2)) < 10) {
self.targetTile = floorTiles[Math.floor(Math.random() * floorTiles.length)];
self.collisionCounter = 0; // Reset collision counter after changing target
}
// Reset colliding flag for the next tick
self.colliding = false;
var angleToTarget = Math.atan2(self.targetTile.y - self.y, self.targetTile.x - self.x);
self.x += Math.cos(angleToTarget) * self.speed;
self.y += Math.sin(angleToTarget) * self.speed;
// Smoothly rotate the enemy towards the target angle
var currentAngle = enemyGraphics.rotation;
var targetAngle = angleToTarget;
// Calculate the shortest direction to rotate
var angleDifference = targetAngle - currentAngle;
angleDifference += angleDifference > Math.PI ? -2 * Math.PI : angleDifference < -Math.PI ? 2 * Math.PI : 0;
var rotationSpeed = 0.1; // Adjust rotation speed as needed
enemyGraphics.rotation += angleDifference * rotationSpeed;
};
});
// OnScreenController class encapsulating A, B buttons and D-pad
var OnScreenController = Container.expand(function () {
var self = Container.call(this);
// Add a background for the on screen controllers
var yPosAdjustment = -180;
var buttonYPosAdjustment = -273.2;
var dpadButtonSize = 290;
// Removed redundant tint application on A and B buttons
LK.screen = {
width: 2048,
height: 2732
}; // Initialize screen dimensions
var aButtonPosition = {
x: LK.screen.width * 0.75,
y: LK.screen.height * 0.85 + buttonYPosAdjustment + LK.screen.height * 0.055
};
var buttonSize = {
width: 400,
height: 400
};
var dPadSize = {
width: 750,
height: 750
};
this.aButton = self.attachAsset('aButton', {
anchorX: 0.5,
anchorY: 0.5,
x: aButtonPosition.x,
y: aButtonPosition.y,
width: buttonSize.width,
height: buttonSize.height
});
// D-pad
var dpadBase = self.attachAsset('dpadBase', {
anchorX: 0.5,
anchorY: 0.5,
x: LK.screen.width * 0.24,
y: LK.screen.height * 0.89 + yPosAdjustment - 10,
width: dPadSize.width,
height: dPadSize.height
});
self.setChildIndex(dpadBase, self.children.length - 1);
var dpadLeft = self.attachAsset('dpadButtonLeft', {
anchorX: 0.5,
anchorY: 0.5,
x: dpadBase.x - 300,
y: dpadBase.y,
width: dpadButtonSize,
height: dpadButtonSize,
alpha: 0,
// Tint arrow yellow
orientation: 3
});
var moveInterval;
function startMovingCharacter(xDir, yDir) {
if (moveInterval) {
LK.clearInterval(moveInterval);
}
isCharacterMoving = true;
moveCharacter(xDir, yDir);
moveInterval = LK.setInterval(function () {
moveCharacter(xDir, yDir);
}, 150);
}
dpadLeft.on('down', function () {
startMovingCharacter(-1, 0);
});
var dpadUp = self.attachAsset('dpadButtonUp', {
anchorX: 0.5,
anchorY: 0.5,
x: dpadBase.x,
y: dpadBase.y - 300,
width: dpadButtonSize,
height: dpadButtonSize,
alpha: 0,
// Tint arrow yellow
orientation: 0
});
dpadUp.on('down', function () {
startMovingCharacter(0, -1);
});
var dpadRight = self.attachAsset('dpadButtonRight', {
anchorX: 0.5,
anchorY: 0.5,
x: dpadBase.x + 300,
y: dpadBase.y,
width: dpadButtonSize,
height: dpadButtonSize,
alpha: 0,
orientation: 1
});
dpadRight.on('down', function () {
startMovingCharacter(1, 0);
});
var dpadDown = self.attachAsset('dpadButtonDown', {
anchorX: 0.5,
anchorY: 0.5,
x: dpadBase.x,
y: dpadBase.y + 300,
width: dpadButtonSize,
height: dpadButtonSize,
alpha: 0,
orientation: 2
});
dpadDown.on('down', function () {
startMovingCharacter(0, 1);
});
function stopMovingCharacter() {
isCharacterMoving = false;
LK.clearInterval(moveInterval);
}
dpadLeft.on('up', stopMovingCharacter);
dpadUp.on('up', stopMovingCharacter);
dpadRight.on('up', stopMovingCharacter);
dpadDown.on('up', stopMovingCharacter);
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf9e076 // Fun yellow background
});
/****
* Game Code
****/
// Update play time display every second
LK.on('tick', function () {
var minutes = Math.floor(playTime / 60);
var seconds = playTime % 60;
playTimeDisplay.setText((minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
});
// Create a timer to update play time every second
var playTimeTimer = LK.setInterval(function () {
playTime += 1;
}, 1000);
// Initialize play time tracking
var playTime = 0;
// EventManager class for centralized event handling
// Initialize EventManager for global event handling
var EventManager = {
events: {},
subscribe: function subscribe(eventType, listener) {
if (!this.events[eventType]) {
this.events[eventType] = [];
}
this.events[eventType].push(listener);
},
unsubscribe: function unsubscribe(eventType, listener) {
if (this.events[eventType]) {
var index = this.events[eventType].indexOf(listener);
if (index > -1) {
this.events[eventType].splice(index, 1);
}
}
},
publish: function publish(eventType, data) {
if (this.events[eventType]) {
this.events[eventType].forEach(function (listener) {
listener(data);
});
}
}
};
game.eventManager = EventManager;
// Subscribe to 'gameStart' event to initialize character and game state
game.eventManager.subscribe('gameStart', function () {
isGameStarted = true;
character = LK.getAsset('character', {
anchorX: 0.5,
anchorY: 0.5,
x: holeTile.x,
y: holeTile.y - 50,
scaleX: 1.5,
scaleY: 1.5
});
});
// Initialize scoreboard container and elements once and update score dynamically
if (!window.scoreBoardInitialized) {
var updateCheeseScore = function updateCheeseScore(score) {
cheeseScoreDisplay.setText(score.toString());
};
window.scoreBoardContainer = new Container();
var scoreBoardX = 200,
scoreBoardY = 125;
var cheeseIconForScore = window.scoreBoardContainer.attachAsset('cheese', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
x: -35,
y: 0
});
// Dynamically add one character lives icon per available life
var availableLives = 3; // Assuming 3 lives to start with
var livesIcons = [];
for (var i = 0; i < availableLives; i++) {
var lifeIcon = window.scoreBoardContainer.attachAsset('characterLivesIcon', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
// Scale increased to make the icon 3 times bigger
scaleY: 1.5,
// Scale increased to make the icon 3 times bigger
x: 1070 - i * 120,
// Position each icon with a gap of 80px
y: 0
});
livesIcons.push(lifeIcon);
}
// Cheese score display added to the scoreboard
var cheeseScoreDisplay = new Text2('0', {
size: 50,
fill: "#ffffff",
x: cheeseIconForScore.x + 50,
y: cheeseIconForScore.y
});
cheeseScoreDisplay.anchor.set(0.5, 0.5);
window.scoreBoardContainer.addChild(cheeseScoreDisplay);
// Update cheese score display function
window.updateCheeseScore = updateCheeseScore;
// Character lives text asset creation and addition to scoreBoardContainer removed
// Add play time display to the scoreboard
// Initialize screen dimensions for playTimeDisplay positioning
// Screen dimensions are already initialized globally and should not be redefined.
var playTimeDisplay = new Text2('00:00', {
size: 50,
fill: "#E0E0E0",
font: "Arial Black, bold",
x: -LK.screen.width / 2,
// Correctly calculate x position using LK.screen.width
y: 50
});
playTimeDisplay.anchor.set(-3, 0.5); // Center the text horizontally
window.scoreBoardContainer.addChild(playTimeDisplay);
window.scoreBoardContainer.x = scoreBoardX;
window.scoreBoardContainer.y = scoreBoardY;
LK.gui.addChild(window.scoreBoardContainer);
window.scoreBoardInitialized = true;
}
// Update score dynamically without recreating the scoreboard elements
// Update score dynamically without recreating the scoreboard elements
// This block intentionally left blank to signify removal of the above code
// Move the onScreenController initialization to the top of Game Code section to ensure it's available before adding event listeners
var onScreenController = game.addChild(new OnScreenController());
// Event listener for A button press to pick up the cheese using a refined proximity check and method encapsulation
onScreenController.aButton.on('down', function () {
// Check if cheese is picked up and character is on the hole tile
// Simplify cheese pickup and placement logic
if (cheeses.some(function (cheese) {
return isWithinProximity(character, cheese, 75);
})) {
var pickedCheese = cheeses.find(function (cheese) {
return isWithinProximity(character, cheese, 75);
});
// Hide the picked cheese and show UI icon if not already visible
pickedCheese.visible = false;
console.log('Cheese picked up or placed!');
if (!cheeseIcon || !cheeseIcon.visible) {
cheeseIcon = character.attachAsset('cheese', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -character.height * 0.75,
scaleX: 0.5,
scaleY: 0.5
});
}
// If placing cheese on hole tile, update score and make cheese invisible
if (isWithinProximity(character, holeTile, 75)) {
cheeseIcon.visible = false;
LK.setScore(LK.getScore() + 1);
window.updateCheeseScore(LK.getScore());
}
}
});
// Helper function to check if two objects are within a certain distance
function isWithinProximity(obj1, obj2, threshold) {
return Math.abs(obj1.x - obj2.x) < threshold && Math.abs(obj1.y - obj2.y) < threshold;
}
var isCharacterMoving = false;
// Function to move character based on direction
var dpadButtonSize = {
width: 450,
height: 450
};
function moveCharacter(xDir, yDir) {
if (availableLives <= 0) {
return;
}
var nextX = character.x + xDir * tileWidth;
var nextY = character.y + yDir * tileHeight;
// Check if the next position is within the grid boundaries
if (nextX >= gridOffsetX && nextX <= gridOffsetX + gridSize * tileWidth && nextY >= gridOffsetY && nextY <= gridOffsetY + gridSize * tileHeight) {
// Check if the next tile is not a wall
var nextTileIndex = Math.floor((nextY - gridOffsetY) / tileHeight) * gridSize + Math.floor((nextX - gridOffsetX) / tileWidth);
if (floorTiles.includes(grid[nextTileIndex]) || holeTile && grid[nextTileIndex].x === holeTile.x && grid[nextTileIndex].y === holeTile.y) {
character.x = nextX;
character.y = nextY;
character.currentTile = grid[nextTileIndex];
}
}
}
LK.screen = {
width: 2048,
height: 2732
}; // Initialize screen dimensions
var gridSize = 10;
var character;
var cheeses = []; // Initialize cheeses array globally
var cheeseScore = 0; // Initialize cheese score variable
var cheeseIcon; // Declare cheeseIcon as a global variable
var wallTiles = [];
var floorTiles = [];
var grid = new Array(gridSize * gridSize);
var tileWidth = LK.screen.width * .6 / (gridSize - 1); // Adjust tile width to ensure tiles are touching
var tileHeight = tileWidth; // Ensure square tiles for a uniform grid
var gridOffsetX = (LK.screen.width - tileWidth * gridSize) / 2; // Corrected grid offset X calculation
var gridOffsetY = (LK.screen.height - tileHeight * gridSize) / 2 - LK.screen.height * 0.15; // Corrected grid offset Y calculation
// Move the onScreenController initialization to the top of Game Code section to ensure it's available before adding event listeners
var onScreenController = game.addChild(new OnScreenController());
// Removed the A button press event listener for picking up cheese based on tile comparison
function createTiles() {
// Create a black square background for the grid
var gridBackground = LK.getAsset('gridBackground', {
anchorX: 0.5,
anchorY: 0.8,
x: LK.screen.width / 2,
y: LK.screen.height / 2,
width: LK.screen.width * .9,
height: LK.screen.height * .6,
tint: 0xFFA500 // Apply orange tint
});
game.addChild(gridBackground);
var gridBackgroundShrunk = LK.getAsset('gridBackground', {
anchorX: 0.5,
anchorY: 0.8,
x: LK.screen.width / 2,
y: LK.screen.height / 2,
width: LK.screen.width * .9 - 50,
height: LK.screen.height * .6 - 50,
tint: 0x000000 // Apply black tint
});
game.addChild(gridBackgroundShrunk);
game.setChildIndex(gridBackgroundShrunk, game.getChildIndex(gridBackground) + 1);
for (var i = 0; i < gridSize * gridSize; i++) {
var x = i % gridSize;
var y = Math.floor(i / gridSize);
var tile;
var tileWidth = LK.screen.width * .6 / (gridSize - 1); // Adjust tile width to ensure tiles are touching
var tileHeight = tileWidth; // Ensure square tiles for a uniform grid
var gridOffsetX = (LK.screen.width - tileWidth * (gridSize - 1)) / 2; // Adjust grid offset to account for new tile width
var gridOffsetY = (LK.screen.height - tileHeight * (gridSize - 1)) / 2 - LK.screen.height * 0.15; // Adjust grid offset to account for new tile height
if (!(x === 0 || y === 0 || x === gridSize - 1 || y === gridSize - 1)) {
tile = LK.getAsset('floorTile', {
anchorX: 0.5,
anchorY: 0.5,
x: x * tileWidth + gridOffsetX,
y: y * tileHeight + gridOffsetY
});
floorTiles.push(tile);
game.addChild(tile);
grid[i] = tile;
}
}
// Add walls after floor tiles to ensure they render on top
for (var i = 0; i < gridSize * gridSize; i++) {
var x = i % gridSize;
var y = Math.floor(i / gridSize);
if (x === 0 || y === 0 || x === gridSize - 1 || y === gridSize - 1) {
var tile = LK.getAsset('wallTile', {
anchorX: 0.5,
anchorY: 0.5,
x: x * tileWidth + gridOffsetX,
y: y * tileHeight + gridOffsetY
});
wallTiles.push(tile);
game.addChild(tile);
grid[i] = tile;
}
}
}
createTiles();
// Function to check if a tile is in a corner
function isTileInCorner(tile) {
var corners = [{
x: LK.screen.width / 2 - tileWidth * gridSize / 2,
y: LK.screen.height / 2 - tileHeight * gridSize / 2
}, {
x: LK.screen.width / 2 - tileWidth * gridSize / 2,
y: LK.screen.height / 2 + tileHeight * (gridSize - 1) / 2
}, {
x: LK.screen.width / 2 + tileWidth * (gridSize - 1) / 2,
y: LK.screen.height / 2 - tileHeight * gridSize / 2
}, {
x: LK.screen.width / 2 + tileWidth * (gridSize - 1) / 2,
y: LK.screen.height / 2 + tileHeight * (gridSize - 1) / 2
}];
return corners.some(function (corner) {
return Math.abs(tile.x - corner.x) < tileWidth / 2 && Math.abs(tile.y - corner.y) < tileHeight / 2;
});
}
// Select a random wall tile and replace it with a hole tile, ensuring it's not in a corner
var validWallTiles = wallTiles.filter(function (tile) {
// Exclude tiles that are in the corners by checking their position against the grid's corners
return !isTileInCorner(tile);
});
var randomWallTile = validWallTiles[Math.floor(Math.random() * validWallTiles.length)];
var holeTile = LK.getAsset('holeTile', {
anchorX: 0.5,
anchorY: 0.5,
x: randomWallTile.x,
y: randomWallTile.y
});
game.addChild(holeTile);
game.removeChild(randomWallTile);
var randomWallTileIndex = wallTiles.indexOf(randomWallTile);
wallTiles[randomWallTileIndex] = holeTile;
var isGameStarted = false;
var cheesePlaced = false;
LK.on('tick', function () {
if (!isGameStarted) {
game.eventManager.publish('gameStart', null);
var currentCheesePosition = {
x: 0,
y: 0
}; // Initialize variable to store cheese position
// Initialize cheese instances to place them on the floor
cheeses.push(game.addChild(new Cheese()));
cheeses.push(game.addChild(new Cheese()));
cheeses.push(game.addChild(new Cheese()));
if (!cheesePlaced) {
// Ensure cheese is initialized before accessing its properties
// Since cheeses are now handled as an array, we iterate over them to save their positions
cheeses.forEach(function (cheese) {
currentCheesePosition.x = cheese.x; // Save current cheese x position
currentCheesePosition.y = cheese.y; // Save current cheese y position
});
// Filter out tiles that are too close to corners
var nonCornerFloorTiles = floorTiles.filter(function (tile) {
return !isTileInCorner(tile);
});
// Further filter to find tiles farthest from the character's starting position
var farthestTiles = nonCornerFloorTiles.filter(function (tile) {
var distanceToCharacter = Math.sqrt(Math.pow(tile.x - character.x, 2) + Math.pow(tile.y - character.y, 2));
return distanceToCharacter > LK.screen.width / 2; // Arbitrary distance threshold
});
// If no tile is found far enough (unlikely but possible), default to non-corner tiles
var targetTiles = farthestTiles.length > 0 ? farthestTiles : nonCornerFloorTiles;
// Select a random tile from the final list
var randomFloorTile = targetTiles[Math.floor(Math.random() * targetTiles.length)];
// Correctly iterate over cheeses array to place each cheese on a unique random floor tile
cheeses.forEach(function (cheese) {
// Ensure a unique tile is selected for each cheese
var uniqueTileIndex = Math.floor(Math.random() * targetTiles.length);
var uniqueFloorTile = targetTiles.splice(uniqueTileIndex, 1)[0]; // Remove the selected tile from the pool to ensure uniqueness
if (uniqueFloorTile) {
// Check if a tile was successfully selected
cheese.x = uniqueFloorTile.x;
cheese.y = uniqueFloorTile.y;
}
});
cheesePlaced = true; // Indicate that cheeses have been placed
}
var characterShadow = LK.getAsset('characterShadow', {
anchorX: 0.5,
anchorY: 0.5,
x: -15,
y: 50,
scaleX: 0.6,
scaleY: 0.6,
alpha: 0.5
// zIndex removed
});
character.addChild(characterShadow);
character.currentTile = getTileAtPosition(holeTile.x, holeTile.y); // Correctly initialize character's current tile
game.addChild(character);
}
// Iterate over enemies array to move each enemy and check for collision with character
// Streamline enemy movement and collision detection with character
enemies.forEach(function (enemy) {
enemy.move();
if (enemy.intersects(character) && !character.isImmune && character.currentTile !== holeTile) {
availableLives -= 1;
updateLivesDisplay();
grantTemporaryImmunity(character);
if (availableLives <= 0) {
character.visible = false;
LK.setTimeout(LK.showGameOver, 1000);
}
}
});
// Assume updateLivesDisplay and grantTemporaryImmunity are helper functions defined elsewhere
});
// Create instances of enemies and store them in an array
var enemies = [];
enemies.push(game.addChild(new Enemy('Roomba')));
enemies.push(game.addChild(new Enemy('Roomba')));
// Position enemies
enemies[0].x = LK.screen.width / 2;
enemies[0].y = LK.screen.height / 2;
enemies[1].x = LK.screen.width / 4;
enemies[1].y = LK.screen.height / 4;
// Define a function to get the tile at a given position
function getTileAtPosition(x, y) {
var index = Math.floor(y / 100) * gridSize + Math.floor(x / 100);
return grid[index];
} ===================================================================
--- original.js
+++ change.js
@@ -348,20 +348,14 @@
y: cheeseIconForScore.y
});
cheeseScoreDisplay.anchor.set(0.5, 0.5);
window.scoreBoardContainer.addChild(cheeseScoreDisplay);
- // Refactored updateCheeseScore function to correctly update cheese score
- window.updateCheeseScore = function (score) {
- cheeseScore = score; // Update global cheeseScore variable
- cheeseScoreDisplay.setText(cheeseScore.toString()); // Update display text with new score
- };
+ // Update cheese score display function
+ window.updateCheeseScore = updateCheeseScore;
// Character lives text asset creation and addition to scoreBoardContainer removed
// Add play time display to the scoreboard
// Initialize screen dimensions for playTimeDisplay positioning
- LK.screen = {
- width: 2048,
- height: 2732
- };
+ // Screen dimensions are already initialized globally and should not be redefined.
var playTimeDisplay = new Text2('00:00', {
size: 50,
fill: "#E0E0E0",
font: "Arial Black, bold",
@@ -382,16 +376,19 @@
// Move the onScreenController initialization to the top of Game Code section to ensure it's available before adding event listeners
var onScreenController = game.addChild(new OnScreenController());
// Event listener for A button press to pick up the cheese using a refined proximity check and method encapsulation
onScreenController.aButton.on('down', function () {
- // Check if character is near any cheese to pick it up
- var cheeseToPickUp = cheeses.find(function (cheese) {
+ // Check if cheese is picked up and character is on the hole tile
+ // Simplify cheese pickup and placement logic
+ if (cheeses.some(function (cheese) {
return isWithinProximity(character, cheese, 75);
- });
- if (cheeseToPickUp) {
- // Hide the picked cheese from the game
- cheeseToPickUp.visible = false;
- // Show UI icon indicating cheese has been picked up only if not already visible
+ })) {
+ var pickedCheese = cheeses.find(function (cheese) {
+ return isWithinProximity(character, cheese, 75);
+ });
+ // Hide the picked cheese and show UI icon if not already visible
+ pickedCheese.visible = false;
+ console.log('Cheese picked up or placed!');
if (!cheeseIcon || !cheeseIcon.visible) {
cheeseIcon = character.attachAsset('cheese', {
anchorX: 0.5,
anchorY: 0.5,
@@ -399,13 +396,15 @@
y: -character.height * 0.75,
scaleX: 0.5,
scaleY: 0.5
});
- cheeseIcon.visible = true;
}
- // Set cheese placement flag to true
- cheesePlaced = true;
- console.log('Cheese picked up!');
+ // If placing cheese on hole tile, update score and make cheese invisible
+ if (isWithinProximity(character, holeTile, 75)) {
+ cheeseIcon.visible = false;
+ LK.setScore(LK.getScore() + 1);
+ window.updateCheeseScore(LK.getScore());
+ }
}
});
// Helper function to check if two objects are within a certain distance
function isWithinProximity(obj1, obj2, threshold) {
@@ -609,41 +608,22 @@
character.currentTile = getTileAtPosition(holeTile.x, holeTile.y); // Correctly initialize character's current tile
game.addChild(character);
}
// Iterate over enemies array to move each enemy and check for collision with character
+ // Streamline enemy movement and collision detection with character
enemies.forEach(function (enemy) {
enemy.move();
- // Check if enemy intersects with character
- if (enemy.intersects(character) && Math.sqrt(Math.pow(enemy.x - character.x, 2) + Math.pow(enemy.y - character.y, 2)) < 200 && !character.isImmune && character.currentTile !== holeTile) {
- // Reduce character lives by 1
+ if (enemy.intersects(character) && !character.isImmune && character.currentTile !== holeTile) {
availableLives -= 1;
- // Update lives display
- livesIcons.forEach(function (icon, index) {
- icon.visible = index < availableLives;
- });
- // Make character blink to indicate damage and grant temporary immunity
- character.isImmune = true; // Set immunity flag to true
- var blinkInterval = LK.setInterval(function () {
- character.visible = !character.visible;
- // Tint character red when hit
- character.tint = character.visible ? 0xff0000 : 0xffffff;
- }, 100);
- LK.setTimeout(function () {
- LK.clearInterval(blinkInterval);
- character.visible = true;
- // Reset tint to normal after blinking
- character.tint = 0xffffff;
- character.isImmune = false; // Remove immunity after 1 second
- }, 1000);
- // Check if lives are depleted
+ updateLivesDisplay();
+ grantTemporaryImmunity(character);
if (availableLives <= 0) {
- character.visible = false; // Make character invisible
- LK.setTimeout(function () {
- LK.showGameOver(); // Show game over pop up after a delay
- }, 1000); // Wait one second before showing game over
+ character.visible = false;
+ LK.setTimeout(LK.showGameOver, 1000);
}
}
});
+ // Assume updateLivesDisplay and grantTemporaryImmunity are helper functions defined elsewhere
});
// Create instances of enemies and store them in an array
var enemies = [];
enemies.push(game.addChild(new Enemy('Roomba')));
grey square, black border. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
simple light yellow button front view game console, clean, rounded edges, high resolution, graphic. Single Game Texture. In-Game asset. 2d. Blank background. High contrast.
Worn out sticker for a video game, 90s style, cheese, simple, vintage. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
wall view from top-down, game asset videogame, black color, simple. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. worn out sticker. 90's style. vintage. simple. top-down view. poster. sticker
top-down view, videogame character enemy, roomba, 90s style sticker, flat, no perspective, silhouette, black and white, cartoon, fun, simple, from above. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
top-down view, videogame heart, 90s style sticker, flat, no perspective, silhouette, white, cartoon, fun, simple, from above. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Black square with white outline. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.