/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Hamster (player) class
var Hamster = Container.expand(function () {
var self = Container.call(this);
var hamsterSprite = self.attachAsset('hamster', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = hamsterSprite.width * 0.5;
// For collision, use self.x, self.y, self.radius
// No per-instance update needed; movement is handled by drag
return self;
});
// Hazard (spike) class
var Hazard = Container.expand(function () {
var self = Container.call(this);
var hazardSprite = self.attachAsset('hazard', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = hazardSprite.width * 0.5;
return self;
});
// Mat (platform) class
var Mat = Container.expand(function () {
var self = Container.call(this);
var matSprite = self.attachAsset('mat', {
anchorX: 0,
anchorY: 0
});
self.width = matSprite.width;
self.height = matSprite.height;
// Each mat can have hazards and treats as children
self.hazards = [];
self.treats = [];
// Used for vertical scrolling
self.speed = 8;
// Update method for scrolling
self.update = function () {
self.y += self.speed;
// Move hazards and treats with the mat
for (var i = 0; i < self.hazards.length; i++) {
self.hazards[i].y += self.speed;
}
for (var i = 0; i < self.treats.length; i++) {
self.treats[i].y += self.speed;
}
};
return self;
});
// Treat (collectible) class
var Treat = Container.expand(function () {
var self = Container.call(this);
var treatSprite = self.attachAsset('treat', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = treatSprite.width * 0.5;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf7f7f7
});
/****
* Game Code
****/
// Sound effects
// Treat (collectible)
// Hazard (spike)
// Mat (platform)
// Hamster (player)
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var MAT_HEIGHT = 220;
var MAT_GAP = 60;
var HAMSTER_START_X = GAME_WIDTH / 2;
var HAMSTER_START_Y = GAME_HEIGHT - 500;
var MIN_HAZARDS = 1;
var MAX_HAZARDS = 3;
var MIN_TREATS = 1;
var MAX_TREATS = 2;
var MAT_SCROLL_BASE = 8;
var MAT_SCROLL_INC = 0.5; // Speed increase per 10 points
// Game state
var mats = [];
var hamster = null;
var dragNode = null;
var lastPointer = {
x: 0,
y: 0
};
var scoreTxt = null;
var score = 0;
var gameOver = false;
var matSpawnY = 0;
var lastMatY = 0;
var matSpeed = MAT_SCROLL_BASE;
// --- Score display ---
scoreTxt = new Text2('0', {
size: 120,
fill: 0x222222
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// --- Hamster ---
hamster = new Hamster();
hamster.x = HAMSTER_START_X;
hamster.y = HAMSTER_START_Y;
game.addChild(hamster);
// --- Mat spawning ---
function spawnMat(yPos, speed) {
var mat = new Mat();
mat.y = yPos;
mat.x = 0;
mat.speed = speed;
// Hazards
var hazardCount = MIN_HAZARDS + Math.floor(Math.random() * (MAX_HAZARDS - MIN_HAZARDS + 1));
for (var i = 0; i < hazardCount; i++) {
var hazard = new Hazard();
// Place hazard randomly, but not too close to the edge
var margin = 200;
hazard.x = margin + Math.random() * (GAME_WIDTH - 2 * margin);
hazard.y = mat.y + MAT_HEIGHT / 2;
mat.hazards.push(hazard);
game.addChild(hazard);
}
// Treats
var treatCount = MIN_TREATS + Math.floor(Math.random() * (MAX_TREATS - MIN_TREATS + 1));
for (var i = 0; i < treatCount; i++) {
var treat = new Treat();
// Place treat randomly, not overlapping hazards
var margin = 200;
var valid = false;
var tx = 0;
while (!valid) {
tx = margin + Math.random() * (GAME_WIDTH - 2 * margin);
valid = true;
for (var j = 0; j < mat.hazards.length; j++) {
if (Math.abs(mat.hazards[j].x - tx) < 180) {
valid = false;
break;
}
}
}
treat.x = tx;
treat.y = mat.y + MAT_HEIGHT / 2;
mat.treats.push(treat);
game.addChild(treat);
}
mats.push(mat);
game.addChild(mat);
lastMatY = mat.y;
}
// --- Initial mats ---
matSpawnY = GAME_HEIGHT - MAT_HEIGHT;
while (matSpawnY > -MAT_HEIGHT) {
spawnMat(matSpawnY, matSpeed);
matSpawnY -= MAT_HEIGHT + MAT_GAP;
}
// --- Drag controls ---
game.down = function (x, y, obj) {
// Only allow drag if not game over
if (gameOver) return;
// Only start drag if touch is on hamster
var dx = x - hamster.x;
var dy = y - hamster.y;
if (dx * dx + dy * dy < hamster.radius * hamster.radius) {
dragNode = hamster;
lastPointer.x = x;
lastPointer.y = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.move = function (x, y, obj) {
if (gameOver) return;
if (dragNode) {
// Clamp hamster to game area
var nx = x;
var ny = y;
var r = hamster.radius;
if (nx < r) nx = r;
if (nx > GAME_WIDTH - r) nx = GAME_WIDTH - r;
if (ny < r + 100) ny = r + 100; // Don't allow top 100px (menu)
if (ny > GAME_HEIGHT - r) ny = GAME_HEIGHT - r;
hamster.x = nx;
hamster.y = ny;
}
};
// --- Collision detection ---
function circleIntersect(ax, ay, ar, bx, by, br) {
var dx = ax - bx;
var dy = ay - by;
var dist = dx * dx + dy * dy;
var rad = ar + br;
return dist < rad * rad;
}
// --- Game update ---
game.update = function () {
if (gameOver) return;
// Increase mat speed as score increases
matSpeed = MAT_SCROLL_BASE + MAT_SCROLL_INC * Math.floor(score / 10);
// Move mats, hazards, treats
for (var i = mats.length - 1; i >= 0; i--) {
var mat = mats[i];
mat.speed = matSpeed;
mat.update();
// Remove mats that are off screen
if (mat.y > GAME_HEIGHT) {
// Remove hazards and treats
for (var h = 0; h < mat.hazards.length; h++) {
mat.hazards[h].destroy();
}
for (var t = 0; t < mat.treats.length; t++) {
mat.treats[t].destroy();
}
mat.destroy();
mats.splice(i, 1);
}
}
// Spawn new mat if needed
var topMatY = mats.length > 0 ? mats[0].y : GAME_HEIGHT;
if (topMatY > -MAT_HEIGHT - MAT_GAP) {
spawnMat(topMatY - MAT_HEIGHT - MAT_GAP, matSpeed);
}
// --- Collisions ---
// Hazards
for (var i = 0; i < mats.length; i++) {
var mat = mats[i];
for (var h = 0; h < mat.hazards.length; h++) {
var hazard = mat.hazards[h];
if (!hazard._hit && circleIntersect(hamster.x, hamster.y, hamster.radius * 0.7, hazard.x, hazard.y, hazard.radius * 0.8)) {
hazard._hit = true;
// Flash hamster red
LK.effects.flashObject(hamster, 0xff0000, 400);
LK.getSound('hit').play();
// End game
gameOver = true;
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Treats
for (var t = mat.treats.length - 1; t >= 0; t--) {
var treat = mat.treats[t];
if (!treat._collected && circleIntersect(hamster.x, hamster.y, hamster.radius * 0.7, treat.x, treat.y, treat.radius * 0.8)) {
treat._collected = true;
LK.getSound('collect').play();
// Animate treat
tween(treat, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
treat.destroy();
}
});
mat.treats.splice(t, 1);
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
}
}
}
};
// --- Reset on game over ---
LK.on('gameover', function () {
// Clean up all mats, hazards, treats
for (var i = 0; i < mats.length; i++) {
var mat = mats[i];
for (var h = 0; h < mat.hazards.length; h++) {
mat.hazards[h].destroy();
}
for (var t = 0; t < mat.treats.length; t++) {
mat.treats[t].destroy();
}
mat.destroy();
}
mats = [];
// Remove hamster
hamster.destroy();
// Reset score
score = 0;
LK.setScore(0);
scoreTxt.setText('0');
gameOver = false;
// Respawn hamster
hamster = new Hamster();
hamster.x = HAMSTER_START_X;
hamster.y = HAMSTER_START_Y;
game.addChild(hamster);
// Respawn mats
matSpawnY = GAME_HEIGHT - MAT_HEIGHT;
while (matSpawnY > -MAT_HEIGHT) {
spawnMat(matSpawnY, MAT_SCROLL_BASE);
matSpawnY -= MAT_HEIGHT + MAT_GAP;
}
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,315 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Hamster (player) class
+var Hamster = Container.expand(function () {
+ var self = Container.call(this);
+ var hamsterSprite = self.attachAsset('hamster', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = hamsterSprite.width * 0.5;
+ // For collision, use self.x, self.y, self.radius
+ // No per-instance update needed; movement is handled by drag
+ return self;
+});
+// Hazard (spike) class
+var Hazard = Container.expand(function () {
+ var self = Container.call(this);
+ var hazardSprite = self.attachAsset('hazard', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = hazardSprite.width * 0.5;
+ return self;
+});
+// Mat (platform) class
+var Mat = Container.expand(function () {
+ var self = Container.call(this);
+ var matSprite = self.attachAsset('mat', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.width = matSprite.width;
+ self.height = matSprite.height;
+ // Each mat can have hazards and treats as children
+ self.hazards = [];
+ self.treats = [];
+ // Used for vertical scrolling
+ self.speed = 8;
+ // Update method for scrolling
+ self.update = function () {
+ self.y += self.speed;
+ // Move hazards and treats with the mat
+ for (var i = 0; i < self.hazards.length; i++) {
+ self.hazards[i].y += self.speed;
+ }
+ for (var i = 0; i < self.treats.length; i++) {
+ self.treats[i].y += self.speed;
+ }
+ };
+ return self;
+});
+// Treat (collectible) class
+var Treat = Container.expand(function () {
+ var self = Container.call(this);
+ var treatSprite = self.attachAsset('treat', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = treatSprite.width * 0.5;
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0xf7f7f7
+});
+
+/****
+* Game Code
+****/
+// Sound effects
+// Treat (collectible)
+// Hazard (spike)
+// Mat (platform)
+// Hamster (player)
+// Game constants
+var GAME_WIDTH = 2048;
+var GAME_HEIGHT = 2732;
+var MAT_HEIGHT = 220;
+var MAT_GAP = 60;
+var HAMSTER_START_X = GAME_WIDTH / 2;
+var HAMSTER_START_Y = GAME_HEIGHT - 500;
+var MIN_HAZARDS = 1;
+var MAX_HAZARDS = 3;
+var MIN_TREATS = 1;
+var MAX_TREATS = 2;
+var MAT_SCROLL_BASE = 8;
+var MAT_SCROLL_INC = 0.5; // Speed increase per 10 points
+// Game state
+var mats = [];
+var hamster = null;
+var dragNode = null;
+var lastPointer = {
+ x: 0,
+ y: 0
+};
+var scoreTxt = null;
+var score = 0;
+var gameOver = false;
+var matSpawnY = 0;
+var lastMatY = 0;
+var matSpeed = MAT_SCROLL_BASE;
+// --- Score display ---
+scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0x222222
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// --- Hamster ---
+hamster = new Hamster();
+hamster.x = HAMSTER_START_X;
+hamster.y = HAMSTER_START_Y;
+game.addChild(hamster);
+// --- Mat spawning ---
+function spawnMat(yPos, speed) {
+ var mat = new Mat();
+ mat.y = yPos;
+ mat.x = 0;
+ mat.speed = speed;
+ // Hazards
+ var hazardCount = MIN_HAZARDS + Math.floor(Math.random() * (MAX_HAZARDS - MIN_HAZARDS + 1));
+ for (var i = 0; i < hazardCount; i++) {
+ var hazard = new Hazard();
+ // Place hazard randomly, but not too close to the edge
+ var margin = 200;
+ hazard.x = margin + Math.random() * (GAME_WIDTH - 2 * margin);
+ hazard.y = mat.y + MAT_HEIGHT / 2;
+ mat.hazards.push(hazard);
+ game.addChild(hazard);
+ }
+ // Treats
+ var treatCount = MIN_TREATS + Math.floor(Math.random() * (MAX_TREATS - MIN_TREATS + 1));
+ for (var i = 0; i < treatCount; i++) {
+ var treat = new Treat();
+ // Place treat randomly, not overlapping hazards
+ var margin = 200;
+ var valid = false;
+ var tx = 0;
+ while (!valid) {
+ tx = margin + Math.random() * (GAME_WIDTH - 2 * margin);
+ valid = true;
+ for (var j = 0; j < mat.hazards.length; j++) {
+ if (Math.abs(mat.hazards[j].x - tx) < 180) {
+ valid = false;
+ break;
+ }
+ }
+ }
+ treat.x = tx;
+ treat.y = mat.y + MAT_HEIGHT / 2;
+ mat.treats.push(treat);
+ game.addChild(treat);
+ }
+ mats.push(mat);
+ game.addChild(mat);
+ lastMatY = mat.y;
+}
+// --- Initial mats ---
+matSpawnY = GAME_HEIGHT - MAT_HEIGHT;
+while (matSpawnY > -MAT_HEIGHT) {
+ spawnMat(matSpawnY, matSpeed);
+ matSpawnY -= MAT_HEIGHT + MAT_GAP;
+}
+// --- Drag controls ---
+game.down = function (x, y, obj) {
+ // Only allow drag if not game over
+ if (gameOver) return;
+ // Only start drag if touch is on hamster
+ var dx = x - hamster.x;
+ var dy = y - hamster.y;
+ if (dx * dx + dy * dy < hamster.radius * hamster.radius) {
+ dragNode = hamster;
+ lastPointer.x = x;
+ lastPointer.y = y;
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+game.move = function (x, y, obj) {
+ if (gameOver) return;
+ if (dragNode) {
+ // Clamp hamster to game area
+ var nx = x;
+ var ny = y;
+ var r = hamster.radius;
+ if (nx < r) nx = r;
+ if (nx > GAME_WIDTH - r) nx = GAME_WIDTH - r;
+ if (ny < r + 100) ny = r + 100; // Don't allow top 100px (menu)
+ if (ny > GAME_HEIGHT - r) ny = GAME_HEIGHT - r;
+ hamster.x = nx;
+ hamster.y = ny;
+ }
+};
+// --- Collision detection ---
+function circleIntersect(ax, ay, ar, bx, by, br) {
+ var dx = ax - bx;
+ var dy = ay - by;
+ var dist = dx * dx + dy * dy;
+ var rad = ar + br;
+ return dist < rad * rad;
+}
+// --- Game update ---
+game.update = function () {
+ if (gameOver) return;
+ // Increase mat speed as score increases
+ matSpeed = MAT_SCROLL_BASE + MAT_SCROLL_INC * Math.floor(score / 10);
+ // Move mats, hazards, treats
+ for (var i = mats.length - 1; i >= 0; i--) {
+ var mat = mats[i];
+ mat.speed = matSpeed;
+ mat.update();
+ // Remove mats that are off screen
+ if (mat.y > GAME_HEIGHT) {
+ // Remove hazards and treats
+ for (var h = 0; h < mat.hazards.length; h++) {
+ mat.hazards[h].destroy();
+ }
+ for (var t = 0; t < mat.treats.length; t++) {
+ mat.treats[t].destroy();
+ }
+ mat.destroy();
+ mats.splice(i, 1);
+ }
+ }
+ // Spawn new mat if needed
+ var topMatY = mats.length > 0 ? mats[0].y : GAME_HEIGHT;
+ if (topMatY > -MAT_HEIGHT - MAT_GAP) {
+ spawnMat(topMatY - MAT_HEIGHT - MAT_GAP, matSpeed);
+ }
+ // --- Collisions ---
+ // Hazards
+ for (var i = 0; i < mats.length; i++) {
+ var mat = mats[i];
+ for (var h = 0; h < mat.hazards.length; h++) {
+ var hazard = mat.hazards[h];
+ if (!hazard._hit && circleIntersect(hamster.x, hamster.y, hamster.radius * 0.7, hazard.x, hazard.y, hazard.radius * 0.8)) {
+ hazard._hit = true;
+ // Flash hamster red
+ LK.effects.flashObject(hamster, 0xff0000, 400);
+ LK.getSound('hit').play();
+ // End game
+ gameOver = true;
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Treats
+ for (var t = mat.treats.length - 1; t >= 0; t--) {
+ var treat = mat.treats[t];
+ if (!treat._collected && circleIntersect(hamster.x, hamster.y, hamster.radius * 0.7, treat.x, treat.y, treat.radius * 0.8)) {
+ treat._collected = true;
+ LK.getSound('collect').play();
+ // Animate treat
+ tween(treat, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ treat.destroy();
+ }
+ });
+ mat.treats.splice(t, 1);
+ score += 1;
+ LK.setScore(score);
+ scoreTxt.setText(score);
+ }
+ }
+ }
+};
+// --- Reset on game over ---
+LK.on('gameover', function () {
+ // Clean up all mats, hazards, treats
+ for (var i = 0; i < mats.length; i++) {
+ var mat = mats[i];
+ for (var h = 0; h < mat.hazards.length; h++) {
+ mat.hazards[h].destroy();
+ }
+ for (var t = 0; t < mat.treats.length; t++) {
+ mat.treats[t].destroy();
+ }
+ mat.destroy();
+ }
+ mats = [];
+ // Remove hamster
+ hamster.destroy();
+ // Reset score
+ score = 0;
+ LK.setScore(0);
+ scoreTxt.setText('0');
+ gameOver = false;
+ // Respawn hamster
+ hamster = new Hamster();
+ hamster.x = HAMSTER_START_X;
+ hamster.y = HAMSTER_START_Y;
+ game.addChild(hamster);
+ // Respawn mats
+ matSpawnY = GAME_HEIGHT - MAT_HEIGHT;
+ while (matSpawnY > -MAT_HEIGHT) {
+ spawnMat(matSpawnY, MAT_SCROLL_BASE);
+ matSpawnY -= MAT_HEIGHT + MAT_GAP;
+ }
});
\ No newline at end of file
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Hamster vs Mat" and with the description "Drag to move the hamster across scrolling mats, dodging hazards and collecting treats for points. Survive as long as possible!". No text on banner!
Matematikteki artı sembolü. In-Game asset. 2d. High contrast. no shadow
beyaz renk yerine sarı bir rengi olsun