User prompt
Save time and save the lowest and show it as fastest time ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Timer should b the score
User prompt
Fire should do a little more damage. Also save highest score (fastes time) ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
fastest time is still n/a. please fix it
User prompt
fastest time is not being updaated, can you fix it?
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'anchor')' in or related to this line: 'fastestTimeText.anchor.set(0.5, 0);' Line Number: 260
User prompt
make sure time is saved and shown in fastest time
User prompt
remove collision boxes
User prompt
Please fix the bug: 'ReferenceError: spearTriggerBoundingBox is not defined' in or related to this line: 'if (spearTriggerBoundingBox) {' Line Number: 458
User prompt
Please fix the bug: 'ReferenceError: fireTriggerBoundingBox is not defined' in or related to this line: 'if (fireTriggerBoundingBox) {' Line Number: 453
User prompt
Please fix the bug: 'ReferenceError: heroBoundingBox is not defined' in or related to this line: 'if (heroBoundingBox) {' Line Number: 448
User prompt
collision boxes should be updated with the objects positions
User prompt
make sure all objects have the collisions boxes drawn
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.x = target.x;' Line Number: 60
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.x = target.x;' Line Number: 56
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.x = target.x;' Line Number: 54
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in or related to this line: 'box.width = target.width;' Line Number: 48
User prompt
draw bbox arround objects
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'setText')' in or related to this line: 'fastestTimeText.setText("Fastest Time: " + (storage.fastestTime === "Infinity" ? "N/A" : storage.fastestTime.toFixed(3)));' Line Number: 474
User prompt
Please fix the bug: 'ReferenceError: fastestTimeText is not defined' in or related to this line: 'fastestTimeText.setText("Fastest Time: " + (storage.fastestTime === "Infinity" ? "N/A" : storage.fastestTime.toFixed(3)));' Line Number: 473
User prompt
It is not updating after playing a game
User prompt
make sure fastest time is updated with counter time
User prompt
show fasftest time in the main menu
User prompt
add storage for fastest counter final time ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Save timercoundown lowest final time in storage. Then display it as fastest kill in the homepage ↪💡 Consider importing and using the following plugins: @upit/storage.v1
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var FireTrigger = Container.expand(function () {
var self = Container.call(this);
var fireTriggerGraphics = self.attachAsset('fireTrigger', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Start with full transparency
});
// Add fade-in effect
tween(fireTriggerGraphics, {
alpha: 1 // Fade to full opacity
}, {
duration: 1000,
// 1 second duration
easing: tween.easeInOut
});
self.update = function () {
if (!self.fireWall) {
self.fireWall = LK.getAsset('fireWall', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireWall.width = 2048; // Set width to match screen width
self.fireWall.x = 2048 / 2; // Start from the center of the screen
self.fireWall.y = 2732 + self.fireWall.height; // Start from bottom off-screen
self.fireWall.speedX = 0; // No horizontal movement
self.fireWall.speedY = -15; // Move upwards
self.fireWall.update = function () {
this.x += this.speedX;
this.y += this.speedY;
// Add flickering effect
this.alpha = Math.random() * 0.5 + 0.5; // Random alpha between 0.5 and 1
};
game.addChild(self.fireWall);
// Play firewall sound when it spawns
LK.getSound('firewall').play();
// Reposition the fire trigger to a random location
self.x = Math.random() * (2048 - 400) + 200; // Ensure at least 200 pixels from left and right edges
self.y = Math.random() * (2732 - 400) + 200; // Ensure at least 200 pixels from top and bottom edges
// Add fade-in effect when repositioning
tween(fireTriggerGraphics, {
alpha: 1 // Fade to full opacity
}, {
duration: 1000,
// 1 second duration
easing: tween.easeInOut
});
}
if (self.intersects(hero)) {
self.fireWall = LK.getAsset('fireWall', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireWall.width = 2048; // Set width to match screen width
self.fireWall.x = 2048 / 2; // Start from the center of the screen
self.fireWall.y = 2732 + self.fireWall.height; // Start from bottom off-screen
self.fireWall.speedX = 0; // No horizontal movement
self.fireWall.speedY = -15; // Move upwards
self.fireWall.update = function () {
this.x += this.speedX;
this.y += this.speedY;
// Add flickering effect
this.alpha = Math.random() * 0.5 + 0.5; // Random alpha between 0.5 and 1
};
game.addChild(self.fireWall);
// Play firewall sound when it spawns
LK.getSound('firewall').play();
// Reposition the fire trigger to a random location
self.x = Math.random() * (2048 - 400) + 200; // Ensure at least 200 pixels from left and right edges
self.y = Math.random() * (2732 - 400) + 200; // Ensure at least 200 pixels from top and bottom edges
}
};
});
// Hero class representing the player character
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
// Add a shadow below the hero
var shadow = self.attachAsset('heroShadow', {
anchorX: 0.5,
anchorY: 0.5
});
shadow.y = heroGraphics.height / 2 + 10; // Position the shadow slightly below the hero
shadow.alpha = 0.5; // Make the shadow semi-transparent
// Add hitbox for collision detection
self.hitbox = new Container();
self.hitbox.width = heroGraphics.width * 1.2; // Increase size for better collision detection
self.hitbox.height = heroGraphics.height * 1.2; // Increase size for better collision detection
self.hitbox.x = -self.hitbox.width;
self.hitbox.y = -self.hitbox.height;
// Display the hitbox with a transparent asset
var hitboxGraphics = LK.getAsset('transparentAsset', {
anchorX: 0.5,
anchorY: 0.5
});
hitboxGraphics.width = self.hitbox.width;
hitboxGraphics.height = self.hitbox.height;
self.hitbox.addChild(hitboxGraphics);
self.addChild(self.hitbox);
self.update = function () {
// Update logic for hero, if needed
};
});
var Lifebar = Container.expand(function () {
var self = Container.call(this);
var lifebarGraphics = self.attachAsset('lifebar', {
anchorX: 0.5,
anchorY: 0.5
});
// Removed life percentage text display
self.update = function () {
// Removed life percentage text display
if (hero.health > 0) {
lifebarGraphics.width = hero.health / 100 * 1500; // Update lifebar width based on health
} else {
lifebarGraphics.width = 0; // Ensure lifebar does not grow after emptying
}
};
});
var Spear = Container.expand(function () {
var self = Container.call(this);
var spearGraphics = self.attachAsset('spear', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 20;
self.update = function () {
self.y += self.speed;
};
});
var SpearTrigger = Container.expand(function () {
var self = Container.call(this);
self.spearTriggerGraphics = self.attachAsset('spearTrigger', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Start with full transparency
});
// Add fade-in effect
tween(self.spearTriggerGraphics, {
alpha: 1 // Fade to full opacity
}, {
duration: 1000,
// 1 second duration
easing: tween.easeInOut
});
});
var StartScreen = Container.expand(function () {
var self = Container.call(this);
// Add a blury cloud moving in the background
var cloud = self.attachAsset('background', {
anchorX: 0.5,
// Center the cloud horizontally
anchorY: 0.5 // Center the cloud vertically
});
cloud.x = 2048 / 2; // Start from the center of the screen
cloud.y = 2732 / 2; // Start from the center of the screen
cloud.alpha = 0.3; // Make the cloud semi-transparent for a blury effect
// Animate the cloud to move slowly across the screen
function animateCloud() {
tween(cloud, {
x: 2048 / 2 + 100,
// Move the cloud 100 pixels to the right
y: 2732 / 2 + 50 // Move the cloud 50 pixels down
}, {
duration: 5000,
// Move over 5 seconds
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(cloud, {
x: 2048 / 2 - 100,
// Move the cloud back 100 pixels to the left
y: 2732 / 2 - 50 // Move the cloud back 50 pixels up
}, {
duration: 5000,
// Move back over 5 seconds
easing: tween.easeInOut,
onFinish: animateCloud // Loop the animation
});
}
});
}
animateCloud();
var gameTitle = self.attachAsset('gamename', {
anchorX: 0.5,
anchorY: 0.5
});
var startButton = self.attachAsset('startButton', {
anchorX: 0.5,
anchorY: 0.5
});
gameTitle.x = 2048 / 2;
gameTitle.y = 2732 / 2 - 500; // Move the game title 500 pixels up
// Add a tween to animate the game title
function animateTitle() {
tween(gameTitle, {
y: gameTitle.y - 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(gameTitle, {
y: gameTitle.y + 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: animateTitle // Loop the animation
});
}
});
}
animateTitle();
// Removed stretching of the game title image
startButton.x = 2048 / 2; // Center the start button horizontally
startButton.y = 2732 - 500; // Move the start button 400 pixels up from the bottom of the screen
// Add a tilting effect to the start button
function animateButton() {
tween(startButton, {
rotation: 0.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(startButton, {
rotation: -0.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: animateButton // Loop the tilting effect
});
}
});
}
animateButton();
startButton.down = function (x, y, obj) {
LK.getSound('Dieknightdie').play();
self.destroy();
initGame();
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
LK.playMusic('Menumusic'); // Play menu music on game load
var startScreen = game.addChild(new StartScreen());
// Check if hero's health is 0 to end the game
function shakeScreen() {
var shakeIntensity = 10;
var shakeDuration = 500; // in milliseconds
var elapsedTime = 0;
var originalX = game.x;
var originalY = game.y;
var shakeInterval = LK.setInterval(function () {
if (elapsedTime < shakeDuration) {
game.x = originalX + (Math.random() - 0.5) * shakeIntensity;
game.y = originalY + (Math.random() - 0.5) * shakeIntensity;
elapsedTime += 16; // approximately 60 FPS
} else {
game.x = originalX;
game.y = originalY;
LK.clearInterval(shakeInterval);
}
}, 16);
}
// Initialize game variables
var hero;
var spearTrigger;
var fireTrigger;
var spearCount = 0;
// Declare scoreText and timeCounter in the global scope
var scoreText;
var timeCounter;
var currentLevel = 1; // Initialize current level
// Function to initialize game elements
function initGame() {
// Play game music on game start
LK.playMusic('Gamemusic');
// Create and position the time counter
timeCounter = new Text2("0", {
size: 210,
// 70% of the original size
fill: 0xFFFFFF
});
// Add tween effect to increase the size of the time counter
tween(timeCounter, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 1000,
easing: tween.easeInOut
});
timeCounter.anchor.set(0.5, 1); // Sets anchor to the center of the bottom edge of the text.
LK.gui.bottom.addChild(timeCounter); // Add the time counter to the GUI overlay at the bottom of the screen.
// Create and display fastest time
var fastestTimeText = new Text2("Fastest: " + (storage.fastestTime || "N/A"), {
size: 150,
fill: 0xFFD700 // Gold color
});
fastestTimeText.anchor.set(0.5, 0);
LK.gui.top.addChild(fastestTimeText);
// Update the time counter every second
var startTime = Date.now();
var timeInterval = LK.setInterval(function () {
var elapsedTime = (Date.now() - startTime) / 1000;
timeCounter.setText(elapsedTime.toFixed(3));
// Set score to match timer value
LK.setScore(parseFloat(elapsedTime.toFixed(3)));
// Stop the time counter if hero's health is zero
if (hero.health <= 0) {
LK.clearInterval(timeInterval);
}
}, 1);
// Add background image
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5
});
background.x = 2048 / 2;
background.y = 2732 / 2;
background.alpha = 0.5; // Set background transparency to dim it
game.addChild(background);
hero = game.addChild(new Hero());
hero.health = 100; // Initialize hero health as a number
hero.x = 2048 / 2;
hero.y = 2732 / 2;
// Create and position the lifebar
var lifebar = new Lifebar();
lifebar.x = 2048 / 2;
lifebar.y = 25; // Centered at the top of the screen
game.addChild(lifebar);
// Initialize the score without displaying it
LK.setScore(0);
// Create and position the spear trigger within the playable area
spearTrigger = game.addChild(new SpearTrigger());
spearTrigger.x = Math.random() * (2048 - 400) + 200; // Ensure at least 200 pixels from left and right edges
spearTrigger.y = Math.random() * (2732 - 400) + 200; // Ensure at least 200 pixels from top and bottom edges
// Create and position the fire trigger within the playable area
fireTrigger = game.addChild(new FireTrigger());
fireTrigger.x = Math.random() * 2048 * 0.8 + 2048 * 0.1;
fireTrigger.y = Math.random() * 2732 * 0.8 + 2732 * 0.1;
}
// Function to handle hero movement
function handleMove(x, y, obj) {
// Add a wobble and tilting effect to the hero's movement
var wobbleIntensity = 5;
var tiltIntensity = 0.1;
if (hero && !game.ending) {
hero.x = x + (Math.random() - 0.5) * wobbleIntensity;
hero.y = y + (Math.random() - 0.5) * wobbleIntensity;
}
if (hero) {
hero.rotation = (Math.random() - 0.5) * tiltIntensity;
}
}
// Function to update game state
game.update = function () {
// Check if the hero intersects with the firewall
if (fireTrigger && fireTrigger.fireWall && hero.intersects(fireTrigger.fireWall)) {
// Decrease hero's health by 1 every third of a second
if (LK.ticks % 20 === 0) {
// Assuming 60 ticks per second
hero.health -= 1;
// Play firewall sound
LK.getSound('firewall').play();
}
}
if (hero && spearTrigger && hero.intersects(spearTrigger)) {
var spear = game.addChild(new Spear());
spear.x = Math.random() * 2048; // Random x position
spear.y = Math.random() < 0.5 ? 0 : 2732; // Randomly choose top or bottom for y position
var dx = hero.x - spear.x;
var dy = hero.y - spear.y;
var angle = Math.atan2(dy, dx);
spear.speedX = Math.cos(angle) * spear.speed;
spear.speedY = Math.sin(angle) * spear.speed;
spear.rotation = angle; // Rotate the spear in the direction it's moving
// Play spear sound
LK.getSound('spear').play();
spear.update = function () {
this.x += this.speedX;
this.y += this.speedY;
if (this.intersects(hero.hitbox)) {
// Trigger screen shake effect
shakeScreen();
// Attach the spear to the hero at the position it first touches him
this.speedX = 0;
this.speedY = 0;
var relativeX = this.x - hero.x;
var relativeY = this.y - hero.y;
this.update = function () {
var wobbleIntensity = 2;
var tiltIntensity = 0.05;
this.x = hero.x + relativeX + (Math.random() - 0.5) * wobbleIntensity;
this.y = hero.y + relativeY + (Math.random() - 0.5) * wobbleIntensity;
this.rotation = angle + (Math.random() - 0.5) * tiltIntensity;
};
// Play spearhit sound
LK.getSound('spearhit').play();
// Reduce player's health
hero.health -= 10;
// Check if hero's health is 0 to end the game
if (hero.health <= 0) {
tween(timeCounter, {
scaleX: timeCounter.scaleX + 0.5,
scaleY: timeCounter.scaleY + 0.5
}, {
duration: 2000,
easing: tween.linear
});
// Score is already being set continuously by the timer
// Save fastest time if it's the best
var currentTime = LK.getScore();
if (!storage.fastestTime || currentTime < storage.fastestTime) {
storage.fastestTime = currentTime;
}
// Show an endscreen for 2 seconds before game over
game.ending = true;
var endScreen = LK.getAsset('hudBackground', {
anchorX: 0.5,
anchorY: 0.5
});
endScreen.x = 2048 / 2 + 100;
endScreen.y = 2732 / 2 - 200;
endScreen.scaleX = 1;
endScreen.scaleY = 1;
game.addChild(endScreen);
tween(endScreen, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 4000,
easing: tween.easeInOut
}); // Tween to increase size
// Play evil laugh sound when endscreen appears
LK.getSound('Evillaugh').play();
LK.setTimeout(function () {
game.removeChild(endScreen);
game.ending = false;
LK.showGameOver();
}, 4000);
}
}
};
// Reposition the spear trigger to a random location
spearTrigger.x = Math.random() * (2048 - 400) + 200; // Ensure at least 200 pixels from left and right edges
spearTrigger.y = Math.random() * (2732 - 400) + 200; // Ensure at least 200 pixels from top and bottom edges
// Add fade-in effect when repositioning
tween(spearTrigger.spearTriggerGraphics, {
alpha: 1 // Fade to full opacity
}, {
duration: 1000,
// 1 second duration
easing: tween.easeInOut
});
}
};
// Function to handle transition to the next level
function moveToNextLevel() {
// Reset hero's health
hero.health = 100;
// Increment level (removed spear count and level display)
currentLevel++;
// Reposition hero to the center
hero.x = 2048 / 2;
hero.y = 2732 / 2;
// Reposition spear trigger to a new random location
spearTrigger.x = Math.random() * (2048 - 400) + 200; // Ensure at least 200 pixels from left and right edges
spearTrigger.y = Math.random() * (2732 - 400) + 200; // Ensure at least 200 pixels from top and bottom edges
// Optionally, increase difficulty or change level parameters here
}
// Set up event listeners for touch/mouse interactions
game.down = function (x, y, obj) {
handleMove(x, y, obj);
};
game.move = function (x, y, obj) {
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
// No specific action needed on release
}; ===================================================================
--- original.js
+++ change.js
@@ -1,8 +1,9 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
@@ -308,8 +309,15 @@
easing: tween.easeInOut
});
timeCounter.anchor.set(0.5, 1); // Sets anchor to the center of the bottom edge of the text.
LK.gui.bottom.addChild(timeCounter); // Add the time counter to the GUI overlay at the bottom of the screen.
+ // Create and display fastest time
+ var fastestTimeText = new Text2("Fastest: " + (storage.fastestTime || "N/A"), {
+ size: 150,
+ fill: 0xFFD700 // Gold color
+ });
+ fastestTimeText.anchor.set(0.5, 0);
+ LK.gui.top.addChild(fastestTimeText);
// Update the time counter every second
var startTime = Date.now();
var timeInterval = LK.setInterval(function () {
var elapsedTime = (Date.now() - startTime) / 1000;
@@ -418,8 +426,13 @@
duration: 2000,
easing: tween.linear
});
// Score is already being set continuously by the timer
+ // Save fastest time if it's the best
+ var currentTime = LK.getScore();
+ if (!storage.fastestTime || currentTime < storage.fastestTime) {
+ storage.fastestTime = currentTime;
+ }
// Show an endscreen for 2 seconds before game over
game.ending = true;
var endScreen = LK.getAsset('hudBackground', {
anchorX: 0.5,
pixealrt spear. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
fireskull button. pixelart.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
spearbutton. pixelart.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Pixelart button that says "Start". Dungeon vibes.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
2000 by 2800 high quality banner. Pixelart. title reads: "Die Knight, Die!". Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Pixealrt. Dungeon. Reads: The Knight is DEAD. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.