User prompt
make an portal were the enemies come out
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'if (player.intersects(enemies[j]) && !player.invulnerable) {' Line Number: 521
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'if (player.intersects(enemies[j]) && !player.invulnerable) {' Line Number: 519
User prompt
delete an enemy when the enemy reached the other side
User prompt
show all hit boxes
User prompt
make that the enemys cant go trough other enemys
User prompt
make that the player dont jumps so high when he uses the double jump
User prompt
make an double jump
User prompt
ok make the slowenemy a little more faster and smaller
User prompt
ok than make an enemy that is big and slow and you have to jump over it
User prompt
make an bird enemy wic flys and when you touch it you die
User prompt
make players y position same as enemy
User prompt
change players y position at 10
User prompt
make players y position same as enemy
User prompt
fix music pls
User prompt
make the player to mario
User prompt
make an jump animation for the player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
when play again button is pressed then start epic music from second 0
User prompt
reset the music after klicking the play aigain button
User prompt
play my music in the backround of the game
User prompt
add epic music
User prompt
show all hit boxes
User prompt
make the player hit box smaller
User prompt
show me all hitboxes
User prompt
make the hit box from the enemy smaller
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Define a class for flying bird enemies
var Bird = Container.expand(function () {
var self = Container.call(this);
var birdGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Apply a tint to make it look different from regular enemies
birdGraphics.tint = 0x00FFFF;
// Create a hitbox for the bird
self.hitArea = new Rectangle(-30, -30, 60, 60);
self.speed = 6;
self.verticalSpeed = 0;
self.amplitude = 100; // How high the bird flies up and down
self.frequency = 0.05; // How fast the bird completes a wave cycle
self.initialY = 0; // Will store the initial Y position
self.time = 0; // Time counter for sine wave movement
self.update = function () {
// Store last position for collision detection
if (self.lastX === undefined) {
self.lastX = self.x;
self.lastY = self.y;
self.lastWasIntersecting = false;
}
// Move bird horizontally
self.x -= self.speed;
// Update time counter
self.time += self.frequency;
// Apply sine wave vertical movement
self.y = self.initialY + Math.sin(self.time) * self.amplitude;
// Rotate bird slightly to match flight direction
self.rotation = Math.sin(self.time) * 0.2;
// Remove bird if it's off screen
if (self.x < -50) {
self.destroy();
}
// Update last positions
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Create a much smaller hitbox for the enemy (reduce the collision area)
self.hitArea = new Rectangle(-30, -30, 60, 60);
self.speed = 8;
self.update = function () {
self.x -= self.speed;
// Make the enemy roll by rotating it in the opposite direction
self.rotation -= 0.1;
if (self.x < -50) {
self.destroy();
}
};
});
// Define a class for heart display
var Heart = Container.expand(function () {
var self = Container.call(this);
// Create a heart using the heart asset
var heartShape = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
// Animate heart slightly
self.animate = function () {
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 800,
easing: tween.easeInOutQuad,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 800,
easing: tween.easeInOutQuad,
onFinish: self.animate
});
}
});
};
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Create a smaller hitbox for the player to make collisions more precise
self.hitArea = new Rectangle(-50, -30, 100, 60);
self.speed = 5;
self.jumpHeight = 40;
self.isJumping = false;
self.velocityY = 0;
self.invulnerable = false;
self.update = function () {
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.9; // Gravity effect
if (self.y >= 2732 / 2) {
// Ground level
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
// Add landing animation - slight squash effect
tween(self, {
scaleX: 1.3,
scaleY: 0.7
}, {
duration: 200,
easing: tween.easeOutQuad,
onFinish: function onFinish() {
// Return to normal scale
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.easeOutElastic
});
}
});
}
}
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.velocityY = -self.jumpHeight;
// Add a jump animation - squash before stretching up
tween(self, {
scaleX: 1.2,
scaleY: 0.8
}, {
duration: 150,
easing: tween.easeOutQuad,
onFinish: function onFinish() {
// Stretch when jumping up
tween(self, {
scaleX: 0.9,
scaleY: 1.3
}, {
duration: 300,
easing: tween.easeOutQuad,
onFinish: function onFinish() {
// Return to normal scale gradually
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 400,
easing: tween.easeInOutQuad
});
}
});
}
});
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Using same asset as enemy but will be tinted differently
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
background.x = 0;
background.y = 0;
// Initialize player
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 100;
var enemySpawnCounter = 0;
// Create a new Text2 object to display the score
var scoreText = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
// Add the score text to the game GUI at the top center of the screen
LK.gui.top.addChild(scoreText);
scoreText.x = 2048 / 2;
scoreText.y = 0;
// Initialize lives counter
var lives = 3;
var hearts = [];
var heartsContainer = new Container();
game.addChild(heartsContainer);
// Position hearts container in the middle of the screen
heartsContainer.x = 2048 / 2;
heartsContainer.y = 150;
// Create heart display
function updateHeartDisplay() {
// Clear existing hearts
while (hearts.length > 0) {
var heart = hearts.pop();
heart.destroy();
}
// Create new hearts based on current lives
for (var i = 0; i < lives; i++) {
var heart = new Heart();
heart.x = (i - (lives - 1) / 2) * 100; // Distribute hearts evenly
heart.y = 0;
hearts.push(heart);
heartsContainer.addChild(heart);
heart.animate();
}
}
// Initial heart display
updateHeartDisplay();
// Play epic background music with fade-in effect
LK.playMusic('epicMusic', {
fade: {
start: 0,
end: 0.8,
duration: 2000
}
});
// Add listener for game reset to restart music
LK.on('gameReset', function () {
// Restart the music when game resets from the beginning (second 0)
LK.stopMusic(); // Stop current music to ensure we start from the beginning
LK.playMusic('epicMusic', {
loop: true,
fade: {
start: 0,
end: 0.8,
duration: 2000
}
});
});
// Handle game updates
game.update = function () {
player.update();
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval) {
// Randomly decide whether to spawn a regular enemy or a bird (30% chance for bird)
if (Math.random() < 0.7) {
var enemy = new Enemy();
enemy.x = 2048;
enemy.y = 2732 / 2;
enemies.push(enemy);
game.addChild(enemy);
// Apply rolling animation with tween in the opposite direction
tween(enemy, {
rotation: -Math.PI * 4
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
// Continuously roll the enemy in the opposite direction
tween(enemy, {
rotation: enemy.rotation - Math.PI * 4
}, {
duration: 2000,
easing: tween.linear
});
}
});
} else {
// Spawn a bird at a random height
var bird = new Bird();
bird.x = 2048;
bird.y = Math.random() * (2732 / 2 - 400) + 400; // Random position between 400 and half the screen height
bird.initialY = bird.y; // Set the initial Y position for the sine wave
enemies.push(bird);
game.addChild(bird);
// Apply flapping wing animation
tween(bird, {
scaleY: 0.85
}, {
duration: 300,
easing: tween.easeInOutQuad,
onFinish: function onFinish() {
// Flap wings function that will call itself repeatedly
function flapWings() {
tween(bird, {
scaleY: 1.15
}, {
duration: 300,
easing: tween.easeInOutQuad,
onFinish: function onFinish() {
tween(bird, {
scaleY: 0.85
}, {
duration: 300,
easing: tween.easeInOutQuad,
onFinish: flapWings
});
}
});
}
flapWings();
}
});
}
// Randomize the spawn interval for the next enemy
enemySpawnInterval = Math.floor(Math.random() * 150) + 50;
enemySpawnCounter = 0;
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
if (player.intersects(enemies[j]) && !player.invulnerable) {
// Handle collision
lives--;
updateHeartDisplay();
// Make player invulnerable temporarily
player.invulnerable = true;
player.alpha = 0.5;
// Flash the screen red
LK.effects.flashScreen(0xff0000, 500);
// Remove the enemy
enemies[j].destroy();
enemies.splice(j, 1);
// Check if player has run out of lives
if (lives <= 0) {
LK.showGameOver();
} else {
// Make player vulnerable again after a short time
LK.setTimeout(function () {
player.invulnerable = false;
player.alpha = 1;
}, 1500);
}
} else if (player.x > enemies[j].x && !enemies[j].passed) {
enemies[j].passed = true;
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore());
}
}
};
// Handle player jump
game.down = function (x, y, obj) {
player.jump();
};
// Import tween plugin for animations ===================================================================
--- original.js
+++ change.js
@@ -5,8 +5,50 @@
/****
* Classes
****/
+// Define a class for flying bird enemies
+var Bird = Container.expand(function () {
+ var self = Container.call(this);
+ var birdGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Apply a tint to make it look different from regular enemies
+ birdGraphics.tint = 0x00FFFF;
+ // Create a hitbox for the bird
+ self.hitArea = new Rectangle(-30, -30, 60, 60);
+ self.speed = 6;
+ self.verticalSpeed = 0;
+ self.amplitude = 100; // How high the bird flies up and down
+ self.frequency = 0.05; // How fast the bird completes a wave cycle
+ self.initialY = 0; // Will store the initial Y position
+ self.time = 0; // Time counter for sine wave movement
+ self.update = function () {
+ // Store last position for collision detection
+ if (self.lastX === undefined) {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.lastWasIntersecting = false;
+ }
+ // Move bird horizontally
+ self.x -= self.speed;
+ // Update time counter
+ self.time += self.frequency;
+ // Apply sine wave vertical movement
+ self.y = self.initialY + Math.sin(self.time) * self.amplitude;
+ // Rotate bird slightly to match flight direction
+ self.rotation = Math.sin(self.time) * 0.2;
+ // Remove bird if it's off screen
+ if (self.x < -50) {
+ self.destroy();
+ }
+ // Update last positions
+ self.lastX = self.x;
+ self.lastY = self.y;
+ };
+ return self;
+});
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
@@ -145,8 +187,9 @@
/****
* Game Code
****/
+// Using same asset as enemy but will be tinted differently
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
@@ -222,40 +265,75 @@
player.update();
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval) {
- var enemy = new Enemy();
- enemy.x = 2048;
- enemy.y = 2732 / 2;
- enemies.push(enemy);
- game.addChild(enemy);
- // Apply rolling animation with tween in the opposite direction
- tween(enemy, {
- rotation: -Math.PI * 4
- }, {
- duration: 2000,
- easing: tween.linear,
- onFinish: function onFinish() {
- // Continuously roll the enemy in the opposite direction
- tween(enemy, {
- rotation: enemy.rotation - Math.PI * 4
- }, {
- duration: 2000,
- easing: tween.linear
- });
- }
- });
+ // Randomly decide whether to spawn a regular enemy or a bird (30% chance for bird)
+ if (Math.random() < 0.7) {
+ var enemy = new Enemy();
+ enemy.x = 2048;
+ enemy.y = 2732 / 2;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ // Apply rolling animation with tween in the opposite direction
+ tween(enemy, {
+ rotation: -Math.PI * 4
+ }, {
+ duration: 2000,
+ easing: tween.linear,
+ onFinish: function onFinish() {
+ // Continuously roll the enemy in the opposite direction
+ tween(enemy, {
+ rotation: enemy.rotation - Math.PI * 4
+ }, {
+ duration: 2000,
+ easing: tween.linear
+ });
+ }
+ });
+ } else {
+ // Spawn a bird at a random height
+ var bird = new Bird();
+ bird.x = 2048;
+ bird.y = Math.random() * (2732 / 2 - 400) + 400; // Random position between 400 and half the screen height
+ bird.initialY = bird.y; // Set the initial Y position for the sine wave
+ enemies.push(bird);
+ game.addChild(bird);
+ // Apply flapping wing animation
+ tween(bird, {
+ scaleY: 0.85
+ }, {
+ duration: 300,
+ easing: tween.easeInOutQuad,
+ onFinish: function onFinish() {
+ // Flap wings function that will call itself repeatedly
+ function flapWings() {
+ tween(bird, {
+ scaleY: 1.15
+ }, {
+ duration: 300,
+ easing: tween.easeInOutQuad,
+ onFinish: function onFinish() {
+ tween(bird, {
+ scaleY: 0.85
+ }, {
+ duration: 300,
+ easing: tween.easeInOutQuad,
+ onFinish: flapWings
+ });
+ }
+ });
+ }
+ flapWings();
+ }
+ });
+ }
// Randomize the spawn interval for the next enemy
enemySpawnInterval = Math.floor(Math.random() * 150) + 50;
enemySpawnCounter = 0;
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
- // Update player's Y position to match enemy's Y position
- if (enemies.length > 0) {
- player.y = enemies[j].y;
- }
if (player.intersects(enemies[j]) && !player.invulnerable) {
// Handle collision
lives--;
updateHeartDisplay();