User prompt
araçalar hangi yöne gidiyorsa o tarafa önleri baksın
User prompt
araçlar taşıtlar iç içe girmesin
Code edit (1 edits merged)
Please save this source code
User prompt
Crossy Critters: Day & Night Dash
Initial prompt
Create a 2D top-down road crossing game in portrait orientation with the following specifications: 🎮 GAME STRUCTURE: - The player must cross 20 consecutive road sections (levels). - Each section includes either traffic-filled roads or safe grass areas. - The level ends when the player reaches the 20th row. 🚗 VEHICLE TRAFFIC: - Vehicles spawn endlessly from left or right sides on road lanes. - Vehicle types: - Small cars - Pickup trucks - Trucks - TIR (semi-trailers) - Motorcycles - Traffic flows continuously and never stops. - Vehicles **must never overlap** — a minimum distance is maintained between vehicles on each lane. - Each lane has its own traffic speed and spacing logic. - Traffic intensity and speed increase slightly with each level. 👤 PLAYER FEATURES: - The player controls an animal character (chicken, dog, or cat). - Movement is grid-based: one tile per move (tap, swipe, or arrow keys). - Coins appear randomly on the map and can be collected. - Collected coins are used to unlock new characters in a shop. 📱 UI & VISUALS: - Portrait mode (720x1280). - Bright, cartoon-style or pixel-art 2D graphics. - Score counter (number of rows crossed) and coin counter always visible. - Game Over screen on collision. - Victory screen after 20th row. 🌗 DAY/NIGHT CYCLE: - The game includes a smooth day/night cycle during gameplay. - The background gradually changes from day to night and back. - Visual changes include: - Sky color transition - Soft lighting effects - Optional light glows from vehicles at night - The cycle runs continuously and does not pause. 🔊 SOUND & FEEDBACK: - Vehicles have movement and engine sounds. - Coin collection triggers sound effects. - Day/night cycle may include ambient audio changes (e.g. crickets at night). - Smooth animations for character movement, death, and level transitions. The game should be mobile-optimized, visually dynamic, and casual-friendly while offering fun progression with an engaging atmosphere through lighting and time-of-day changes.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Animal class (player) var Animal = Container.expand(function () { var self = Container.call(this); // Default to chicken self.type = 'chicken'; self.sprite = self.attachAsset(self.type, { anchorX: 0.5, anchorY: 0.5 }); self.setType = function (type) { if (self.sprite) self.sprite.destroy(); self.type = type; self.sprite = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); }; // Animate hop self.hop = function (targetX, targetY, _onFinish) { tween(self, { x: targetX, y: targetY, scaleY: 1.2 }, { duration: 80, easing: tween.cubicOut, onFinish: function onFinish() { tween(self, { scaleY: 1 }, { duration: 60, easing: tween.cubicIn, onFinish: _onFinish }); } }); }; return self; }); // Coin class var Coin = Container.expand(function () { var self = Container.call(this); self.sprite = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); // Animate spin self.update = function () { self.sprite.rotation += 0.15; }; return self; }); // Vehicle class var Vehicle = Container.expand(function () { var self = Container.call(this); // type: 'car1', 'car2', 'truck' self.type = 'car1'; self.sprite = self.attachAsset(self.type, { anchorX: 0.5, anchorY: 0.5 }); self.setType = function (type) { if (self.sprite) self.sprite.destroy(); self.type = type; self.sprite = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); }; // Lane index (0-19) self.lane = 0; // Direction: 1 = left to right, -1 = right to left self.dir = 1; // Speed in px per frame self.speed = 6; self.update = function () { if (typeof self.lastX === "undefined") self.lastX = self.x; self.x += self.speed * self.dir; self.lastX = self.x; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb // Day sky blue }); /**** * Game Code ****/ // Music // Sounds // Coin // Vehicles // Lane types // Animal characters // --- Game constants --- var NUM_LANES = 20; var LANE_HEIGHT = 120; var LANE_TYPES = []; // 'grass' or 'road' var LANE_Y = []; // y positions of each lane (0 = bottom) var LANE_CONFIG = []; // {type, y, speed, dir, spacing, vehicleTypes} var LANE_TOP = 2732 - NUM_LANES * LANE_HEIGHT; // Top y of first lane // --- Day/Night cycle --- var dayNight = { t: 0, // 0 = day, 1 = night speed: 0.00025, // How fast day/night cycles (per tick) colorDay: 0x87ceeb, colorNight: 0x23234a }; // --- Game state --- var player = null; var vehicles = []; var coins = []; var score = 0; var coinsCollected = 0; var isMoving = false; var dragStart = null; var dragTarget = null; var lastLane = 0; var gameOver = false; // --- UI --- var scoreTxt = new Text2('0', { size: 100, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var coinTxt = new Text2('0', { size: 80, fill: 0xFFD700 }); coinTxt.anchor.set(0.5, 0); LK.gui.topRight.addChild(coinTxt); // --- Lane setup --- function setupLanes() { LANE_TYPES.length = 0; LANE_Y.length = 0; LANE_CONFIG.length = 0; for (var i = 0; i < NUM_LANES; i++) { // Alternate: grass every 3rd lane, rest are road var type = i % 3 === 0 ? 'grass' : 'road'; LANE_TYPES.push(type); var y = 2732 - (i + 0.5) * LANE_HEIGHT; LANE_Y.push(y); // Lane config if (type === 'road') { // Vary speed and direction var dir = i % 2 === 0 ? 1 : -1; var speed = 4 + i % 4 * 1.5; // 4, 5.5, 7, 8.5 var spacing = 350 + i % 3 * 80; // 350, 430, 510 var vehicleTypes = i % 4 === 0 ? ['truck'] : ['car1', 'car2']; LANE_CONFIG.push({ type: type, y: y, speed: speed, dir: dir, spacing: spacing, vehicleTypes: vehicleTypes }); } else { LANE_CONFIG.push({ type: type, y: y }); } } } // --- Draw lanes --- function drawLanes() { for (var i = 0; i < NUM_LANES; i++) { var laneType = LANE_TYPES[i]; var y = LANE_Y[i]; var lane = LK.getAsset(laneType, { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: y }); game.addChild(lane); } } // --- Spawn player --- function spawnPlayer() { player = new Animal(); player.setType('chicken'); // Start at bottom grass lane, center player.x = 2048 / 2; player.y = LANE_Y[0]; lastLane = 0; game.addChild(player); } // --- Spawn vehicles --- function spawnVehicle(laneIdx) { var config = LANE_CONFIG[laneIdx]; if (!config || config.type !== 'road') return; // Check for minimum distance to last vehicle in this lane var lastVehicle = null; var lastDist = 99999; for (var i = 0; i < vehicles.length; i++) { if (vehicles[i].lane === laneIdx) { var dist = Math.abs(vehicles[i].x - 2048 / 2); if (dist < lastDist) { lastDist = dist; lastVehicle = vehicles[i]; } } } // Only spawn if no vehicle or far enough from last vehicle in this lane if (!lastVehicle || lastDist > config.spacing) { var v = new Vehicle(); // Random vehicle type var vtype = config.vehicleTypes[Math.floor(Math.random() * config.vehicleTypes.length)]; v.setType(vtype); v.lane = laneIdx; v.dir = config.dir; v.speed = config.speed + Math.random() * 1.5; // Y position v.y = config.y; // X position: offscreen left or right if (v.dir === 1) { v.x = -v.sprite.width / 2 - 20; } else { v.x = 2048 + v.sprite.width / 2 + 20; } vehicles.push(v); game.addChild(v); } } // --- Spawn coin --- function spawnCoin(laneIdx) { var config = LANE_CONFIG[laneIdx]; if (!config || config.type !== 'grass') return; // Only one coin per grass lane at a time for (var i = 0; i < coins.length; i++) { if (Math.abs(coins[i].y - config.y) < 10) return; } var c = new Coin(); c.x = 200 + Math.random() * (2048 - 400); c.y = config.y; coins.push(c); game.addChild(c); } // --- Remove vehicle --- function removeVehicle(idx) { vehicles[idx].destroy(); vehicles.splice(idx, 1); } // --- Remove coin --- function removeCoin(idx) { coins[idx].destroy(); coins.splice(idx, 1); } // --- Update UI --- function updateUI() { scoreTxt.setText(score); coinTxt.setText(coinsCollected); } // --- Day/Night cycle update --- function updateDayNight() { dayNight.t += dayNight.speed; if (dayNight.t > 1) dayNight.t = 0; // Interpolate color var t = dayNight.t; var c1 = dayNight.colorDay, c2 = dayNight.colorNight; var r = (c1 >> 16) * (1 - t) + (c2 >> 16) * t & 0xff; var g = (c1 >> 8 & 0xff) * (1 - t) + (c2 >> 8 & 0xff) * t & 0xff; var b = (c1 & 0xff) * (1 - t) + (c2 & 0xff) * t & 0xff; var color = r << 16 | g << 8 | b; game.setBackgroundColor(color); } // --- Collision detection --- function checkCollisions() { // Vehicles for (var i = 0; i < vehicles.length; i++) { if (player.intersects(vehicles[i])) { // Crash! LK.effects.flashScreen(0xff0000, 800); LK.getSound('crash').play(); gameOver = true; LK.showGameOver(); return; } } // Coins for (var i = coins.length - 1; i >= 0; i--) { if (player.intersects(coins[i])) { coinsCollected++; updateUI(); LK.getSound('coin').play(); removeCoin(i); } } } // --- Move player (grid) --- function tryMove(dx, dy) { if (isMoving || gameOver) return; var newLane = lastLane + dy; if (newLane < 0 || newLane >= NUM_LANES) return; var newX = player.x + dx * 220; if (newX < 80 || newX > 2048 - 80) return; var newY = LANE_Y[newLane]; isMoving = true; player.hop(newX, newY, function () { isMoving = false; lastLane = newLane; // Score: advance only if moving up if (dy > 0) { score++; updateUI(); if (score >= NUM_LANES - 1) { // Win! LK.effects.flashScreen(0x00ffcc, 1000); LK.showYouWin(); gameOver = true; } } }); LK.getSound('hop').play(); } // --- Touch controls (swipe) --- var touchStart = null; game.down = function (x, y, obj) { if (gameOver) return; touchStart = { x: x, y: y }; }; game.up = function (x, y, obj) { if (gameOver || !touchStart) return; var dx = x - touchStart.x; var dy = y - touchStart.y; var absX = Math.abs(dx), absY = Math.abs(dy); if (absX < 40 && absY < 40) { // Tap: move up tryMove(0, 1); } else if (absY > absX) { if (dy < -40) tryMove(0, -1); // Down else if (dy > 40) tryMove(0, 1); // Up } else { if (dx < -40) tryMove(-1, 0); // Left else if (dx > 40) tryMove(1, 0); // Right } touchStart = null; }; // --- Main update loop --- game.update = function () { if (gameOver) return; // Day/Night updateDayNight(); // Vehicles for (var i = vehicles.length - 1; i >= 0; i--) { vehicles[i].update(); // Remove if offscreen if (vehicles[i].dir === 1 && vehicles[i].x > 2048 + vehicles[i].sprite.width / 2 + 40 || vehicles[i].dir === -1 && vehicles[i].x < -vehicles[i].sprite.width / 2 - 40) { removeVehicle(i); } } // Coins for (var i = 0; i < coins.length; i++) { coins[i].update(); } // Spawn vehicles for (var i = 0; i < NUM_LANES; i++) { var config = LANE_CONFIG[i]; if (!config || config.type !== 'road') continue; // Try to spawn a vehicle with a small probability if (Math.random() < 0.025) { // ~1 every 40 frames spawnVehicle(i); } } // Spawn coins for (var i = 0; i < NUM_LANES; i++) { var config = LANE_CONFIG[i]; if (!config || config.type !== 'grass') continue; // 1% chance per frame if (Math.random() < 0.01) { spawnCoin(i); } } // Remove coins if offscreen (shouldn't happen, but safety) for (var i = coins.length - 1; i >= 0; i--) { if (coins[i].y < LANE_TOP - 100 || coins[i].y > 2732 + 100) { removeCoin(i); } } // Collisions checkCollisions(); }; // --- Game start --- setupLanes(); drawLanes(); spawnPlayer(); updateUI(); LK.playMusic('bgmusic', { fade: { start: 0, end: 0.7, duration: 1200 } });
===================================================================
--- original.js
+++ change.js
@@ -81,9 +81,11 @@
self.dir = 1;
// Speed in px per frame
self.speed = 6;
self.update = function () {
+ if (typeof self.lastX === "undefined") self.lastX = self.x;
self.x += self.speed * self.dir;
+ self.lastX = self.x;
};
return self;
});
@@ -204,25 +206,40 @@
// --- Spawn vehicles ---
function spawnVehicle(laneIdx) {
var config = LANE_CONFIG[laneIdx];
if (!config || config.type !== 'road') return;
- var v = new Vehicle();
- // Random vehicle type
- var vtype = config.vehicleTypes[Math.floor(Math.random() * config.vehicleTypes.length)];
- v.setType(vtype);
- v.lane = laneIdx;
- v.dir = config.dir;
- v.speed = config.speed + Math.random() * 1.5;
- // Y position
- v.y = config.y;
- // X position: offscreen left or right
- if (v.dir === 1) {
- v.x = -v.sprite.width / 2 - 20;
- } else {
- v.x = 2048 + v.sprite.width / 2 + 20;
+ // Check for minimum distance to last vehicle in this lane
+ var lastVehicle = null;
+ var lastDist = 99999;
+ for (var i = 0; i < vehicles.length; i++) {
+ if (vehicles[i].lane === laneIdx) {
+ var dist = Math.abs(vehicles[i].x - 2048 / 2);
+ if (dist < lastDist) {
+ lastDist = dist;
+ lastVehicle = vehicles[i];
+ }
+ }
}
- vehicles.push(v);
- game.addChild(v);
+ // Only spawn if no vehicle or far enough from last vehicle in this lane
+ if (!lastVehicle || lastDist > config.spacing) {
+ var v = new Vehicle();
+ // Random vehicle type
+ var vtype = config.vehicleTypes[Math.floor(Math.random() * config.vehicleTypes.length)];
+ v.setType(vtype);
+ v.lane = laneIdx;
+ v.dir = config.dir;
+ v.speed = config.speed + Math.random() * 1.5;
+ // Y position
+ v.y = config.y;
+ // X position: offscreen left or right
+ if (v.dir === 1) {
+ v.x = -v.sprite.width / 2 - 20;
+ } else {
+ v.x = 2048 + v.sprite.width / 2 + 20;
+ }
+ vehicles.push(v);
+ game.addChild(v);
+ }
}
// --- Spawn coin ---
function spawnCoin(laneIdx) {
var config = LANE_CONFIG[laneIdx];
@@ -362,25 +379,13 @@
// Spawn vehicles
for (var i = 0; i < NUM_LANES; i++) {
var config = LANE_CONFIG[i];
if (!config || config.type !== 'road') continue;
- // Count vehicles in this lane
- var count = 0,
- minDist = 99999;
- for (var j = 0; j < vehicles.length; j++) {
- if (vehicles[j].lane === i) {
- count++;
- var dist = Math.abs(vehicles[j].x - 2048 / 2);
- if (dist < minDist) minDist = dist;
- }
+ // Try to spawn a vehicle with a small probability
+ if (Math.random() < 0.025) {
+ // ~1 every 40 frames
+ spawnVehicle(i);
}
- // If no vehicle or far enough, spawn new
- if (count === 0 || minDist > config.spacing) {
- if (Math.random() < 0.025) {
- // ~1 every 40 frames
- spawnVehicle(i);
- }
- }
}
// Spawn coins
for (var i = 0; i < NUM_LANES; i++) {
var config = LANE_CONFIG[i];
chicken. In-Game asset. 2d. High contrast. No shadows
road çif şeritli düz yol. In-Game asset. 2d. High contrast. No shadows
car. In-Game asset. 2d. High contrast. No shadows
kamyon. In-Game asset. 2d. High contrast. No shadows
truck. In-Game asset. 2d. High contrast. No shadows
grass çim zemim kısa çimli zemin. In-Game asset. 2d. High contrast. No shadows
flag. In-Game asset. 2d. High contrast. No shadows
sun. In-Game asset. 2d. High contrast. No shadows
moon. In-Game asset. 2d. High contrast. No shadows
far ışığı yansıması. In-Game asset. 2d. High contrast. No shadows