User prompt
Kırpma özelligi içün animasyon ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Çarpışma saglandıktan sonra carpışma alanı dısındaki alanı kes
User prompt
Uygula ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
2 blok yanyana geliyor
User prompt
Blokların hepsi birlikte kayar
User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween.to(bottomBlock, {' Line Number: 150 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Yere 5 blok yerleştikten sonra gelen 6. Blok yerleştiginde alttaki blok bir blok kadar ekrandan aşagı kayar
User prompt
Gerçekçi animasyonlarla degiştir ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Çarpma ve düşme animasyonu ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Olmadıkı yine 2 blok yanyana gelebiliyor ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Çözümü uygula ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyun zemini ekle
User prompt
Hedef kaynagı ekle düzenle
User prompt
Çözüm ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Herşeyi olması gerektigi gibi düzelt ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Çözüm uygula ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Gerekli düzenlemeleri yap
User prompt
Düşme animasyonu sil başka ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Düşme animasyonunu yenisisiyle degiştir ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Mevcut düşme animasyonunu sil Farklı bir düşme animasyonu dene ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Düşme animasyonu ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Çarpışma animasyonu ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Yumuşak geçişler saglar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
5 blok yerleştikten sonra en alttaki bloklar bir blok aşagı kayar bu sürekli devam eder
User prompt
Başlangıcta yerleştirilen 6 bloktan sonra ekran her blok yerleşiminde alttan bir blok siler
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var StackedBlock = Container.expand(function () { var self = Container.call(this); var block = self.attachAsset('block', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ // Game state var stackedBlocks = []; var gameHeight = 2732; var gameWidth = 2048; var groundLevel = gameHeight - 120; var stackHeight = 0; var gameActive = true; // Create foundation block var foundation = new StackedBlock(); foundation.x = gameWidth / 2; foundation.y = gameHeight - 120; // Move to bottom of screen game.addChild(foundation); stackedBlocks.push(foundation); stackHeight = foundation.y; // Create rope hanging from top center var rope = LK.getAsset('rope', { anchorX: 0.5, anchorY: 0 }); rope.x = gameWidth / 2; rope.y = 0; // Rope starts at top of screen game.addChild(rope); // Create swinging block at the end of rope var swingingBlock = LK.getAsset('swingingBlock', { anchorX: 0.5, anchorY: 0.5 }); swingingBlock.x = 0; swingingBlock.y = rope.height + 100; // Extend the rope length by moving block further down rope.addChild(swingingBlock); // Natural pendulum swing variables var swingTime = 0; var swingSpeed = 0.03; // Controls swing speed var swingAmplitude = 0.6; // Controls swing range (max rotation) // Score display var scoreTxt = new Text2('Blocks: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Touch handler to drop the block game.down = function (x, y, obj) { if (!gameActive || !swingingBlock.parent) return; // Get the current world position of the swinging block var worldPos = rope.toGlobal(swingingBlock.position); var gamePos = game.toLocal(worldPos); // Detach from rope and add to game rope.removeChild(swingingBlock); game.addChild(swingingBlock); // Set position in game coordinates swingingBlock.x = gamePos.x; swingingBlock.y = gamePos.y; // Add falling velocity swingingBlock.velocityY = 25; // Start with constant speed swingingBlock.falling = true; }; // Update function for falling blocks game.update = function () { // Update rope swing with natural pendulum motion if (rope && !swingingBlock.falling) { swingTime += swingSpeed; rope.rotation = Math.sin(swingTime) * swingAmplitude; // Add vertical swinging motion to the swinging block var verticalOffset = Math.cos(swingTime * 2) * 30; // Vertical swing with smaller amplitude swingingBlock.y = rope.height + 100 + verticalOffset; } if (swingingBlock.falling) { // Use constant falling speed instead of accelerating gravity swingingBlock.velocityY = 25; // Fixed falling speed swingingBlock.y += swingingBlock.velocityY; // Check collision with any stacked block using built-in intersects method var hasCollision = false; for (var i = 0; i < stackedBlocks.length; i++) { var block = stackedBlocks[i]; if (swingingBlock.intersects(block)) { hasCollision = true; break; } } if (hasCollision) { // Find the topmost block that the swinging block collided with var targetBlock = null; var highestY = gameHeight; for (var k = 0; k < stackedBlocks.length; k++) { if (swingingBlock.intersects(stackedBlocks[k]) && stackedBlocks[k].y < highestY) { targetBlock = stackedBlocks[k]; highestY = stackedBlocks[k].y; } } if (targetBlock) { // Check if block is close enough to the top of the target block to land var blockBottom = swingingBlock.y + swingingBlock.height / 2; var targetTop = targetBlock.y - targetBlock.height / 2; var landingDistance = Math.abs(blockBottom - targetTop); // Only land if we're within reasonable landing distance (less than falling speed) if (landingDistance <= 30) { // Award 1 point LK.setScore(LK.getScore() + 1); scoreTxt.setText('Blocks: ' + LK.getScore()); // Place block exactly on top of target block swingingBlock.falling = false; swingingBlock.velocityY = 0; swingingBlock.y = targetBlock.y - 240; // Place exactly one block height above stackedBlocks.push(swingingBlock); // Update stack height to the new top stackHeight = swingingBlock.y; // After 5 blocks are placed (6th block landing), start sliding bottom blocks down if (LK.getScore() > 5) { // Get the bottom block and animate it sliding down var bottomBlock = stackedBlocks[0]; // Animate the bottom block sliding down by one block height (240px) tween.to(bottomBlock, { y: bottomBlock.y + 240 }, 500, function () { // After animation completes, remove the block bottomBlock.destroy(); }); // Remove from stack array immediately stackedBlocks.splice(0, 1); } // Create new swinging block swingingBlock = LK.getAsset('swingingBlock', { anchorX: 0.5, anchorY: 0.5 }); swingingBlock.x = 0; swingingBlock.y = rope.height + 100; rope.addChild(swingingBlock); } else { // Not close enough to land - continue falling swingingBlock.falling = true; } } } // Check if block has fallen below the screen else if (swingingBlock.y > gameHeight + 200) { // Game over - player missed the target gameActive = false; LK.showGameOver(); } } }; ;
===================================================================
--- original.js
+++ change.js
@@ -83,64 +83,20 @@
swingingBlock.falling = true;
};
// Update function for falling blocks
game.update = function () {
- // Update rope swing with realistic pendulum physics
+ // Update rope swing with natural pendulum motion
if (rope && !swingingBlock.falling) {
swingTime += swingSpeed;
- // Natural pendulum motion with slight dampening
- var pendulumMotion = Math.sin(swingTime) * swingAmplitude;
- rope.rotation = pendulumMotion;
- // Realistic vertical motion based on pendulum physics
- var verticalOffset = Math.abs(Math.cos(swingTime)) * 25; // Natural arc motion
+ rope.rotation = Math.sin(swingTime) * swingAmplitude;
+ // Add vertical swinging motion to the swinging block
+ var verticalOffset = Math.cos(swingTime * 2) * 30; // Vertical swing with smaller amplitude
swingingBlock.y = rope.height + 100 + verticalOffset;
- // Add subtle rope flex effect
- rope.scaleX = 1.0 + Math.abs(pendulumMotion) * 0.1;
- // Block tilts naturally with momentum
- swingingBlock.rotation = pendulumMotion * 0.3;
}
if (swingingBlock.falling) {
// Use constant falling speed instead of accelerating gravity
swingingBlock.velocityY = 25; // Fixed falling speed
swingingBlock.y += swingingBlock.velocityY;
- // Add realistic falling animation effects
- if (!swingingBlock.fallingAnimationStarted) {
- swingingBlock.fallingAnimationStarted = true;
- // Realistic tumbling rotation - slower and more natural
- tween(swingingBlock, {
- rotation: Math.PI * 0.8 + (Math.random() - 0.5) * 0.4
- }, {
- duration: 800,
- easing: tween.easeOut
- });
- // Air resistance effect - slight compression
- tween(swingingBlock, {
- scaleX: 0.95,
- scaleY: 1.05
- }, {
- duration: 300,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- // Return to normal with slight overshoot
- tween(swingingBlock, {
- scaleX: 1.02,
- scaleY: 0.98
- }, {
- duration: 200,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- tween(swingingBlock, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 150,
- easing: tween.easeOut
- });
- }
- });
- }
- });
- }
// Check collision with any stacked block using built-in intersects method
var hasCollision = false;
for (var i = 0; i < stackedBlocks.length; i++) {
var block = stackedBlocks[i];
@@ -168,116 +124,36 @@
if (landingDistance <= 30) {
// Award 1 point
LK.setScore(LK.getScore() + 1);
scoreTxt.setText('Blocks: ' + LK.getScore());
- // Place block exactly on top of target block with smooth transition
+ // Place block exactly on top of target block
swingingBlock.falling = false;
swingingBlock.velocityY = 0;
- var targetLandingY = targetBlock.y - 240; // Calculate landing position
- // Realistic impact animation sequence
- swingingBlock.tint = 0xFFFFFF; // Reset tint first
- // Impact squash effect - compress on landing
- tween(swingingBlock, {
- scaleX: 1.3,
- scaleY: 0.7
- }, {
- duration: 100,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- // Stretch back with overshoot
- tween(swingingBlock, {
- scaleX: 0.9,
- scaleY: 1.1
- }, {
- duration: 150,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- // Settle to normal size
- tween(swingingBlock, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 200,
- easing: tween.elasticOut
- });
- }
- });
- }
- });
- // Impact flash with orange-red color for realism
- tween(swingingBlock, {
- tint: 0xFF8C42
- }, {
- duration: 80,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- // Quick flash to bright then fade to normal
- tween(swingingBlock, {
- tint: 0xFFFFCC
- }, {
- duration: 60,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- tween(swingingBlock, {
- tint: 0xFFFFFF
- }, {
- duration: 200,
- easing: tween.easeOut
- });
- }
- });
- }
- });
- // Realistic landing with multiple bounce phases
- tween(swingingBlock, {
- y: targetLandingY
- }, {
- duration: 400,
- easing: tween.elasticOut
- });
+ swingingBlock.y = targetBlock.y - 240; // Place exactly one block height above
stackedBlocks.push(swingingBlock);
// Update stack height to the new top
stackHeight = swingingBlock.y;
- // After 5 blocks are placed, move all blocks down with realistic weight physics
+ // After 5 blocks are placed (6th block landing), start sliding bottom blocks down
if (LK.getScore() > 5) {
- // Cascade movement - heavier blocks at bottom move first
- for (var m = 0; m < stackedBlocks.length; m++) {
- var targetY = stackedBlocks[m].y + 240;
- var delay = (stackedBlocks.length - m - 1) * 50; // Bottom blocks move first
- // Add slight compression before movement
- tween(stackedBlocks[m], {
- scaleY: 0.95
- }, {
- duration: 100,
- easing: tween.easeOut,
- onFinish: function (blockIndex) {
- return function () {
- // Main movement with weight-based easing
- tween(stackedBlocks[blockIndex], {
- y: targetY,
- scaleY: 1.0
- }, {
- duration: 600 + delay,
- easing: tween.easeInOut
- });
- };
- }(m)
- });
- }
+ // Get the bottom block and animate it sliding down
+ var bottomBlock = stackedBlocks[0];
+ // Animate the bottom block sliding down by one block height (240px)
+ tween.to(bottomBlock, {
+ y: bottomBlock.y + 240
+ }, 500, function () {
+ // After animation completes, remove the block
+ bottomBlock.destroy();
+ });
+ // Remove from stack array immediately
+ stackedBlocks.splice(0, 1);
}
// Create new swinging block
swingingBlock = LK.getAsset('swingingBlock', {
anchorX: 0.5,
anchorY: 0.5
});
swingingBlock.x = 0;
swingingBlock.y = rope.height + 100;
- // Reset animation properties
- swingingBlock.rotation = 0;
- swingingBlock.scaleX = 1.0;
- swingingBlock.scaleY = 1.0;
- swingingBlock.tint = 0xFFFFFF;
- swingingBlock.fallingAnimationStarted = false;
rope.addChild(swingingBlock);
} else {
// Not close enough to land - continue falling
swingingBlock.falling = true;