/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.collected = false;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
var Rock = Container.expand(function () {
var self = Container.call(this);
var rockGraphics = self.attachAsset('rock', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Shark = Container.expand(function () {
var self = Container.call(this);
var sharkGraphics = self.attachAsset('shark', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.horizontalSpeed = 2;
self.direction = Math.random() > 0.5 ? 1 : -1;
self.attacking = false;
self.lastSurferDistance = 1000;
self.update = function () {
self.y += self.speed;
// Horizontal movement
self.x += self.horizontalSpeed * self.direction;
// Bounce off screen edges
if (self.x < 100) {
self.direction = 1;
} else if (self.x > 1948) {
self.direction = -1;
}
// Check distance to surfer for attack behavior
if (surfer) {
var currentDistance = Math.abs(self.x - surfer.x) + Math.abs(self.y - surfer.y);
// Attack when getting closer to surfer
if (currentDistance < 200 && !self.attacking) {
self.attacking = true;
// Speed up towards surfer
self.speed = 6;
self.horizontalSpeed = 4;
// Move towards surfer horizontally
if (surfer.x > self.x) {
self.direction = 1;
} else {
self.direction = -1;
}
// Play attack sound
LK.getSound('shark_attack').play();
// Flash red to indicate danger
LK.effects.flashObject(self, 0xff0000, 500);
}
self.lastSurferDistance = currentDistance;
}
};
return self;
});
var Surfer = Container.expand(function () {
var self = Container.call(this);
var surferGraphics = self.attachAsset('surfer', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetX = 2048 / 2;
self.moveSpeed = 8;
self.update = function () {
var dx = self.targetX - self.x;
if (Math.abs(dx) > 2) {
self.x += dx * 0.15;
}
;
self.rotation = dx * 0.002;
};
return self;
});
var Wave = Container.expand(function () {
var self = Container.call(this);
var waveGraphics = self.attachAsset('wave', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0066cc
});
/****
* Game Code
****/
var surfer;
var waves = [];
var rocks = [];
var powerups = [];
var sharks = [];
var distance = 0;
var gameSpeed = 4;
var isDragging = false;
var lastWaveSpawn = 0;
var lastRockSpawn = 0;
var lastPowerUpSpawn = 0;
var lastSharkSpawn = 0;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: '#ffffff'
});
scoreText.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreText);
scoreText.x = 120; // Offset from top-left to avoid menu icon
var distanceText = new Text2('Distance: 0', {
size: 50,
fill: '#ffffff'
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
// Create surfer
surfer = game.addChild(new Surfer());
surfer.x = 2048 / 2;
surfer.y = 2200;
// Spawn functions
function spawnWave() {
var wave = new Wave();
wave.x = Math.random() * 1800 + 124;
wave.y = -100;
waves.push(wave);
game.addChild(wave);
}
function spawnRock() {
var rock = new Rock();
rock.x = Math.random() * 1800 + 124;
rock.y = -100;
rocks.push(rock);
game.addChild(rock);
}
function spawnPowerUp() {
var powerup = new PowerUp();
powerup.x = Math.random() * 1800 + 124;
powerup.y = -100;
powerups.push(powerup);
game.addChild(powerup);
}
function spawnShark() {
var shark = new Shark();
shark.x = Math.random() * 1600 + 224;
shark.y = -150;
sharks.push(shark);
game.addChild(shark);
}
// Input handling
game.down = function (x, y, obj) {
isDragging = true;
surfer.targetX = x;
};
game.move = function (x, y, obj) {
if (isDragging) {
surfer.targetX = Math.max(100, Math.min(1948, x));
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Main game loop
game.update = function () {
distance += gameSpeed;
// Increase difficulty over time
if (LK.ticks % 600 === 0) {
gameSpeed += 0.2;
}
// Spawn waves
if (LK.ticks - lastWaveSpawn > 90 - gameSpeed * 2) {
spawnWave();
lastWaveSpawn = LK.ticks;
}
// Spawn rocks
if (LK.ticks - lastRockSpawn > 180 - gameSpeed * 3) {
spawnRock();
lastRockSpawn = LK.ticks;
}
// Spawn power-ups
if (LK.ticks - lastPowerUpSpawn > 300) {
spawnPowerUp();
lastPowerUpSpawn = LK.ticks;
}
// Spawn sharks
if (LK.ticks - lastSharkSpawn > 450 - gameSpeed * 2) {
spawnShark();
lastSharkSpawn = LK.ticks;
}
// Update waves
for (var i = waves.length - 1; i >= 0; i--) {
var wave = waves[i];
wave.speed = gameSpeed;
if (wave.y > 2832) {
wave.destroy();
waves.splice(i, 1);
}
}
// Update and check collisions for rocks
for (var j = rocks.length - 1; j >= 0; j--) {
var rock = rocks[j];
rock.speed = gameSpeed;
if (rock.y > 2832) {
rock.destroy();
rocks.splice(j, 1);
continue;
}
// Collision with surfer
if (surfer.intersects(rock)) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Update and check collisions for power-ups
for (var k = powerups.length - 1; k >= 0; k--) {
var powerup = powerups[k];
powerup.speed = gameSpeed;
if (powerup.y > 2832) {
powerup.destroy();
powerups.splice(k, 1);
continue;
}
// Collection by surfer
if (!powerup.collected && surfer.intersects(powerup)) {
powerup.collected = true;
LK.setScore(LK.getScore() + 50);
LK.getSound('collect').play();
// Fade out effect
tween(powerup, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
powerup.destroy();
}
});
powerups.splice(k, 1);
}
}
// Update and check collisions for sharks
for (var s = sharks.length - 1; s >= 0; s--) {
var shark = sharks[s];
shark.speed = Math.max(shark.speed, gameSpeed);
if (shark.y > 2832) {
shark.destroy();
sharks.splice(s, 1);
continue;
}
// Collision with surfer
if (surfer.intersects(shark)) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// Update score based on distance
if (LK.ticks % 10 === 0) {
LK.setScore(LK.getScore() + 1);
}
// Update UI
scoreText.setText('Score: ' + LK.getScore());
distanceText.setText('Distance: ' + Math.floor(distance / 10) + 'm');
}; ===================================================================
--- original.js
+++ change.js
@@ -31,8 +31,54 @@
self.y += self.speed;
};
return self;
});
+var Shark = Container.expand(function () {
+ var self = Container.call(this);
+ var sharkGraphics = self.attachAsset('shark', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.horizontalSpeed = 2;
+ self.direction = Math.random() > 0.5 ? 1 : -1;
+ self.attacking = false;
+ self.lastSurferDistance = 1000;
+ self.update = function () {
+ self.y += self.speed;
+ // Horizontal movement
+ self.x += self.horizontalSpeed * self.direction;
+ // Bounce off screen edges
+ if (self.x < 100) {
+ self.direction = 1;
+ } else if (self.x > 1948) {
+ self.direction = -1;
+ }
+ // Check distance to surfer for attack behavior
+ if (surfer) {
+ var currentDistance = Math.abs(self.x - surfer.x) + Math.abs(self.y - surfer.y);
+ // Attack when getting closer to surfer
+ if (currentDistance < 200 && !self.attacking) {
+ self.attacking = true;
+ // Speed up towards surfer
+ self.speed = 6;
+ self.horizontalSpeed = 4;
+ // Move towards surfer horizontally
+ if (surfer.x > self.x) {
+ self.direction = 1;
+ } else {
+ self.direction = -1;
+ }
+ // Play attack sound
+ LK.getSound('shark_attack').play();
+ // Flash red to indicate danger
+ LK.effects.flashObject(self, 0xff0000, 500);
+ }
+ self.lastSurferDistance = currentDistance;
+ }
+ };
+ return self;
+});
var Surfer = Container.expand(function () {
var self = Container.call(this);
var surferGraphics = self.attachAsset('surfer', {
anchorX: 0.5,
@@ -44,9 +90,9 @@
var dx = self.targetX - self.x;
if (Math.abs(dx) > 2) {
self.x += dx * 0.15;
}
- // Add slight rotation based on movement
+ ;
self.rotation = dx * 0.002;
};
return self;
});
@@ -76,14 +122,16 @@
var surfer;
var waves = [];
var rocks = [];
var powerups = [];
+var sharks = [];
var distance = 0;
var gameSpeed = 4;
var isDragging = false;
var lastWaveSpawn = 0;
var lastRockSpawn = 0;
var lastPowerUpSpawn = 0;
+var lastSharkSpawn = 0;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: '#ffffff'
@@ -122,8 +170,15 @@
powerup.y = -100;
powerups.push(powerup);
game.addChild(powerup);
}
+function spawnShark() {
+ var shark = new Shark();
+ shark.x = Math.random() * 1600 + 224;
+ shark.y = -150;
+ sharks.push(shark);
+ game.addChild(shark);
+}
// Input handling
game.down = function (x, y, obj) {
isDragging = true;
surfer.targetX = x;
@@ -157,8 +212,13 @@
if (LK.ticks - lastPowerUpSpawn > 300) {
spawnPowerUp();
lastPowerUpSpawn = LK.ticks;
}
+ // Spawn sharks
+ if (LK.ticks - lastSharkSpawn > 450 - gameSpeed * 2) {
+ spawnShark();
+ lastSharkSpawn = LK.ticks;
+ }
// Update waves
for (var i = waves.length - 1; i >= 0; i--) {
var wave = waves[i];
wave.speed = gameSpeed;
@@ -211,8 +271,25 @@
});
powerups.splice(k, 1);
}
}
+ // Update and check collisions for sharks
+ for (var s = sharks.length - 1; s >= 0; s--) {
+ var shark = sharks[s];
+ shark.speed = Math.max(shark.speed, gameSpeed);
+ if (shark.y > 2832) {
+ shark.destroy();
+ sharks.splice(s, 1);
+ continue;
+ }
+ // Collision with surfer
+ if (surfer.intersects(shark)) {
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
// Update score based on distance
if (LK.ticks % 10 === 0) {
LK.setScore(LK.getScore() + 1);
}