User prompt
can you lift the centerCircle
User prompt
add magnet distance control
User prompt
background pixel art 2d road add
User prompt
make the blue background street all
User prompt
make the background street
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'y')' in or related to this line: 'streetBg1.y += moveSpeed;' Line Number: 212
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'y')' in or related to this line: 'streetBg1.y += moveSpeed;' Line Number: 212
User prompt
make the background street
User prompt
Include dynamic day/night or weather changes (rain, fog) that slightly affect gameplay or visuals.
User prompt
add menu to mute the sound to exit the game
User prompt
add sound to everything in the game
User prompt
add sound to cat and collision sound
Code edit (1 edits merged)
Please save this source code
User prompt
Cat Escape!
Initial prompt
Create a 2D endless runner mobile game called "Cat Escape!". The player controls a cute cartoon cat running through colorful city streets. The goal is to avoid obstacles (like trash cans, water puddles, and dogs) by swiping left or right, and collect fish to earn points. The game gets faster over time and ends when the cat hits an obstacle. Add fun sound effects like meowing, collecting fish, and hitting obstacles. Include power-ups such as magnet (attracts fish), speed boost, and double points. The game should include: A score counter Daily rewards Character upgrades (e.g., ninja cat, superhero cat) Leaderboard system Use cartoon-style 2D graphics with bright and fun visuals. Target platform: Mobile (iOS + Android) Make the game addictive, simple, and fun to play for all ages.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Cat player class
var Cat = Container.expand(function () {
var self = Container.call(this);
var catSprite = self.attachAsset('cat', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1; // Start in center lane
self.y = 2200; // Near bottom of screen
self.x = laneX[self.lane];
self.width = catSprite.width;
self.height = catSprite.height;
self.magnetActive = false;
self.speedBoostActive = false;
self.doubleActive = false;
self.powerupTimer = 0;
self.moveToLane = function (targetLane) {
if (targetLane < 0 || targetLane > 2) return;
self.lane = targetLane;
// Play cat meow sound
LK.getSound('cat').play();
// Animate to new lane
tween(self, {
x: laneX[self.lane]
}, {
duration: 120,
easing: tween.cubicOut
});
};
self.activatePowerup = function (type, duration) {
if (type === 'magnet') {
self.magnetActive = true;
} else if (type === 'speed') {
self.speedBoostActive = true;
} else if (type === 'double') {
self.doubleActive = true;
}
self.powerupTimer = LK.ticks + Math.floor(duration * 60 / 1000); // duration in ms
};
self.update = function () {
// Powerup timer
if (self.powerupTimer && LK.ticks > self.powerupTimer) {
self.magnetActive = false;
self.speedBoostActive = false;
self.doubleActive = false;
self.powerupTimer = 0;
}
};
return self;
});
// Fish collectible
var Fish = Container.expand(function () {
var self = Container.call(this);
var fishSprite = self.attachAsset('fish', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1;
self.x = laneX[self.lane];
self.y = -100;
self.width = fishSprite.width;
self.height = fishSprite.height;
self.collected = false;
self.update = function () {
// Movement handled in game.update
};
return self;
});
// Obstacle base class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
self.lane = 1;
self.x = laneX[self.lane];
self.y = -200;
self.width = 100;
self.height = 100;
self.type = 'obstacle';
self.update = function () {};
return self;
});
// Trashcan obstacle
var Trashcan = Obstacle.expand(function () {
var self = Obstacle.call(this);
var trashSprite = self.attachAsset('trashcan', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = trashSprite.width;
self.height = trashSprite.height;
self.type = 'trashcan';
return self;
});
// Puddle obstacle
var Puddle = Obstacle.expand(function () {
var self = Obstacle.call(this);
var puddleSprite = self.attachAsset('puddle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = puddleSprite.width;
self.height = puddleSprite.height;
self.type = 'puddle';
return self;
});
// Dog obstacle
var Dog = Obstacle.expand(function () {
var self = Obstacle.call(this);
var dogSprite = self.attachAsset('dog', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = dogSprite.width;
self.height = dogSprite.height;
self.type = 'dog';
return self;
});
// Powerup base class
var Powerup = Container.expand(function () {
var self = Container.call(this);
self.lane = 1;
self.x = laneX[self.lane];
self.y = -100;
self.width = 80;
self.height = 80;
self.kind = '';
self.update = function () {};
return self;
});
// Speed boost powerup
var Speed = Powerup.expand(function () {
var self = Powerup.call(this);
var spdSprite = self.attachAsset('speed', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = spdSprite.width;
self.height = spdSprite.height;
self.kind = 'speed';
return self;
});
// Magnet powerup
var Magnet = Powerup.expand(function () {
var self = Powerup.call(this);
var magSprite = self.attachAsset('magnet', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = magSprite.width;
self.height = magSprite.height;
self.kind = 'magnet';
return self;
});
// Double points powerup
var Double = Powerup.expand(function () {
var self = Powerup.call(this);
var dblSprite = self.attachAsset('double', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = dblSprite.width;
self.height = dblSprite.height;
self.kind = 'double';
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
// Always backgroundColor is black for dynamic day/night
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Additional sound effects
// Lane positions (3 lanes: left, center, right)
// Double points powerup
// Speed boost powerup
// Magnet powerup
// Dog obstacle
// Water puddle obstacle
// Trash can obstacle
// Fish collectible
// Cat character (main player)
// Game state variables
var laneX = [512, 1024, 1536];
var cat;
var obstacles = [];
var fishes = [];
var powerups = [];
var score = 0;
var speed = 18; // Initial speed (pixels per frame)
var gameTick = 0;
var lastSwipeX = null;
var dragStartX = null;
var dragStartY = null;
var dragActive = false;
var swipeThreshold = 80; // Minimum px for swipe
var lastLane = 1;
var lastScore = 0;
var powerupDuration = 4000; // ms
var spawnTimer = 0;
var powerupSpawnTimer = 0;
var fishSpawnTimer = 0;
var gameOver = false;
// --- Pixel Art Road Background ---
// We'll use two road sprites to create a seamless vertical scroll
var roadBg1, roadBg2;
var roadScrollSpeed = 0;
// Weather and day/night system
var weatherState = "clear"; // "clear", "rain", "fog"
var dayState = "day"; // "day", "night"
var weatherTimer = 0;
var dayTimer = 0;
var weatherDuration = 900 + Math.floor(Math.random() * 600); // 15-25s
var dayDuration = 1200 + Math.floor(Math.random() * 900); // 20-35s
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Powerup indicator
var powerupTxt = new Text2('', {
size: 70,
fill: "#fff"
});
powerupTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(powerupTxt);
powerupTxt.y = 130;
// Daily reward (placeholder, not implemented in MVP)
var dailyRewardTxt = new Text2('', {
size: 60,
fill: "#fff"
});
dailyRewardTxt.anchor.set(0.5, 0);
LK.gui.bottom.addChild(dailyRewardTxt);
// --- Add pixel art road background ---
// Use a placeholder image for the road, centered and stretched vertically
roadBg1 = LK.getAsset('centerCircle', {
width: 900,
height: 2732,
color: 0x444444,
shape: 'box',
anchorX: 0.5,
anchorY: 0
});
roadBg2 = LK.getAsset('centerCircle', {
width: 900,
height: 2732,
color: 0x444444,
shape: 'box',
anchorX: 0.5,
anchorY: 0
});
// Add white lane lines for pixel art effect
for (var i = 1; i <= 2; i++) {
var line = LK.getAsset('centerCircle', {
width: 16,
height: 2732,
color: 0xffffff,
shape: 'box',
anchorX: 0.5,
anchorY: 0
});
line.x = (i - 1) * 512 + 1024;
line.y = 0;
roadBg1.addChild(line);
var line2 = LK.getAsset('centerCircle', {
width: 16,
height: 2732,
color: 0xffffff,
shape: 'box',
anchorX: 0.5,
anchorY: 0
});
line2.x = (i - 1) * 512 + 1024;
line2.y = 0;
roadBg2.addChild(line2);
}
// Center road on screen
roadBg1.x = 1024;
roadBg1.y = 0;
roadBg2.x = 1024;
roadBg2.y = -2732;
game.addChild(roadBg1);
game.addChild(roadBg2);
// Initialize cat
cat = new Cat();
cat.x = laneX[1];
cat.y = 2200;
game.addChild(cat);
// Play background music (looping)
if (LK.playMusic) {
LK.playMusic('trashcan', {
loop: true
});
}
// Helper: spawn obstacle
function spawnObstacle() {
var lane = Math.floor(Math.random() * 3);
var typeRand = Math.random();
var obs;
// Boost puddle chance in rain
var puddleChance = 0.3 + (typeof rainPuddleBoost !== "undefined" ? rainPuddleBoost : 0);
if (typeRand < 0.5 - puddleChance / 2) {
obs = new Trashcan();
} else if (typeRand < 0.5 + puddleChance / 2) {
obs = new Puddle();
} else {
obs = new Dog();
}
obs.lane = lane;
obs.x = laneX[lane];
obs.y = -200;
obstacles.push(obs);
game.addChild(obs);
}
// Helper: spawn fish
function spawnFish() {
var lane = Math.floor(Math.random() * 3);
var fish = new Fish();
fish.lane = lane;
fish.x = laneX[lane];
fish.y = -100;
fishes.push(fish);
game.addChild(fish);
}
// Helper: spawn powerup
function spawnPowerup() {
var lane = Math.floor(Math.random() * 3);
var kindRand = Math.random();
var pwr;
if (kindRand < 0.34) {
pwr = new Magnet();
} else if (kindRand < 0.67) {
pwr = new Speed();
} else {
pwr = new Double();
}
pwr.lane = lane;
pwr.x = laneX[lane];
pwr.y = -100;
powerups.push(pwr);
game.addChild(pwr);
}
// Helper: reset game state
function resetGame() {
// Remove all obstacles, fishes, powerups
for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy();
for (var i = 0; i < fishes.length; i++) fishes[i].destroy();
for (var i = 0; i < powerups.length; i++) powerups[i].destroy();
obstacles = [];
fishes = [];
powerups = [];
score = 0;
speed = 18;
gameTick = 0;
cat.lane = 1;
cat.x = laneX[1];
cat.y = 2200;
cat.magnetActive = false;
cat.speedBoostActive = false;
cat.doubleActive = false;
cat.powerupTimer = 0;
scoreTxt.setText('0');
powerupTxt.setText('');
gameOver = false;
}
// Touch/move/swipe controls
game.down = function (x, y, obj) {
dragStartX = x;
dragStartY = y;
dragActive = true;
lastSwipeX = x;
};
game.move = function (x, y, obj) {
if (!dragActive) return;
var dx = x - dragStartX;
if (typeof effectiveSwipeThreshold === "undefined") effectiveSwipeThreshold = swipeThreshold;
if (Math.abs(dx) > effectiveSwipeThreshold) {
if (dx > 0 && cat.lane < 2) {
cat.moveToLane(cat.lane + 1);
dragActive = false;
} else if (dx < 0 && cat.lane > 0) {
cat.moveToLane(cat.lane - 1);
dragActive = false;
}
}
};
game.up = function (x, y, obj) {
dragActive = false;
};
// Main game update loop
game.update = function () {
if (gameOver) return;
gameTick++;
// --- Scroll pixel art road background ---
roadScrollSpeed = cat.speedBoostActive ? speed * 1.7 : speed;
if (weatherState === "fog") roadScrollSpeed = roadScrollSpeed * 0.92;
roadBg1.y += roadScrollSpeed;
roadBg2.y += roadScrollSpeed;
// Loop backgrounds
if (roadBg1.y >= 2732) roadBg1.y = roadBg2.y - 2732;
if (roadBg2.y >= 2732) roadBg2.y = roadBg1.y - 2732;
// --- Day/Night and Weather System ---
// Day/night cycle
dayTimer++;
if (dayTimer > dayDuration) {
dayState = dayState === "day" ? "night" : "day";
dayTimer = 0;
dayDuration = 1200 + Math.floor(Math.random() * 900);
}
// Weather cycle
weatherTimer++;
if (weatherTimer > weatherDuration) {
var prevWeather = weatherState;
// Randomly pick new weather, but not the same as before
var possible = ["clear", "rain", "fog"];
var idx = Math.floor(Math.random() * 3);
if (possible[idx] === prevWeather) idx = (idx + 1) % 3;
weatherState = possible[idx];
weatherTimer = 0;
weatherDuration = 900 + Math.floor(Math.random() * 600);
}
// Visual: background color for day/night
if (dayState === "day") {
game.setBackgroundColor(0x87ceeb); // Light blue
} else {
game.setBackgroundColor(0x222244); // Night blue
}
// Visual: weather overlays
if (weatherState === "rain") {
// Overlay semi-transparent blue for rain
if (!game.rainOverlay) {
game.rainOverlay = new Container();
var rain = LK.getAsset('centerCircle', {
width: 2048,
height: 2732,
color: 0x66aaff,
shape: 'box',
anchorX: 0,
anchorY: 0
});
rain.alpha = 0.13;
game.rainOverlay.addChild(rain);
game.addChild(game.rainOverlay);
}
game.rainOverlay.visible = true;
} else if (weatherState === "fog") {
// Overlay semi-transparent gray for fog
if (!game.fogOverlay) {
game.fogOverlay = new Container();
var fog = LK.getAsset('centerCircle', {
width: 2048,
height: 2732,
color: 0xcccccc,
shape: 'box',
anchorX: 0,
anchorY: 0
});
fog.alpha = 0.18;
game.fogOverlay.addChild(fog);
game.addChild(game.fogOverlay);
}
game.fogOverlay.visible = true;
} else {
if (game.rainOverlay) game.rainOverlay.visible = false;
if (game.fogOverlay) game.fogOverlay.visible = false;
}
// --- Weather/Day-Night Gameplay Effects ---
// At night, reduce swipe sensitivity slightly (harder to dodge)
var effectiveSwipeThreshold = swipeThreshold;
if (dayState === "night") effectiveSwipeThreshold = swipeThreshold + 20;
// In rain, increase chance of puddle obstacles
var rainPuddleBoost = weatherState === "rain" ? 0.18 : 0;
// In fog, reduce visible contrast (already handled visually), and slightly reduce speed
var moveSpeed = cat.speedBoostActive ? speed * 1.7 : speed;
if (weatherState === "fog") moveSpeed = moveSpeed * 0.92;
// Increase speed over time
if (gameTick % 180 === 0 && speed < 40) {
speed += 1;
}
// Spawn obstacles
spawnTimer--;
if (spawnTimer <= 0) {
spawnObstacle();
spawnTimer = 60 + Math.floor(Math.random() * 40); // 1-1.5s
}
// Spawn fish
fishSpawnTimer--;
if (fishSpawnTimer <= 0) {
spawnFish();
fishSpawnTimer = 40 + Math.floor(Math.random() * 40); // 0.7-1.3s
}
// Spawn powerup
powerupSpawnTimer--;
if (powerupSpawnTimer <= 0) {
spawnPowerup();
powerupSpawnTimer = 400 + Math.floor(Math.random() * 200); // 7-10s
}
// Update cat
cat.update();
// Move obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.y += moveSpeed;
// Remove if off screen
if (obs.y > 2900) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with cat
if (obs.lane === cat.lane && Math.abs(obs.y - cat.y) < (obs.height + cat.height) / 2 - 20) {
// Play collision sound based on obstacle type
if (obs.type === 'trashcan' && LK.getSound('TrashImpactSound')) {
LK.getSound('TrashImpactSound').play();
} else if (obs.type === 'puddle' && LK.getSound('puddle_splash')) {
LK.getSound('puddle_splash').play();
} else if (obs.type === 'dog' && LK.getSound('dog_bark')) {
LK.getSound('dog_bark').play();
} else {
LK.getSound('cat').play();
}
// Game over
LK.effects.flashScreen(0xff0000, 800);
gameOver = true;
LK.showGameOver();
return;
}
}
// Move fishes
for (var i = fishes.length - 1; i >= 0; i--) {
var fish = fishes[i];
fish.y += moveSpeed;
// Magnet effect
if (cat.magnetActive && Math.abs(fish.y - cat.y) < 500 && Math.abs(fish.x - cat.x) < 400) {
// Move fish toward cat
var dx = cat.x - fish.x;
var dy = cat.y - fish.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 1) {
fish.x += dx / dist * 22;
fish.y += dy / dist * 22;
}
}
// Remove if off screen
if (fish.y > 2900) {
fish.destroy();
fishes.splice(i, 1);
continue;
}
// Collect fish
if (!fish.collected && fish.lane === cat.lane && Math.abs(fish.y - cat.y) < (fish.height + cat.height) / 2 - 20) {
fish.collected = true;
var points = cat.doubleActive ? 2 : 1;
score += points;
LK.setScore(score);
scoreTxt.setText(score + '');
// Play collect fish sound
if (LK.getSound('collect_fish')) LK.getSound('collect_fish').play();
// Animate fish
tween(fish, {
alpha: 0,
y: cat.y - 80
}, {
duration: 200,
onFinish: function onFinish() {
fish.destroy();
}
});
fishes.splice(i, 1);
continue;
}
}
// Move powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var pwr = powerups[i];
pwr.y += moveSpeed;
// Remove if off screen
if (pwr.y > 2900) {
pwr.destroy();
powerups.splice(i, 1);
continue;
}
// Collect powerup
if (pwr.lane === cat.lane && Math.abs(pwr.y - cat.y) < (pwr.height + cat.height) / 2 - 20) {
// Play collect powerup sound
if (LK.getSound('collect_powerup')) LK.getSound('collect_powerup').play();
// Activate powerup
cat.activatePowerup(pwr.kind, powerupDuration);
// Play sound for each powerup type
if (pwr.kind === 'magnet' && LK.getSound('magnet_powerup')) {
LK.getSound('magnet_powerup').play();
powerupTxt.setText('Magnet!');
} else if (pwr.kind === 'speed' && LK.getSound('speed_powerup')) {
LK.getSound('speed_powerup').play();
powerupTxt.setText('Speed!');
} else if (pwr.kind === 'double' && LK.getSound('double_powerup')) {
LK.getSound('double_powerup').play();
powerupTxt.setText('Double Points!');
} else if (pwr.kind === 'magnet') {
powerupTxt.setText('Magnet!');
} else if (pwr.kind === 'speed') {
powerupTxt.setText('Speed!');
} else if (pwr.kind === 'double') {
powerupTxt.setText('Double Points!');
}
// Animate
tween(pwr, {
alpha: 0,
y: cat.y - 80
}, {
duration: 200,
onFinish: function onFinish() {
pwr.destroy();
}
});
powerups.splice(i, 1);
continue;
}
}
// Powerup indicator clear
if (!cat.magnetActive && !cat.speedBoostActive && !cat.doubleActive) {
powerupTxt.setText('');
}
};
// Reset game state on game over
LK.on('gameover', function () {
resetGame();
});
// Reset game state on you win (not used in endless runner, but for completeness)
LK.on('youwin', function () {
resetGame();
}); ===================================================================
--- original.js
+++ change.js
@@ -193,33 +193,8 @@
// Trash can obstacle
// Fish collectible
// Cat character (main player)
// Game state variables
-// --- Street Background Setup ---
-var streetBg1 = LK.getAsset('centerCircle', {
- width: 2048,
- height: 900,
- color: 0x0080ff,
- shape: 'box',
- anchorX: 0,
- anchorY: 0
-});
-var streetBg2 = LK.getAsset('centerCircle', {
- width: 2048,
- height: 900,
- color: 0x0080ff,
- shape: 'box',
- anchorX: 0,
- anchorY: 0
-});
-streetBg1.y = 0;
-streetBg2.y = -900;
-streetBg1.x = 0;
-streetBg2.x = 0;
-streetBg1.zIndex = -100;
-streetBg2.zIndex = -100;
-game.addChild(streetBg1);
-game.addChild(streetBg2);
var laneX = [512, 1024, 1536];
var cat;
var obstacles = [];
var fishes = [];
@@ -238,8 +213,12 @@
var spawnTimer = 0;
var powerupSpawnTimer = 0;
var fishSpawnTimer = 0;
var gameOver = false;
+// --- Pixel Art Road Background ---
+// We'll use two road sprites to create a seamless vertical scroll
+var roadBg1, roadBg2;
+var roadScrollSpeed = 0;
// Weather and day/night system
var weatherState = "clear"; // "clear", "rain", "fog"
var dayState = "day"; // "day", "night"
var weatherTimer = 0;
@@ -267,8 +246,58 @@
fill: "#fff"
});
dailyRewardTxt.anchor.set(0.5, 0);
LK.gui.bottom.addChild(dailyRewardTxt);
+// --- Add pixel art road background ---
+// Use a placeholder image for the road, centered and stretched vertically
+roadBg1 = LK.getAsset('centerCircle', {
+ width: 900,
+ height: 2732,
+ color: 0x444444,
+ shape: 'box',
+ anchorX: 0.5,
+ anchorY: 0
+});
+roadBg2 = LK.getAsset('centerCircle', {
+ width: 900,
+ height: 2732,
+ color: 0x444444,
+ shape: 'box',
+ anchorX: 0.5,
+ anchorY: 0
+});
+// Add white lane lines for pixel art effect
+for (var i = 1; i <= 2; i++) {
+ var line = LK.getAsset('centerCircle', {
+ width: 16,
+ height: 2732,
+ color: 0xffffff,
+ shape: 'box',
+ anchorX: 0.5,
+ anchorY: 0
+ });
+ line.x = (i - 1) * 512 + 1024;
+ line.y = 0;
+ roadBg1.addChild(line);
+ var line2 = LK.getAsset('centerCircle', {
+ width: 16,
+ height: 2732,
+ color: 0xffffff,
+ shape: 'box',
+ anchorX: 0.5,
+ anchorY: 0
+ });
+ line2.x = (i - 1) * 512 + 1024;
+ line2.y = 0;
+ roadBg2.addChild(line2);
+}
+// Center road on screen
+roadBg1.x = 1024;
+roadBg1.y = 0;
+roadBg2.x = 1024;
+roadBg2.y = -2732;
+game.addChild(roadBg1);
+game.addChild(roadBg2);
// Initialize cat
cat = new Cat();
cat.x = laneX[1];
cat.y = 2200;
@@ -377,8 +406,16 @@
// Main game update loop
game.update = function () {
if (gameOver) return;
gameTick++;
+ // --- Scroll pixel art road background ---
+ roadScrollSpeed = cat.speedBoostActive ? speed * 1.7 : speed;
+ if (weatherState === "fog") roadScrollSpeed = roadScrollSpeed * 0.92;
+ roadBg1.y += roadScrollSpeed;
+ roadBg2.y += roadScrollSpeed;
+ // Loop backgrounds
+ if (roadBg1.y >= 2732) roadBg1.y = roadBg2.y - 2732;
+ if (roadBg2.y >= 2732) roadBg2.y = roadBg1.y - 2732;
// --- Day/Night and Weather System ---
// Day/night cycle
dayTimer++;
if (dayTimer > dayDuration) {
@@ -473,17 +510,8 @@
if (powerupSpawnTimer <= 0) {
spawnPowerup();
powerupSpawnTimer = 400 + Math.floor(Math.random() * 200); // 7-10s
}
- // --- Street Background Scrolling ---
- streetBg1.y += moveSpeed;
- streetBg2.y += moveSpeed;
- if (streetBg1.y >= 2732) {
- streetBg1.y = streetBg2.y - streetBg1.height;
- }
- if (streetBg2.y >= 2732) {
- streetBg2.y = streetBg1.y - streetBg2.height;
- }
// Update cat
cat.update();
// Move obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
pixel art 2D cat head. In-Game asset. 2d. High contrast. No shadows
pixel art 2D dog head. In-Game asset. 2d. High contrast. No shadows
pixel art 2D trash can. In-Game asset. 2d. High contrast. No shadows
pixel art 2D fish. In-Game asset. 2d. High contrast. No shadows
pixel art 2D magnet. In-Game asset. 2d. High contrast. No shadows
pixel art 2D puddle. In-Game asset. 2d. High contrast. No shadows
pixel art 2D speed drink. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
pixel art 2D x2. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat