User prompt
When it game overs my whole phone will crash
User prompt
The speedrun button background will be speedone
User prompt
Can you make it lower βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
Can you make it black and the text will be white
User prompt
Can you add the speedrun button on up left screen
User prompt
A button saying speedrun when you press it the timer will be 3 seconds
User prompt
MORE frequently and faster PUT IT 0 seconds with no space βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make the warning music go on more time very very fast βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
The war warning music will turn Up the volume really fastly βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
And the warning music will turn the volume up A bit over again to full volume βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
The warning music will transform 1 to 2 to 3 to more times βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
When the warning music loop it will repeat 0 second to get annoying
User prompt
Make the warning music loop on one second when the music end
User prompt
When is flashing red the background music will stop βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
The warning music will loop
User prompt
When the screen is flashing red a warning music happened βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'warningText.style.fill = 0x000000; // Black text during flash' Line Number: 388
User prompt
Can you make the text when is flashing red the text will be black saying Time is running out βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
When the timer is nearly to 0 a flashing red screen happen and saying timer is running out βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
Can you make the timer bigger
User prompt
Can you put the timer above the container
User prompt
Add a timer when it run outs is game over
User prompt
Make the box lower
User prompt
a box at the top of the left screen show you what the next fruit will be
User prompt
If I doing great and bit up top a sound happen
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Fruit = Container.expand(function (type, x, y) {
var self = Container.call(this);
self.fruitType = type;
self.fruitTypes = ['grape', 'cherry', 'strawberry', 'lemon', 'orange', 'apple', 'pear', 'peach', 'pineapple', 'melon', 'watermelon'];
self.fruitSizes = [80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 300];
self.fruitPoints = [10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240];
self.graphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.vx = 0;
self.vy = 0;
self.radius = self.fruitSizes[self.fruitTypes.indexOf(type)] / 2;
self.gravity = 0.8;
self.bounce = 0.3;
self.friction = 0.99;
self.hasMerged = false;
self.update = function () {
if (self.hasMerged) return;
// Initialize last ground contact state if not set
if (self.lastOnGround === undefined) self.lastOnGround = false;
// Apply gravity
self.vy += self.gravity;
// Apply velocity
self.x += self.vx;
self.y += self.vy;
// Apply friction
self.vx *= self.friction;
self.vy *= self.friction;
// Boundary collision with container walls
if (self.x - self.radius < containerLeft + 40) {
self.x = containerLeft + 40 + self.radius;
self.vx = -self.vx * self.bounce;
}
if (self.x + self.radius > containerRight - 40) {
self.x = containerRight - 40 - self.radius;
self.vx = -self.vx * self.bounce;
}
// Boundary collision with container bottom
var currentOnGround = self.y + self.radius > containerBottom - 20;
if (currentOnGround) {
// Check if this is the moment we hit the ground (transition from not on ground to on ground)
if (!self.lastOnGround && currentOnGround) {
// Play ground hit sound
LK.getSound('groundHit').play();
}
self.y = containerBottom - 20 - self.radius;
self.vy = -self.vy * self.bounce;
if (Math.abs(self.vy) < 1) {
self.vy = 0;
}
}
// Update last ground contact state
self.lastOnGround = currentOnGround;
// Check for merging with other fruits
for (var i = 0; i < fruits.length; i++) {
var other = fruits[i];
if (other === self || other.hasMerged || self.hasMerged) continue;
if (other.fruitType !== self.fruitType) continue;
var dx = other.x - self.x;
var dy = other.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var minDistance = self.radius + other.radius;
if (distance < minDistance) {
// Merge fruits
self.merge(other);
break;
}
}
// Check for collision with other fruits
for (var i = 0; i < fruits.length; i++) {
var other = fruits[i];
if (other === self || other.hasMerged || self.hasMerged) continue;
var dx = other.x - self.x;
var dy = other.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var minDistance = self.radius + other.radius;
if (distance < minDistance && distance > 0) {
// Separate fruits
var overlap = minDistance - distance;
var separationX = dx / distance * overlap * 0.5;
var separationY = dy / distance * overlap * 0.5;
self.x -= separationX;
self.y -= separationY;
other.x += separationX;
other.y += separationY;
// Exchange velocities
var tempVx = self.vx;
var tempVy = self.vy;
self.vx = other.vx * self.bounce;
self.vy = other.vy * self.bounce;
other.vx = tempVx * other.bounce;
other.vy = tempVy * other.bounce;
}
}
};
self.merge = function (other) {
if (self.hasMerged || other.hasMerged) return;
var typeIndex = self.fruitTypes.indexOf(self.fruitType);
if (typeIndex >= self.fruitTypes.length - 1) return; // Already watermelon
var newType = self.fruitTypes[typeIndex + 1];
var points = self.fruitPoints[typeIndex + 1];
// Mark both fruits as merged
self.hasMerged = true;
other.hasMerged = true;
// Create new fruit at average position
var newX = (self.x + other.x) / 2;
var newY = (self.y + other.y) / 2;
// Add score
LK.setScore(LK.getScore() + points);
scoreTxt.setText(LK.getScore());
// Play merge sound
LK.getSound('merge').play();
// Flash effect
LK.effects.flashObject(self, 0xffffff, 200);
LK.effects.flashObject(other, 0xffffff, 200);
// Remove old fruits after a short delay
LK.setTimeout(function () {
// Remove from fruits array
var selfIndex = fruits.indexOf(self);
if (selfIndex >= 0) {
fruits.splice(selfIndex, 1);
}
var otherIndex = fruits.indexOf(other);
if (otherIndex >= 0) {
fruits.splice(otherIndex, 1);
}
// Destroy old fruits
self.destroy();
other.destroy();
// Create new fruit
var newFruit = new Fruit(newType, newX, newY);
fruits.push(newFruit);
game.addChild(newFruit);
}, 200);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var fruits = [];
var nextFruitType = 'grape';
var containerLeft = 224;
var containerRight = 1824;
var containerBottom = 2200;
var containerTop = 800;
var dropPosition = 1024;
var canDrop = true;
var gameOverLine = containerTop - 100;
var gameTimer = 60 * 60; // 60 seconds at 60 FPS
// Create container
var container = game.addChild(LK.getAsset('container', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1500
}));
// Create container walls
var leftWall = game.addChild(LK.getAsset('containerWall', {
anchorX: 0.5,
anchorY: 0.5,
x: containerLeft,
y: 1500
}));
var rightWall = game.addChild(LK.getAsset('containerWall', {
anchorX: 0.5,
anchorY: 0.5,
x: containerRight,
y: 1500
}));
var bottomWall = game.addChild(LK.getAsset('containerBottom', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: containerBottom
}));
// Create score display
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create timer display
var timerTxt = new Text2('60', {
size: 60,
fill: 0xFFFFFF
});
timerTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(timerTxt);
// Create next fruit preview box in top left
var nextFruitBox = game.addChild(LK.getAsset('container', {
anchorX: 0,
anchorY: 0,
x: 150,
y: 300,
scaleX: 0.15,
scaleY: 0.15
}));
// Create next fruit preview
var nextFruitPreview = game.addChild(LK.getAsset('nextFruit', {
anchorX: 0.5,
anchorY: 0.5,
x: 270,
y: 390
}));
function updateNextFruitPreview() {
// Fade out old preview
tween(nextFruitPreview, {
alpha: 0,
scaleX: 0.5,
scaleY: 0.5
}, {
duration: 150,
easing: tween.easeIn,
onFinish: function onFinish() {
nextFruitPreview.destroy();
nextFruitPreview = game.addChild(LK.getAsset(nextFruitType, {
anchorX: 0.5,
anchorY: 0.5,
x: 270,
y: 390,
scaleX: 0.8,
scaleY: 0.8
}));
// Fade in new preview
nextFruitPreview.alpha = 0;
nextFruitPreview.scaleX = 1.2;
nextFruitPreview.scaleY = 1.2;
tween(nextFruitPreview, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.bounceOut
});
}
});
}
function getRandomSmallFruit() {
var smallFruits = ['grape', 'cherry', 'strawberry', 'lemon'];
return smallFruits[Math.floor(Math.random() * smallFruits.length)];
}
// checkGameOver function removed
// Initial setup
nextFruitType = getRandomSmallFruit();
updateNextFruitPreview();
// Play background music with looping
LK.playMusic('music');
game.move = function (x, y, obj) {
if (!canDrop) return;
// Constrain drop position within container bounds
dropPosition = Math.max(containerLeft + 60, Math.min(containerRight - 60, x));
};
game.down = function (x, y, obj) {
if (!canDrop) return;
// Add scale down animation to preview before dropping
tween(nextFruitPreview, {
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 100,
easing: tween.easeIn,
onFinish: function onFinish() {
// Drop the fruit
var newFruit = new Fruit(nextFruitType, dropPosition, containerTop + 50);
fruits.push(newFruit);
game.addChild(newFruit);
// Add entry animation to the new fruit
newFruit.scaleX = 0.5;
newFruit.scaleY = 0.5;
tween(newFruit, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.bounceOut
});
// Play drop sound
LK.getSound('drop').play();
// Prevent dropping for a short time
canDrop = false;
LK.setTimeout(function () {
canDrop = true;
}, 500);
// Generate next fruit
nextFruitType = getRandomSmallFruit();
updateNextFruitPreview();
}
});
};
game.update = function () {
// Update timer
gameTimer--;
var seconds = Math.ceil(gameTimer / 60);
timerTxt.setText(seconds);
// Check if timer ran out
if (gameTimer <= 0) {
LK.showGameOver();
return;
}
// Update all fruits
for (var i = fruits.length - 1; i >= 0; i--) {
if (fruits[i] && !fruits[i].hasMerged) {
// Check if fruit still exists (might have been destroyed in merge)
if (fruits[i].parent) {
fruits[i].update();
}
}
}
// Check for game over - if any fruit reaches the top
for (var i = 0; i < fruits.length; i++) {
if (fruits[i] && !fruits[i].hasMerged) {
// Initialize last close to top state if not set
if (fruits[i].lastCloseToTop === undefined) fruits[i].lastCloseToTop = false;
// Check if fruit is close to top (but not at game over line)
var closeToTopLine = gameOverLine + 150; // 150 pixels below game over line
var currentCloseToTop = fruits[i].y - fruits[i].radius <= closeToTopLine && fruits[i].y - fruits[i].radius > gameOverLine;
// Play sound when fruit first gets close to top
if (!fruits[i].lastCloseToTop && currentCloseToTop) {
LK.getSound('closeToTop').play();
}
// Update last close to top state
fruits[i].lastCloseToTop = currentCloseToTop;
if (fruits[i].y - fruits[i].radius <= gameOverLine) {
LK.showGameOver();
return;
}
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -165,8 +165,9 @@
var containerTop = 800;
var dropPosition = 1024;
var canDrop = true;
var gameOverLine = containerTop - 100;
+var gameTimer = 60 * 60; // 60 seconds at 60 FPS
// Create container
var container = game.addChild(LK.getAsset('container', {
anchorX: 0.5,
anchorY: 0.5,
@@ -198,8 +199,15 @@
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
+// Create timer display
+var timerTxt = new Text2('60', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+timerTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(timerTxt);
// Create next fruit preview box in top left
var nextFruitBox = game.addChild(LK.getAsset('container', {
anchorX: 0,
anchorY: 0,
@@ -301,8 +309,17 @@
}
});
};
game.update = function () {
+ // Update timer
+ gameTimer--;
+ var seconds = Math.ceil(gameTimer / 60);
+ timerTxt.setText(seconds);
+ // Check if timer ran out
+ if (gameTimer <= 0) {
+ LK.showGameOver();
+ return;
+ }
// Update all fruits
for (var i = fruits.length - 1; i >= 0; i--) {
if (fruits[i] && !fruits[i].hasMerged) {
// Check if fruit still exists (might have been destroyed in merge)