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
****/
// 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;
// --- Infinite grass background ---
var bgGrass1 = LK.getAsset('mat', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT,
color: 0x7ec850 // nice grass green
});
var bgGrass2 = LK.getAsset('mat', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT,
color: 0x7ec850
});
bgGrass1.y = 0;
bgGrass2.y = -GAME_HEIGHT;
game.addChild(bgGrass1);
game.addChild(bgGrass2);
// --- 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;
// Scroll background grass
bgGrass1.y += matSpeed;
bgGrass2.y += matSpeed;
// 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;
}
// 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;
}
}); /****
* 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;
// --- Infinite grass background ---
var bgGrass1 = LK.getAsset('mat', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT,
color: 0x7ec850 // nice grass green
});
var bgGrass2 = LK.getAsset('mat', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT,
color: 0x7ec850
});
bgGrass1.y = 0;
bgGrass2.y = -GAME_HEIGHT;
game.addChild(bgGrass1);
game.addChild(bgGrass2);
// --- 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;
// Scroll background grass
bgGrass1.y += matSpeed;
bgGrass2.y += matSpeed;
// 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;
}
// 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;
}
});
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