User prompt
Please fix the bug: 'Uncaught TypeError: EventManager is not a constructor' in or related to this line: 'var game = new LK.Game({' Line Number: 174
User prompt
Analize the code base, refactor it to make it more S.O.L.I.D
User prompt
Analize the code base, refactor it to make it more S.O.L.I.D
User prompt
Please fix the bug: 'Uncaught ReferenceError: createTiles is not defined' in or related to this line: 'createTiles();' Line Number: 416
User prompt
optimize all the code base, remove irrelevant comments based on current implementation
User prompt
optimize the code
User prompt
debug lerp logic, make the placed cheese lerp towards the scoreboard position
User prompt
debug the lerp fuction make sure the code is not redundat and use the already save cheese variable
User prompt
line 307 ad a lerp from holeTile position to scoreboard position, move the placed cheese to the scoreboard using the lerp function on 1 second, after that make the cheese invisible
User prompt
optimize cheese code
User prompt
remove all lerp logic
Code edit (2 edits merged)
Please save this source code
User prompt
remove any duplicate implementation of lerping
User prompt
ensure just one lerp implementation exist and that is correctly handling cheese
User prompt
implement a lerp animation when a cheese is placed on the hole tile, lerp it to the scoreboard and turn the visibility of the cheese off once it reaches the board position
User prompt
Please fix the bug: 'Uncaught TypeError: EventManager is not a constructor' in or related to this line: 'game.eventManager = new EventManager();' Line Number: 279
User prompt
implement a event system that helps decouple classes dependencies and make the code more modular
User prompt
ensure that the scoreboard updates correctly and that only one text asset exist
Code edit (1 edits merged)
Please save this source code
User prompt
add new rule, only one cheese per floor tile at a given time
Code edit (1 edits merged)
Please save this source code
User prompt
change the fill color of the text to the same color of the background
User prompt
change the color of the scoreboard to 0xf9e076
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
/**** * Classes ****/ var Cheese = Container.expand(function () { var self = Container.call(this); var cheeseShadow = self.attachAsset('CircularShadow', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, alpha: 0.5, y: 20 }); var cheeseGraphics = self.attachAsset('cheese', { anchorX: 0.5, anchorY: 0.5 }); }); // 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 }); var enemyGraphics = self.attachAsset(enemyAssetId, { anchorX: 0.5, anchorY: 0.5 }); // Adjust shadow position relative to the enemy shadowGraphics.x = enemyGraphics.x; shadowGraphics.y = enemyGraphics.y + 40; // Set enemy speed self.speed = enemySpeed; // Enemy movement logic self.move = function () { 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 button and D-pad var OnScreenController = Container.expand(function () { var self = Container.call(this); var yPosAdjustment = -180; var buttonYPosAdjustment = -273.2; var dpadButtonSize = 290; 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 ****/ // 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) { 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: -50, y: 0 }); // Ensure only one instance of the score text asset exists if (!window.cheeseScoreIcon) { window.cheeseScoreIcon = new Text2('0', { size: 50, fill: "#E0E0E0", font: "Arial Black, bold", x: 20, y: -25 }); window.scoreBoardContainer.addChild(window.cheeseScoreIcon); } window.scoreBoardContainer.x = scoreBoardX; window.scoreBoardContainer.y = scoreBoardY; LK.gui.addChild(window.scoreBoardContainer); window.scoreBoardInitialized = true; } // Update score dynamically without recreating the scoreboard elements window.cheeseScoreIcon.setText(LK.getScore().toString()); // 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 if (cheesePlaced && cheeseIcon && cheeseIcon.visible && isWithinProximity(character, holeTile, 75)) { console.log('Cheese placed on hole tile!'); // Update to handle multiple cheeses cheeses.forEach(function (cheese) { if (isWithinProximity(cheese, character, 75)) { cheese.x = holeTile.x; // Place cheese on hole tile cheese.y = holeTile.y; cheese.visible = true; // Make cheese visible on the hole tile } }); // Disable cheese icon on character head if (cheeseIcon) { cheeseIcon.visible = false; } // Correct lerp logic for moving placed cheese to scoreboard cheeses.forEach(function (cheese) { if (isWithinProximity(cheese, holeTile, 75)) { var lerpDuration = 1000; // 1 second in milliseconds var startTime = Date.now(); var startPos = { x: cheese.x, y: cheese.y }; var endPos = { x: window.scoreBoardContainer.x + cheeseIconForScore.x, y: window.scoreBoardContainer.y + cheeseIconForScore.y }; var lerp = function lerp() { var currentTime = Date.now(); var timeElapsed = currentTime - startTime; var t = Math.min(1, timeElapsed / lerpDuration); cheese.x = startPos.x + (endPos.x - startPos.x) * t; cheese.y = startPos.y + (endPos.y - startPos.y) * t; if (t < 1) { requestAnimationFrame(lerp); } else { // Make cheese invisible after reaching scoreboard cheese.visible = false; } }; requestAnimationFrame(lerp); } }); } else if (cheeses.some(function (cheese) { return isWithinProximity(character, cheese, 75); })) { var pickedCheese = cheeses.find(function (cheese) { return isWithinProximity(character, cheese, 75); }); pickedCheese.visible = false; // Hide the picked cheese from the game // Check if cheese is initialized and within a refined proximity to the character for pickup console.log('Cheese picked up!'); pickedCheese.visible = false; // Hide the picked cheese from the game // Show UI icon indicating cheese has been picked up only if not already visible if (!cheeseIcon || !cheeseIcon.visible) { cheeseIcon = character.attachAsset('cheese', { anchorX: 0.5, anchorY: 0.5, x: 0, // Centered on character's head y: -character.height * 0.75, // Positioned above the character's head scaleX: 0.5, scaleY: 0.5 }); } cheesePlaced = true; // Set cheese placement flag to true } }); // 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; } // Simplified and optimized game code initialization and logic var isCharacterMoving = false; var character; var cheeses = []; // Global cheeses array var cheeseIcon; // Global cheese icon variable var wallTiles = []; var floorTiles = []; var grid = []; var gridSize = 10; var tileWidth, tileHeight, gridOffsetX, gridOffsetY; var enemies = []; // Initialize screen dimensions LK.screen = { width: 2048, height: 2732 }; // Function to move character based on direction function moveCharacter(xDir, yDir) { var nextX = character.x + xDir * tileWidth; var nextY = character.y + yDir * tileHeight; if (isValidMove(nextX, nextY)) { character.x = nextX; character.y = nextY; character.currentTile = getTileAtPosition(nextX, nextY); } } // Check if the next position is valid for movement function isValidMove(nextX, nextY) { return nextX >= gridOffsetX && nextX <= gridOffsetX + gridSize * tileWidth && nextY >= gridOffsetY && nextY <= gridOffsetY + gridSize * tileHeight && !isWallTile(nextX, nextY); } // Check if the specified position is a wall tile function isWallTile(x, y) { var tile = getTileAtPosition(x, y); return wallTiles.includes(tile); } // Define a function to get the tile at a given position function getTileAtPosition(x, y) { var index = Math.floor((y - gridOffsetY) / tileHeight) * gridSize + Math.floor((x - gridOffsetX) / tileWidth); return grid[index]; } // Initialize game elements and logic function initializeGame() { calculateTileDimensions(); createTiles(); placeHoleTile(); initializeEnemies(); game.eventManager.subscribe('gameStart', initializeCharacterAndCheeses); } // Calculate tile dimensions and grid offsets function calculateTileDimensions() { tileWidth = LK.screen.width * .6 / gridSize; tileHeight = tileWidth; gridOffsetX = (LK.screen.width - tileWidth * gridSize) / 2; gridOffsetY = (LK.screen.height - tileHeight * gridSize) / 2 - LK.screen.height * 0.15; } // Initialize character and cheeses at game start function initializeCharacterAndCheeses() { if (!isGameStarted) { character = game.addChild(new Character()); character.currentTile = getTileAtPosition(holeTile.x, holeTile.y); placeCheeses(); isGameStarted = true; } } // Place cheeses on the game board function placeCheeses() { cheeses = [new Cheese(), new Cheese(), new Cheese()]; cheeses.forEach(function (cheese) { game.addChild(cheese); }); distributeCheeses(); } // Distribute cheeses on valid floor tiles function distributeCheeses() { var validTiles = floorTiles.filter(function (tile) { return !isTileInCorner(tile); }); shuffleArray(validTiles); cheeses.forEach(function (cheese, index) { if (validTiles[index]) { cheese.x = validTiles[index].x; cheese.y = validTiles[index].y; } }); cheesePlaced = true; } // Shuffle an array in place function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var _ref = [array[j], array[i]]; array[i] = _ref[0]; array[j] = _ref[1]; } } initializeGame();
===================================================================
--- original.js
+++ change.js
@@ -349,221 +349,100 @@
// 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;
}
-// This block intentionally left blank to signify removal of the above code
+// Simplified and optimized game code initialization and logic
var isCharacterMoving = false;
-// Function to move character based on direction
-var dpadButtonSize = {
- width: 450,
- height: 450
+var character;
+var cheeses = []; // Global cheeses array
+var cheeseIcon; // Global cheese icon variable
+var wallTiles = [];
+var floorTiles = [];
+var grid = [];
+var gridSize = 10;
+var tileWidth, tileHeight, gridOffsetX, gridOffsetY;
+var enemies = [];
+// Initialize screen dimensions
+LK.screen = {
+ width: 2048,
+ height: 2732
};
+// Function to move character based on direction
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];
- }
+ if (isValidMove(nextX, nextY)) {
+ character.x = nextX;
+ character.y = nextY;
+ character.currentTile = getTileAtPosition(nextX, nextY);
}
}
-LK.screen = {
- width: 2048,
- height: 2732
-}; // Initialize screen dimensions
-var gridSize = 10;
-var character;
-var cheeses = []; // Initialize cheeses array globally
-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;
- }
+// Check if the next position is valid for movement
+function isValidMove(nextX, nextY) {
+ return nextX >= gridOffsetX && nextX <= gridOffsetX + gridSize * tileWidth && nextY >= gridOffsetY && nextY <= gridOffsetY + gridSize * tileHeight && !isWallTile(nextX, nextY);
+}
+// Check if the specified position is a wall tile
+function isWallTile(x, y) {
+ var tile = getTileAtPosition(x, y);
+ return wallTiles.includes(tile);
+}
+// Define a function to get the tile at a given position
+function getTileAtPosition(x, y) {
+ var index = Math.floor((y - gridOffsetY) / tileHeight) * gridSize + Math.floor((x - gridOffsetX) / tileWidth);
+ return grid[index];
+}
+// Initialize game elements and logic
+function initializeGame() {
+ calculateTileDimensions();
+ createTiles();
+ placeHoleTile();
+ initializeEnemies();
+ game.eventManager.subscribe('gameStart', initializeCharacterAndCheeses);
+}
+// Calculate tile dimensions and grid offsets
+function calculateTileDimensions() {
+ tileWidth = LK.screen.width * .6 / gridSize;
+ tileHeight = tileWidth;
+ gridOffsetX = (LK.screen.width - tileWidth * gridSize) / 2;
+ gridOffsetY = (LK.screen.height - tileHeight * gridSize) / 2 - LK.screen.height * 0.15;
+}
+// Initialize character and cheeses at game start
+function initializeCharacterAndCheeses() {
+ if (!isGameStarted) {
+ character = game.addChild(new Character());
+ character.currentTile = getTileAtPosition(holeTile.x, holeTile.y);
+ placeCheeses();
+ isGameStarted = true;
}
- // 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;
+// Place cheeses on the game board
+function placeCheeses() {
+ cheeses = [new Cheese(), new Cheese(), new Cheese()];
+ cheeses.forEach(function (cheese) {
+ game.addChild(cheese);
});
+ distributeCheeses();
}
-// 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) {
- var shuffleArray = function shuffleArray(array) {
- for (var i = array.length - 1; i > 0; i--) {
- var j = Math.floor(Math.random() * (i + 1));
- var _ref = [array[j], array[i]];
- array[i] = _ref[0];
- array[j] = _ref[1];
- }
- };
- // Ensure cheese is initialized before accessing its properties
- // Since cheeses are now handled as an array, we iterate over them to save their positions
- // Removed redundant cheese position saving as it's not utilized later in the code
- // 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)];
- // Shuffle the targetTiles array to randomize tile selection
- shuffleArray(targetTiles);
- // Assign each cheese to a unique tile from the shuffled targetTiles array
- cheeses.forEach(function (cheese, index) {
- if (targetTiles[index]) {
- cheese.x = targetTiles[index].x;
- cheese.y = targetTiles[index].y;
- }
- });
- cheesePlaced = true; // Indicate that cheeses have been placed
+// Distribute cheeses on valid floor tiles
+function distributeCheeses() {
+ var validTiles = floorTiles.filter(function (tile) {
+ return !isTileInCorner(tile);
+ });
+ shuffleArray(validTiles);
+ cheeses.forEach(function (cheese, index) {
+ if (validTiles[index]) {
+ cheese.x = validTiles[index].x;
+ cheese.y = validTiles[index].y;
}
- 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];
-}
\ No newline at end of file
+ cheesePlaced = true;
+}
+// Shuffle an array in place
+function shuffleArray(array) {
+ for (var i = array.length - 1; i > 0; i--) {
+ var j = Math.floor(Math.random() * (i + 1));
+ var _ref = [array[j], array[i]];
+ array[i] = _ref[0];
+ array[j] = _ref[1];
+ }
+}
+initializeGame();
\ No newline at end of file
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.