User prompt
karakter öldüğünde level 1'den başlansın
User prompt
karakter öldüğünde level 1'den başlasın
User prompt
arti varlıkları karakterin dibinde doğmasın
User prompt
karakter 30 saniye boyunca ölmez ise level 2 ye geçsin
User prompt
sol üst köşede bir level sayacı olsun
User prompt
karakter 15 saniye boyunca hareket etmez ise karakter ölsün
User prompt
arti varlıkları zeminde oluşmaya sonsuza dek devam etsin
User prompt
karakter ölünce sayaç sıfırlansın ve arti varlıkları gelmeye her zaman devam etsin
User prompt
30 saniyelik sayaç ve arti varlıklarının gelmesi oyun bitince ve tekrar başla butonuna basınca bile devam etsin
User prompt
karakter öldükten sonra her şey yeniden başlasın ve arti varlıkları gelmeye devam etsin
User prompt
karakter öldükten sonra arti varlıkları gelmeye devam etsin
User prompt
30 saniyelik süre karakter ölünce sıfırlansın
User prompt
yukarıda bir 30 saniye sayacı olsun
User prompt
eğer karakter 30 saniye boyunca ölmezse level atlasın
User prompt
arti varlıkları daha hızlı gelsin
User prompt
zeminde arti olarak adlandırdığım varlık gelsin ve karakter arti varlığına değdiğinde oyun bitsin
User prompt
zeminde arti olarak adlandırdığım varlık gelsin ve 3 saniye sonra gitsin. karakter ona değdiğinde karakter ölsün
User prompt
kamera karakteri takip etmesin
User prompt
kamera karakter ile birlikte hareket etsin
User prompt
karakter haraket edebilsin
User prompt
çimen ve hamster dışında tüm varlıkları sil
User prompt
karakter hep ölüp durmasın
User prompt
çimenli bir arazi olsun
User prompt
arka planda çimen olsun
User prompt
arka plan çimenli olsun ve sonsuz olsun
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Arti (hazard) class
var Arti = Container.expand(function () {
var self = Container.call(this);
var artiSprite = self.attachAsset('Arti', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = artiSprite.width * 0.5;
self.lifetime = 180; // 3 seconds at 60fps
self.update = function () {
if (self.lifetime > 0) {
self.lifetime--;
if (self.lifetime === 0) {
if (self.parent) self.parent.removeChild(self);
self.destroy();
}
}
// Track last position for possible future use
if (self.lastX === undefined) self.lastX = self.x;
if (self.lastY === undefined) self.lastY = self.y;
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
// 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;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xffffff
});
/****
* Game Code
****/
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var HAMSTER_START_X = GAME_WIDTH / 2;
var HAMSTER_START_Y = GAME_HEIGHT - 500;
// --- Persistent game state (persists across game restarts) ---
if (typeof artiList === "undefined") {
artiList = [];
}
if (typeof artiSpawnTimer === "undefined") {
artiSpawnTimer = 0;
}
if (typeof levelTimerTicks === "undefined") {
levelTimerTicks = 0;
}
if (typeof levelCompleted === "undefined") {
levelCompleted = false;
}
// --- Level timer display ---
var timerText = new Text2("30", {
size: 120,
fill: 0x222222
});
timerText.anchor.set(0.5, 0); // center top
LK.gui.top.addChild(timerText);
// --- Level counter display (top left, avoid 100x100 menu area) ---
if (typeof levelNumber === "undefined") {
levelNumber = 1;
}
var levelText = new Text2("Level " + levelNumber, {
size: 100,
fill: 0x222222
});
levelText.anchor.set(0, 0); // top left
levelText.x = 120; // leave space for menu
levelText.y = 10;
LK.gui.addChild(levelText);
// Camera state
var cameraOffsetX = 0;
var cameraOffsetY = 0;
// Game state
var hamster = null;
var dragNode = null;
// --- Inactivity timer for hamster ---
if (typeof hamsterLastMoveTick === "undefined") {
hamsterLastMoveTick = 0;
}
if (typeof hamsterDeadByInactivity === "undefined") {
hamsterDeadByInactivity = false;
}
// --- Infinite grass background ---
var bgGrass1 = LK.getAsset('grass', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
var bgGrass2 = LK.getAsset('grass', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
bgGrass1.y = 0;
bgGrass2.y = -GAME_HEIGHT;
game.addChild(bgGrass1);
game.addChild(bgGrass2);
// --- Hamster ---
// Allow dragging hamster from anywhere on the screen
hamster = new Hamster();
hamster.x = HAMSTER_START_X;
hamster.y = HAMSTER_START_Y;
game.addChild(hamster);
game.down = function (x, y, obj) {
dragNode = hamster;
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.move = function (x, y, obj) {
if (dragNode) {
// No camera offset needed; use screen coordinates directly
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;
// Reset inactivity timer on move
hamsterLastMoveTick = levelTimerTicks;
hamsterDeadByInactivity = false;
}
};
// --- Game update ---
game.update = function () {
// Camera does not follow hamster; keep cameraOffsetX and cameraOffsetY at 0
cameraOffsetX = 0;
cameraOffsetY = 0;
// --- Level timer logic ---
// Do not re-initialize levelTimerTicks or levelCompleted here; they persist globally
if (!levelCompleted) {
levelTimerTicks++;
// Update timer display (show seconds left, min 0)
var secondsLeft = Math.max(0, 30 - Math.floor(levelTimerTicks / 60));
timerText.setText(secondsLeft.toString());
if (levelTimerTicks >= 1800) {
// 30 seconds at 60fps
levelCompleted = true;
levelNumber++;
if (typeof levelText !== "undefined") {
levelText.setText("Level " + levelNumber);
}
LK.showYouWin();
// Reset timer for next level, allow game to continue
levelTimerTicks = 0;
levelCompleted = false;
return;
}
}
// --- Hamster inactivity death logic ---
if (!hamsterDeadByInactivity && levelTimerTicks - hamsterLastMoveTick >= 900) {
// 15 seconds * 60fps = 900
hamsterDeadByInactivity = true;
LK.effects.flashScreen(0xff0000, 1000);
levelTimerTicks = 0;
levelCompleted = false;
LK.showGameOver();
}
// Scroll background grass downward
var speed = 8;
bgGrass1.y += speed;
bgGrass2.y += speed;
// Keep backgrounds fixed horizontally
bgGrass1.x = 0;
bgGrass2.x = 0;
// Loop grass backgrounds
if (bgGrass1.y >= GAME_HEIGHT) {
bgGrass1.y = bgGrass2.y - GAME_HEIGHT;
}
if (bgGrass2.y >= GAME_HEIGHT) {
bgGrass2.y = bgGrass1.y - GAME_HEIGHT;
}
// --- Arti logic ---
// Do not re-initialize artiList and artiSpawnTimer here; they persist globally
// Spawn arti infinitely at regular intervals (every 1.5 seconds)
artiSpawnTimer++;
if (artiSpawnTimer > 90) {
var arti = new Arti();
// Place arti at a random position, not too close to top menu
var margin = 120;
arti.x = margin + Math.random() * (GAME_WIDTH - 2 * margin);
arti.y = margin + 100 + Math.random() * (GAME_HEIGHT - 2 * margin - 100);
game.addChild(arti);
artiList.push(arti);
artiSpawnTimer = 0;
}
// Update and remove expired arti
for (var i = artiList.length - 1; i >= 0; i--) {
var arti = artiList[i];
if (arti.lifetime <= 0) {
artiList.splice(i, 1);
continue;
}
// Collision detection (circle vs circle)
var dx = hamster.x - arti.x;
var dy = hamster.y - arti.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (arti.lastWasIntersecting === undefined) arti.lastWasIntersecting = false;
var isIntersecting = dist < hamster.radius + arti.radius;
if (!arti.lastWasIntersecting && isIntersecting) {
// Hamster dies
LK.effects.flashScreen(0xff0000, 1000);
// Reset the timer (but artiList and artiSpawnTimer are NOT reset)
levelTimerTicks = 0;
levelCompleted = false;
LK.showGameOver();
}
arti.lastWasIntersecting = isIntersecting;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -169,8 +169,11 @@
if (typeof levelText !== "undefined") {
levelText.setText("Level " + levelNumber);
}
LK.showYouWin();
+ // Reset timer for next level, allow game to continue
+ levelTimerTicks = 0;
+ levelCompleted = false;
return;
}
}
// --- Hamster inactivity death logic ---
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