User prompt
Yüksek skor sağ üstte olsun
User prompt
Ana menü olsun
User prompt
Arkaplan da küçük küçük beyaz yıldızlarda olsun
User prompt
Arkaplan uzay olsun
User prompt
Arkaplan assetsleri olsun
User prompt
Mermilerin hitboxini arttır
User prompt
Oyuncu istediği yere gidemesin sadece düz bir alan ve sadece sağa sola gidebilir
User prompt
Oyuncunun hitboxini 3 kat büyüt
User prompt
Her 5 puanda bir mermilerin hızı 2 katına çıksın ve çoğalsınlar
User prompt
Oyuncuyu hareket ettirebilmesi lazım
Code edit (1 edits merged)
Please save this source code
User prompt
Bullet Rain - Dodge & Survive
Initial prompt
Bana bir deodge oyunu yap üstten mermiler düşecek ve oyuncular da o mermilerden kaçmaya çalışacak puan sistemi olsun
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.update = function () { self.y += self.speed; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var Star = Container.expand(function () { var self = Container.call(this); var starGraphics = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000011 }); /**** * Game Code ****/ // Game state management var gameState = 'menu'; // 'menu' or 'playing' // Create stars for background var stars = []; for (var i = 0; i < 150; i++) { var star = new Star(); star.x = Math.random() * 2048; star.y = Math.random() * 2732; stars.push(star); game.addChild(star); } // Main Menu Elements var titleText = new Text2('SPACE SHOOTER', { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 800; game.addChild(titleText); var startButton = new Text2('TAP TO START', { size: 80, fill: 0x00FF00 }); startButton.anchor.set(0.5, 0.5); startButton.x = 1024; startButton.y = 1400; game.addChild(startButton); // Instructions text var instructionsText = new Text2('Move left and right to avoid bullets', { size: 50, fill: 0xCCCCCC }); instructionsText.anchor.set(0.5, 0.5); instructionsText.x = 1024; instructionsText.y = 1600; game.addChild(instructionsText); function startGame() { // Hide menu elements titleText.visible = false; startButton.visible = false; instructionsText.visible = false; // Change game state gameState = 'playing'; // Reset game start time gameStartTime = Date.now(); } // Game variables (initialized when game starts) var player = null; var bullets = []; var bulletSpawnTimer = 0; var bulletSpawnDelay = 60; // Start spawning every 60 ticks (1 second) var minSpawnDelay = 20; // Minimum spawn delay (maximum difficulty) var difficultyTimer = 0; var speedMultiplier = 1; var gameStartTime = Date.now(); var dragNode = null; var scoreTxt = null; var timeTxt = null; function initializeGameplay() { // Create player player = game.addChild(new Player()); player.x = 1024; // Center horizontally player.y = 2200; // Near bottom of screen // Reset game variables bullets = []; bulletSpawnTimer = 0; speedMultiplier = 1; // Score display scoreTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); LK.gui.topRight.addChild(scoreTxt); // Time display timeTxt = new Text2('Time: 0s', { size: 60, fill: 0xFFFFFF }); timeTxt.anchor.set(0, 0); timeTxt.x = 120; timeTxt.y = 20; LK.gui.topLeft.addChild(timeTxt); } function updateScore() { var timeAlive = Math.floor((Date.now() - gameStartTime) / 1000); LK.setScore(timeAlive); scoreTxt.setText(timeAlive); timeTxt.setText('Time: ' + timeAlive + 's'); } function spawnBullet() { var bullet = new Bullet(); bullet.x = Math.random() * (2048 - 100) + 50; // Random x position with margin bullet.y = -30; // Start above screen bullet.speed = (6 + Math.random() * 4) * speedMultiplier; // Apply speed multiplier bullets.push(bullet); game.addChild(bullet); } function increaseDifficulty() { var currentScore = LK.getScore(); // Check if we've reached a new 5-point milestone if (currentScore > 0 && currentScore % 5 === 0) { // Only increase difficulty if we haven't already increased it for this score if (currentScore / 5 > speedMultiplier - 1) { speedMultiplier = Math.floor(currentScore / 5) + 1; // Decrease spawn delay (more bullets spawn) bulletSpawnDelay = Math.max(minSpawnDelay, Math.floor(60 / speedMultiplier)); } } } function handleMove(x, y, obj) { if (dragNode) { // Keep player within screen bounds horizontally only dragNode.x = Math.max(40, Math.min(2008, x)); // Keep player locked to bottom area - no vertical movement dragNode.y = 2200; } } game.move = handleMove; game.down = function (x, y, obj) { if (gameState === 'menu') { // Start the game when menu is tapped startGame(); initializeGameplay(); } else if (gameState === 'playing' && player) { // Set drag node to player for any touch on screen dragNode = player; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; game.update = function () { if (gameState === 'menu') { // Add blinking effect to start button if (LK.ticks % 60 < 30) { startButton.alpha = 1; } else { startButton.alpha = 0.5; } return; } if (gameState === 'playing' && player) { updateScore(); increaseDifficulty(); // Spawn bullets bulletSpawnTimer++; if (bulletSpawnTimer >= bulletSpawnDelay) { spawnBullet(); bulletSpawnTimer = 0; } // Update and check bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Initialize tracking variables if (bullet.lastY === undefined) bullet.lastY = bullet.y; if (bullet.lastIntersecting === undefined) bullet.lastIntersecting = false; // Check if bullet went off screen if (bullet.lastY <= 2800 && bullet.y > 2800) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check collision with player var currentIntersecting = bullet.intersects(player); if (!bullet.lastIntersecting && currentIntersecting) { // Collision detected - game over LK.getSound('hit').play(); LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } // Update tracking variables bullet.lastY = bullet.y; bullet.lastIntersecting = currentIntersecting; } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
// Game state management
var gameState = 'menu'; // 'menu' or 'playing'
// Create stars for background
var stars = [];
for (var i = 0; i < 150; i++) {
var star = new Star();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
stars.push(star);
game.addChild(star);
}
// Main Menu Elements
var titleText = new Text2('SPACE SHOOTER', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
game.addChild(titleText);
var startButton = new Text2('TAP TO START', {
size: 80,
fill: 0x00FF00
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 1024;
startButton.y = 1400;
game.addChild(startButton);
// Instructions text
var instructionsText = new Text2('Move left and right to avoid bullets', {
size: 50,
fill: 0xCCCCCC
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1600;
game.addChild(instructionsText);
function startGame() {
// Hide menu elements
titleText.visible = false;
startButton.visible = false;
instructionsText.visible = false;
// Change game state
gameState = 'playing';
// Reset game start time
gameStartTime = Date.now();
}
// Game variables (initialized when game starts)
var player = null;
var bullets = [];
var bulletSpawnTimer = 0;
var bulletSpawnDelay = 60; // Start spawning every 60 ticks (1 second)
var minSpawnDelay = 20; // Minimum spawn delay (maximum difficulty)
var difficultyTimer = 0;
var speedMultiplier = 1;
var gameStartTime = Date.now();
var dragNode = null;
var scoreTxt = null;
var timeTxt = null;
function initializeGameplay() {
// Create player
player = game.addChild(new Player());
player.x = 1024; // Center horizontally
player.y = 2200; // Near bottom of screen
// Reset game variables
bullets = [];
bulletSpawnTimer = 0;
speedMultiplier = 1;
// Score display
scoreTxt = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreTxt);
// Time display
timeTxt = new Text2('Time: 0s', {
size: 60,
fill: 0xFFFFFF
});
timeTxt.anchor.set(0, 0);
timeTxt.x = 120;
timeTxt.y = 20;
LK.gui.topLeft.addChild(timeTxt);
}
function updateScore() {
var timeAlive = Math.floor((Date.now() - gameStartTime) / 1000);
LK.setScore(timeAlive);
scoreTxt.setText(timeAlive);
timeTxt.setText('Time: ' + timeAlive + 's');
}
function spawnBullet() {
var bullet = new Bullet();
bullet.x = Math.random() * (2048 - 100) + 50; // Random x position with margin
bullet.y = -30; // Start above screen
bullet.speed = (6 + Math.random() * 4) * speedMultiplier; // Apply speed multiplier
bullets.push(bullet);
game.addChild(bullet);
}
function increaseDifficulty() {
var currentScore = LK.getScore();
// Check if we've reached a new 5-point milestone
if (currentScore > 0 && currentScore % 5 === 0) {
// Only increase difficulty if we haven't already increased it for this score
if (currentScore / 5 > speedMultiplier - 1) {
speedMultiplier = Math.floor(currentScore / 5) + 1;
// Decrease spawn delay (more bullets spawn)
bulletSpawnDelay = Math.max(minSpawnDelay, Math.floor(60 / speedMultiplier));
}
}
}
function handleMove(x, y, obj) {
if (dragNode) {
// Keep player within screen bounds horizontally only
dragNode.x = Math.max(40, Math.min(2008, x));
// Keep player locked to bottom area - no vertical movement
dragNode.y = 2200;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'menu') {
// Start the game when menu is tapped
startGame();
initializeGameplay();
} else if (gameState === 'playing' && player) {
// Set drag node to player for any touch on screen
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameState === 'menu') {
// Add blinking effect to start button
if (LK.ticks % 60 < 30) {
startButton.alpha = 1;
} else {
startButton.alpha = 0.5;
}
return;
}
if (gameState === 'playing' && player) {
updateScore();
increaseDifficulty();
// Spawn bullets
bulletSpawnTimer++;
if (bulletSpawnTimer >= bulletSpawnDelay) {
spawnBullet();
bulletSpawnTimer = 0;
}
// Update and check bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Initialize tracking variables
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastIntersecting === undefined) bullet.lastIntersecting = false;
// Check if bullet went off screen
if (bullet.lastY <= 2800 && bullet.y > 2800) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check collision with player
var currentIntersecting = bullet.intersects(player);
if (!bullet.lastIntersecting && currentIntersecting) {
// Collision detected - game over
LK.getSound('hit').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
// Update tracking variables
bullet.lastY = bullet.y;
bullet.lastIntersecting = currentIntersecting;
}
}
};