Code edit (1 edits merged)
Please save this source code
User prompt
Escape the Orca: Shark, Lucky Cat & Tiger's Animated Dash
Initial prompt
Help Shark Lucky Cat And Tiger Is Sturggle To Escape The Orca Belly Like Pregnant And No Inside Of Orca Belly Like Pregnant Just Outside Of Orca Belly Like Pregnant But Shark Lucky Cat Tiger And Orca Have Been Animations
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Lucky Cat: can jump up on tap var LuckyCat = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('luckycat', { anchorX: 0.5, anchorY: 0.5 }); self.abilityCooldown = 0; self.isJumping = false; self.jumpTimer = 0; self.defaultY = 0; self.ability = function () { if (self.abilityCooldown <= 0 && !self.isJumping) { self.isJumping = true; self.jumpTimer = 24; // 0.4s self.abilityCooldown = 60; tween(self, { y: self.defaultY - 180 }, { duration: 200, easing: tween.cubicOut, onFinish: function onFinish() { tween(self, { y: self.defaultY }, { duration: 200, easing: tween.bounceOut, onFinish: function onFinish() { self.isJumping = false; } }); } }); } }; self.update = function () { if (self.abilityCooldown > 0) self.abilityCooldown--; // Paw wave animation body.rotation = Math.sin(LK.ticks / 10) * 0.1; }; return self; }); // Orca: chases the trio, animates lunges var Orca = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('orcaBody', { anchorX: 0.5, anchorY: 0.5 }); var belly = self.attachAsset('orcaBelly', { anchorX: 0.5, anchorY: 0.5, y: 180 }); self.lungeTimer = 0; self.lungeTarget = null; self.lungeProgress = 0; self.baseY = 0; self.lungeSpeed = 6; // pixels per tick self.lungeCooldown = 0; self.lunge = function (target) { if (self.lungeCooldown <= 0) { self.lungeTarget = target; self.lungeTimer = 30; // 0.5s lunge self.lungeProgress = 0; self.lungeCooldown = 60 + Math.floor(Math.random() * 30); // 1-1.5s cooldown } }; self.update = function () { if (self.lungeCooldown > 0) self.lungeCooldown--; // Idle bobbing if (self.lungeTimer <= 0) { self.y = self.baseY + Math.sin(LK.ticks / 20) * 18; } // Lunge logic if (self.lungeTimer > 0 && self.lungeTarget) { self.lungeProgress++; // Move towards target var dx = self.lungeTarget.x - self.x; var dy = self.lungeTarget.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 1) { self.x += dx / dist * self.lungeSpeed; self.y += dy / dist * self.lungeSpeed; } self.lungeTimer--; // After lunge, return to base position if (self.lungeTimer === 0) { tween(self, { x: 1024, y: self.baseY }, { duration: 400, easing: tween.cubicOut }); } } }; return self; }); // Shark: can dash forward on tap var Shark = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('shark', { anchorX: 0.5, anchorY: 0.5 }); self.abilityCooldown = 0; // ticks self.isDashing = false; self.dashTimer = 0; self.defaultY = 0; self.ability = function () { if (self.abilityCooldown <= 0 && !self.isDashing) { self.isDashing = true; self.dashTimer = 18; // 0.3s at 60fps self.abilityCooldown = 60; // 1s cooldown tween(self, { x: self.x + 180 }, { duration: 250, easing: tween.cubicOut, onFinish: function onFinish() { // Dash ends, return to normal self.isDashing = false; } }); } }; self.update = function () { if (self.abilityCooldown > 0) self.abilityCooldown--; if (self.isDashing) { // Slight up-down wiggle for animation self.y = self.defaultY + Math.sin(LK.ticks / 2) * 10; } else { self.y = self.defaultY; } }; return self; }); // Tiger: can roll sideways on swipe var Tiger = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('tiger', { anchorX: 0.5, anchorY: 0.5 }); self.abilityCooldown = 0; self.isRolling = false; self.rollDir = 0; self.defaultX = 0; self.ability = function (dir) { if (self.abilityCooldown <= 0 && !self.isRolling) { self.isRolling = true; self.rollDir = dir; self.abilityCooldown = 60; var targetX = self.x + dir * 200; if (targetX < 400) targetX = 400; if (targetX > 1648) targetX = 1648; tween(self, { x: targetX }, { duration: 250, easing: tween.cubicOut, onFinish: function onFinish() { self.isRolling = false; } }); } }; self.update = function () { if (self.abilityCooldown > 0) self.abilityCooldown--; // Tail wiggle body.rotation = Math.sin(LK.ticks / 8) * 0.08; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x6ec6f7 // light blue, ocean-like }); /**** * Game Code ****/ /* We need simple shapes for the MVP. - Shark: blue ellipse - Lucky Cat: gold ellipse - Tiger: orange ellipse - Orca: large black ellipse with white belly - Tap/Swipe indicators: small white ellipses - Background: none (default) - Sound/Music: none for MVP */ // Game state var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Place orca in center, lower part of screen var orca = new Orca(); orca.x = 1024; orca.baseY = 1800; orca.y = orca.baseY; game.addChild(orca); // Place trio in arc above orca var shark = new Shark(); shark.x = 824; shark.y = 1200; shark.defaultY = shark.y; game.addChild(shark); var luckycat = new LuckyCat(); luckycat.x = 1024; luckycat.y = 1100; luckycat.defaultY = luckycat.y; game.addChild(luckycat); var tiger = new Tiger(); tiger.x = 1224; tiger.y = 1200; tiger.defaultX = tiger.x; game.addChild(tiger); // For swipe detection var swipeStart = null; var swipeChar = null; // Tap indicators (show briefly on tap) var tapIndicators = []; // Helper: show tap indicator at (x, y) function showTapIndicator(x, y) { var ind = LK.getAsset('tapIndicator', { anchorX: 0.5, anchorY: 0.5, x: x, y: y, alpha: 0.7 }); tapIndicators.push({ node: ind, timer: 18 }); game.addChild(ind); } // Helper: update tap indicators function updateTapIndicators() { for (var i = tapIndicators.length - 1; i >= 0; i--) { tapIndicators[i].timer--; tapIndicators[i].node.alpha -= 0.04; if (tapIndicators[i].timer <= 0) { tapIndicators[i].node.destroy(); tapIndicators.splice(i, 1); } } } // Helper: check if orca catches any character function checkCaught() { // If orca's body intersects any character, game over if (orca.intersects(shark) || orca.intersects(luckycat) || orca.intersects(tiger)) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); } } // Helper: update score function updateScore() { score++; scoreTxt.setText(score); } // Main game update game.update = function () { shark.update(); luckycat.update(); tiger.update(); orca.update(); updateTapIndicators(); // Orca AI: every 60 ticks, lunge at random character if (LK.ticks % 60 === 0 && orca.lungeTimer <= 0) { var targets = [shark, luckycat, tiger]; var idx = Math.floor(Math.random() * 3); orca.lunge(targets[idx]); } // Score increases every 30 ticks (0.5s) if (LK.ticks % 30 === 0) { updateScore(); } checkCaught(); }; // Touch/tap/swipe controls game.down = function (x, y, obj) { // Convert to game coordinates // Check which character is tapped var localShark = shark.toLocal({ x: x, y: y }); var localCat = luckycat.toLocal({ x: x, y: y }); var localTiger = tiger.toLocal({ x: x, y: y }); var hit = null; if (Math.abs(localShark.x) < 70 && Math.abs(localShark.y) < 50) { shark.ability(); showTapIndicator(shark.x, shark.y); hit = 'shark'; } else if (Math.abs(localCat.x) < 60 && Math.abs(localCat.y) < 60) { luckycat.ability(); showTapIndicator(luckycat.x, luckycat.y); hit = 'luckycat'; } else if (Math.abs(localTiger.x) < 70 && Math.abs(localTiger.y) < 50) { // For tiger, start swipe swipeStart = { x: x, y: y }; swipeChar = tiger; hit = 'tiger'; } // If not on tiger, clear swipe if (hit !== 'tiger') { swipeStart = null; swipeChar = null; } }; game.move = function (x, y, obj) { // If swiping tiger if (swipeStart && swipeChar) { var dx = x - swipeStart.x; var dy = y - swipeStart.y; if (Math.abs(dx) > 80 && Math.abs(dx) > Math.abs(dy)) { // Left or right swipe var dir = dx > 0 ? 1 : -1; tiger.ability(dir); showTapIndicator(tiger.x, tiger.y); swipeStart = null; swipeChar = null; } } }; game.up = function (x, y, obj) { swipeStart = null; swipeChar = null; }; // Instructions text (centered, fades out after 2s) var instructions = new Text2("Tap Shark or Lucky Cat to use their moves.\nSwipe Tiger left/right to roll.\nSurvive the orca's chase!", { size: 80, fill: "#fff", align: "center" }); instructions.anchor.set(0.5, 0.5); instructions.x = 1024; instructions.y = 400; LK.gui.center.addChild(instructions); tween(instructions, { alpha: 0 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { instructions.destroy(); } });
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,376 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Lucky Cat: can jump up on tap
+var LuckyCat = Container.expand(function () {
+ var self = Container.call(this);
+ var body = self.attachAsset('luckycat', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.abilityCooldown = 0;
+ self.isJumping = false;
+ self.jumpTimer = 0;
+ self.defaultY = 0;
+ self.ability = function () {
+ if (self.abilityCooldown <= 0 && !self.isJumping) {
+ self.isJumping = true;
+ self.jumpTimer = 24; // 0.4s
+ self.abilityCooldown = 60;
+ tween(self, {
+ y: self.defaultY - 180
+ }, {
+ duration: 200,
+ easing: tween.cubicOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ y: self.defaultY
+ }, {
+ duration: 200,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ self.isJumping = false;
+ }
+ });
+ }
+ });
+ }
+ };
+ self.update = function () {
+ if (self.abilityCooldown > 0) self.abilityCooldown--;
+ // Paw wave animation
+ body.rotation = Math.sin(LK.ticks / 10) * 0.1;
+ };
+ return self;
+});
+// Orca: chases the trio, animates lunges
+var Orca = Container.expand(function () {
+ var self = Container.call(this);
+ var body = self.attachAsset('orcaBody', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var belly = self.attachAsset('orcaBelly', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: 180
+ });
+ self.lungeTimer = 0;
+ self.lungeTarget = null;
+ self.lungeProgress = 0;
+ self.baseY = 0;
+ self.lungeSpeed = 6; // pixels per tick
+ self.lungeCooldown = 0;
+ self.lunge = function (target) {
+ if (self.lungeCooldown <= 0) {
+ self.lungeTarget = target;
+ self.lungeTimer = 30; // 0.5s lunge
+ self.lungeProgress = 0;
+ self.lungeCooldown = 60 + Math.floor(Math.random() * 30); // 1-1.5s cooldown
+ }
+ };
+ self.update = function () {
+ if (self.lungeCooldown > 0) self.lungeCooldown--;
+ // Idle bobbing
+ if (self.lungeTimer <= 0) {
+ self.y = self.baseY + Math.sin(LK.ticks / 20) * 18;
+ }
+ // Lunge logic
+ if (self.lungeTimer > 0 && self.lungeTarget) {
+ self.lungeProgress++;
+ // Move towards target
+ var dx = self.lungeTarget.x - self.x;
+ var dy = self.lungeTarget.y - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 1) {
+ self.x += dx / dist * self.lungeSpeed;
+ self.y += dy / dist * self.lungeSpeed;
+ }
+ self.lungeTimer--;
+ // After lunge, return to base position
+ if (self.lungeTimer === 0) {
+ tween(self, {
+ x: 1024,
+ y: self.baseY
+ }, {
+ duration: 400,
+ easing: tween.cubicOut
+ });
+ }
+ }
+ };
+ return self;
+});
+// Shark: can dash forward on tap
+var Shark = Container.expand(function () {
+ var self = Container.call(this);
+ var body = self.attachAsset('shark', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.abilityCooldown = 0; // ticks
+ self.isDashing = false;
+ self.dashTimer = 0;
+ self.defaultY = 0;
+ self.ability = function () {
+ if (self.abilityCooldown <= 0 && !self.isDashing) {
+ self.isDashing = true;
+ self.dashTimer = 18; // 0.3s at 60fps
+ self.abilityCooldown = 60; // 1s cooldown
+ tween(self, {
+ x: self.x + 180
+ }, {
+ duration: 250,
+ easing: tween.cubicOut,
+ onFinish: function onFinish() {
+ // Dash ends, return to normal
+ self.isDashing = false;
+ }
+ });
+ }
+ };
+ self.update = function () {
+ if (self.abilityCooldown > 0) self.abilityCooldown--;
+ if (self.isDashing) {
+ // Slight up-down wiggle for animation
+ self.y = self.defaultY + Math.sin(LK.ticks / 2) * 10;
+ } else {
+ self.y = self.defaultY;
+ }
+ };
+ return self;
+});
+// Tiger: can roll sideways on swipe
+var Tiger = Container.expand(function () {
+ var self = Container.call(this);
+ var body = self.attachAsset('tiger', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.abilityCooldown = 0;
+ self.isRolling = false;
+ self.rollDir = 0;
+ self.defaultX = 0;
+ self.ability = function (dir) {
+ if (self.abilityCooldown <= 0 && !self.isRolling) {
+ self.isRolling = true;
+ self.rollDir = dir;
+ self.abilityCooldown = 60;
+ var targetX = self.x + dir * 200;
+ if (targetX < 400) targetX = 400;
+ if (targetX > 1648) targetX = 1648;
+ tween(self, {
+ x: targetX
+ }, {
+ duration: 250,
+ easing: tween.cubicOut,
+ onFinish: function onFinish() {
+ self.isRolling = false;
+ }
+ });
+ }
+ };
+ self.update = function () {
+ if (self.abilityCooldown > 0) self.abilityCooldown--;
+ // Tail wiggle
+ body.rotation = Math.sin(LK.ticks / 8) * 0.08;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x6ec6f7 // light blue, ocean-like
+});
+
+/****
+* Game Code
+****/
+/*
+We need simple shapes for the MVP.
+- Shark: blue ellipse
+- Lucky Cat: gold ellipse
+- Tiger: orange ellipse
+- Orca: large black ellipse with white belly
+- Tap/Swipe indicators: small white ellipses
+- Background: none (default)
+- Sound/Music: none for MVP
+*/
+// Game state
+var score = 0;
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Place orca in center, lower part of screen
+var orca = new Orca();
+orca.x = 1024;
+orca.baseY = 1800;
+orca.y = orca.baseY;
+game.addChild(orca);
+// Place trio in arc above orca
+var shark = new Shark();
+shark.x = 824;
+shark.y = 1200;
+shark.defaultY = shark.y;
+game.addChild(shark);
+var luckycat = new LuckyCat();
+luckycat.x = 1024;
+luckycat.y = 1100;
+luckycat.defaultY = luckycat.y;
+game.addChild(luckycat);
+var tiger = new Tiger();
+tiger.x = 1224;
+tiger.y = 1200;
+tiger.defaultX = tiger.x;
+game.addChild(tiger);
+// For swipe detection
+var swipeStart = null;
+var swipeChar = null;
+// Tap indicators (show briefly on tap)
+var tapIndicators = [];
+// Helper: show tap indicator at (x, y)
+function showTapIndicator(x, y) {
+ var ind = LK.getAsset('tapIndicator', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: x,
+ y: y,
+ alpha: 0.7
+ });
+ tapIndicators.push({
+ node: ind,
+ timer: 18
+ });
+ game.addChild(ind);
+}
+// Helper: update tap indicators
+function updateTapIndicators() {
+ for (var i = tapIndicators.length - 1; i >= 0; i--) {
+ tapIndicators[i].timer--;
+ tapIndicators[i].node.alpha -= 0.04;
+ if (tapIndicators[i].timer <= 0) {
+ tapIndicators[i].node.destroy();
+ tapIndicators.splice(i, 1);
+ }
+ }
+}
+// Helper: check if orca catches any character
+function checkCaught() {
+ // If orca's body intersects any character, game over
+ if (orca.intersects(shark) || orca.intersects(luckycat) || orca.intersects(tiger)) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ }
+}
+// Helper: update score
+function updateScore() {
+ score++;
+ scoreTxt.setText(score);
+}
+// Main game update
+game.update = function () {
+ shark.update();
+ luckycat.update();
+ tiger.update();
+ orca.update();
+ updateTapIndicators();
+ // Orca AI: every 60 ticks, lunge at random character
+ if (LK.ticks % 60 === 0 && orca.lungeTimer <= 0) {
+ var targets = [shark, luckycat, tiger];
+ var idx = Math.floor(Math.random() * 3);
+ orca.lunge(targets[idx]);
+ }
+ // Score increases every 30 ticks (0.5s)
+ if (LK.ticks % 30 === 0) {
+ updateScore();
+ }
+ checkCaught();
+};
+// Touch/tap/swipe controls
+game.down = function (x, y, obj) {
+ // Convert to game coordinates
+ // Check which character is tapped
+ var localShark = shark.toLocal({
+ x: x,
+ y: y
+ });
+ var localCat = luckycat.toLocal({
+ x: x,
+ y: y
+ });
+ var localTiger = tiger.toLocal({
+ x: x,
+ y: y
+ });
+ var hit = null;
+ if (Math.abs(localShark.x) < 70 && Math.abs(localShark.y) < 50) {
+ shark.ability();
+ showTapIndicator(shark.x, shark.y);
+ hit = 'shark';
+ } else if (Math.abs(localCat.x) < 60 && Math.abs(localCat.y) < 60) {
+ luckycat.ability();
+ showTapIndicator(luckycat.x, luckycat.y);
+ hit = 'luckycat';
+ } else if (Math.abs(localTiger.x) < 70 && Math.abs(localTiger.y) < 50) {
+ // For tiger, start swipe
+ swipeStart = {
+ x: x,
+ y: y
+ };
+ swipeChar = tiger;
+ hit = 'tiger';
+ }
+ // If not on tiger, clear swipe
+ if (hit !== 'tiger') {
+ swipeStart = null;
+ swipeChar = null;
+ }
+};
+game.move = function (x, y, obj) {
+ // If swiping tiger
+ if (swipeStart && swipeChar) {
+ var dx = x - swipeStart.x;
+ var dy = y - swipeStart.y;
+ if (Math.abs(dx) > 80 && Math.abs(dx) > Math.abs(dy)) {
+ // Left or right swipe
+ var dir = dx > 0 ? 1 : -1;
+ tiger.ability(dir);
+ showTapIndicator(tiger.x, tiger.y);
+ swipeStart = null;
+ swipeChar = null;
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ swipeStart = null;
+ swipeChar = null;
+};
+// Instructions text (centered, fades out after 2s)
+var instructions = new Text2("Tap Shark or Lucky Cat to use their moves.\nSwipe Tiger left/right to roll.\nSurvive the orca's chase!", {
+ size: 80,
+ fill: "#fff",
+ align: "center"
+});
+instructions.anchor.set(0.5, 0.5);
+instructions.x = 1024;
+instructions.y = 400;
+LK.gui.center.addChild(instructions);
+tween(instructions, {
+ alpha: 0
+}, {
+ duration: 2000,
+ easing: tween.linear,
+ onFinish: function onFinish() {
+ instructions.destroy();
+ }
});
\ No newline at end of file