User prompt
after the cheese is placed on the hole wait 0.5f seconds and add one cheese to the score board
Code edit (2 edits merged)
Please save this source code
User prompt
debug error, cheese icon is visible after the cheese is placed on the hole
User prompt
make the cheese icon a global variable and change its visibility to false once the cheese reaches the hole
User prompt
remove the cheese icon when the cheese is on the hole
User prompt
Please fix the bug: 'TypeError: character.getChildByName is not a function' in or related to this line: 'character.removeChild(character.getChildByName('cheeseIcon'));' Line Number: 246
User prompt
if the cheese gets to the hole disable the icon ontop of the character head
User prompt
implement the same logic validation as when the cheese is picked up to make sure that the character is on the hole tile
User prompt
add a method that when the Abutton is pressed and the character was the cheese and the character is on the hole tile the cheese gets placed on the hole tile
User prompt
put the cheese icon on top of the character head instead, make it follow it too
User prompt
add a ui icon showing that the character picked up the cheese
User prompt
debug why the character cannot pick up the cheese
User prompt
refactor cheese pick up logic
User prompt
Please fix the bug: 'ReferenceError: cheese is not defined' in or related to this line: 'if (cheese && Math.abs(character.x - cheese.x) < 100 && Math.abs(character.y - cheese.y) < 100) {' Line Number: 240
User prompt
add a threshold of tolerance between the cheese and the character, so they dont need to be 100% alligned
User prompt
refactor the Abutton cheese logic
Code edit (2 edits merged)
Please save this source code
User prompt
debug the interception between the cheese and the character, is not being trigger
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'aButton')' in or related to this line: 'onScreenController.aButton.on('down', function () {' Line Number: 236
User prompt
remove redundant or unnecessary comments
User prompt
Please fix the bug: 'ReferenceError: cheese is not defined' in or related to this line: 'if (character.intersects(cheese)) {' Line Number: 245
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'aButton')' in or related to this line: 'onScreenController.aButton.on('down', function () {' Line Number: 242
User prompt
debug why i cant pick up the cheese when im on the same tile and im pressing the A button
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'y')' in or related to this line: 'currentCheesePosition.y = cheese.y; // Save current cheese y position' Line Number: 425
/**** * Classes ****/ // Cheese class for the game's objective 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 }); }); // 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 } // 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 () { // Movement logic remains the same if (self.targetTile) { var distanceToTarget = Math.sqrt(Math.pow(self.x - self.targetTile.x, 2) + Math.pow(self.y - self.targetTile.y, 2)); } if (distanceToTarget < 10 || !self.targetTile) { self.targetTile = floorTiles[Math.floor(Math.random() * floorTiles.length)]; } var angle = Math.atan2(self.targetTile.y - self.y, self.targetTile.x - self.x); var currentAngle = enemyGraphics.rotation; var targetAngle = angle; var angleDifference = targetAngle - currentAngle; angleDifference = (angleDifference + Math.PI) % (2 * Math.PI) - Math.PI; enemyGraphics.rotation += angleDifference * 0.1; var distance = Math.sqrt(Math.pow(self.targetTile.x - self.x, 2) + Math.pow(self.targetTile.y - self.y, 2)); var moveStep = self.speed / distance; self.x += (self.targetTile.x - self.x) * moveStep; self.y += (self.targetTile.y - self.y) * moveStep; }; }); // 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 = 270; // 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: 700, height: 700 }; this.aButton = self.attachAsset('aButton', { anchorX: 0.5, anchorY: 0.5, x: aButtonPosition.x, y: aButtonPosition.y, width: buttonSize.width, height: buttonSize.height }); // Removed tint application // 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 }); // Move dpad base to the top of the display list so it appears on top of the arrows 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 }); // Refactored D-pad control to use moveCharacter function for cleaner code 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, // Tint arrow yellow 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, // Tint arrow yellow orientation: 2 }); dpadDown.on('down', function () { startMovingCharacter(0, 1); }); // Consolidate dpad 'up' event handlers into a single function 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 ****/ // 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 collider onScreenController.aButton.on('down', function () { if (character.intersects(cheese)) { console.log('Cheese picked up!'); cheese.visible = false; // Hide cheese from the game cheesePlaced = false; // Reset cheese placement flag } }); // 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 onScreenController.aButton.on('down', function () { if (character.intersects(cheese)) { // Logic to pick up the cheese console.log('Cheese picked up!'); cheese.visible = false; // Hide cheese from the game cheesePlaced = false; // Reset cheese placement flag } }); // Code to set the midpoint branch as the top branch // This is a placeholder for demonstration purposes as the actual implementation of version control is outside the scope of this game code. console.log("Midpoint branch set as the top branch"); LK.screen = { width: 2048, height: 2732 }; // Initialize screen dimensions var isCharacterMoving = false; // Function to move character based on direction var dpadButtonSize = { width: 450, height: 450 }; function moveCharacter(xDir, yDir) { 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 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; // Initialize game start flag at the top of the Game Code section to ensure it's defined before usage var isGameStarted = false; var cheesePlaced = false; LK.on('tick', function () { if (!isGameStarted) { isGameStarted = true; // Ensure game start logic is only triggered once character = LK.getAsset('character', { anchorX: 0.5, anchorY: 0.5, x: holeTile.x, y: holeTile.y - 50, scaleX: 1.5, scaleY: 1.5 // zIndex removed }); // Enhance cheese placement to ensure it's as far away from the character as possible while avoiding corners var currentCheesePosition = { x: 0, y: 0 }; // Initialize variable to store cheese position if (!cheesePlaced) { // Ensure cheese is initialized before accessing its properties if (cheese) { currentCheesePosition.x = cheese.x; // Save current cheese x position } if (cheese) { 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)]; var cheese = game.addChild(new Cheese()); cheese.x = randomFloorTile.x; cheese.y = randomFloorTile.y; cheesePlaced = true; } 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 enemies.forEach(function (enemy) { enemy.move(); }); }); // 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]; }
/****
* Classes
****/
// Cheese class for the game's objective
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
});
});
// 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
}
// 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 () {
// Movement logic remains the same
if (self.targetTile) {
var distanceToTarget = Math.sqrt(Math.pow(self.x - self.targetTile.x, 2) + Math.pow(self.y - self.targetTile.y, 2));
}
if (distanceToTarget < 10 || !self.targetTile) {
self.targetTile = floorTiles[Math.floor(Math.random() * floorTiles.length)];
}
var angle = Math.atan2(self.targetTile.y - self.y, self.targetTile.x - self.x);
var currentAngle = enemyGraphics.rotation;
var targetAngle = angle;
var angleDifference = targetAngle - currentAngle;
angleDifference = (angleDifference + Math.PI) % (2 * Math.PI) - Math.PI;
enemyGraphics.rotation += angleDifference * 0.1;
var distance = Math.sqrt(Math.pow(self.targetTile.x - self.x, 2) + Math.pow(self.targetTile.y - self.y, 2));
var moveStep = self.speed / distance;
self.x += (self.targetTile.x - self.x) * moveStep;
self.y += (self.targetTile.y - self.y) * moveStep;
};
});
// 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 = 270;
// 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: 700,
height: 700
};
this.aButton = self.attachAsset('aButton', {
anchorX: 0.5,
anchorY: 0.5,
x: aButtonPosition.x,
y: aButtonPosition.y,
width: buttonSize.width,
height: buttonSize.height
});
// Removed tint application
// 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
});
// Move dpad base to the top of the display list so it appears on top of the arrows
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
});
// Refactored D-pad control to use moveCharacter function for cleaner code
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,
// Tint arrow yellow
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,
// Tint arrow yellow
orientation: 2
});
dpadDown.on('down', function () {
startMovingCharacter(0, 1);
});
// Consolidate dpad 'up' event handlers into a single function
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
****/
// 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 collider
onScreenController.aButton.on('down', function () {
if (character.intersects(cheese)) {
console.log('Cheese picked up!');
cheese.visible = false; // Hide cheese from the game
cheesePlaced = false; // Reset cheese placement flag
}
});
// 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
onScreenController.aButton.on('down', function () {
if (character.intersects(cheese)) {
// Logic to pick up the cheese
console.log('Cheese picked up!');
cheese.visible = false; // Hide cheese from the game
cheesePlaced = false; // Reset cheese placement flag
}
});
// Code to set the midpoint branch as the top branch
// This is a placeholder for demonstration purposes as the actual implementation of version control is outside the scope of this game code.
console.log("Midpoint branch set as the top branch");
LK.screen = {
width: 2048,
height: 2732
}; // Initialize screen dimensions
var isCharacterMoving = false;
// Function to move character based on direction
var dpadButtonSize = {
width: 450,
height: 450
};
function moveCharacter(xDir, yDir) {
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 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;
// Initialize game start flag at the top of the Game Code section to ensure it's defined before usage
var isGameStarted = false;
var cheesePlaced = false;
LK.on('tick', function () {
if (!isGameStarted) {
isGameStarted = true; // Ensure game start logic is only triggered once
character = LK.getAsset('character', {
anchorX: 0.5,
anchorY: 0.5,
x: holeTile.x,
y: holeTile.y - 50,
scaleX: 1.5,
scaleY: 1.5
// zIndex removed
});
// Enhance cheese placement to ensure it's as far away from the character as possible while avoiding corners
var currentCheesePosition = {
x: 0,
y: 0
}; // Initialize variable to store cheese position
if (!cheesePlaced) {
// Ensure cheese is initialized before accessing its properties
if (cheese) {
currentCheesePosition.x = cheese.x; // Save current cheese x position
}
if (cheese) {
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)];
var cheese = game.addChild(new Cheese());
cheese.x = randomFloorTile.x;
cheese.y = randomFloorTile.y;
cheesePlaced = true;
}
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
enemies.forEach(function (enemy) {
enemy.move();
});
});
// 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];
}
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.