User prompt
tıklayınca ışınlanmayı da sil
User prompt
hareket mekaniği sil
User prompt
hareket etmek için tıklama gerekmez hep haraket eder
User prompt
mouse mapte neredeyse karakter de oraya haraket eder
User prompt
karakterimiz tıklamadan da mouse a ışınlanabiliyor
User prompt
mouse a ışınlanarak kaçsın
Code edit (1 edits merged)
Please save this source code
User prompt
Spectral Dodge: Ghost vs Bullets
Initial prompt
biz bir hayaletiz ve bize mermiler geliyor wave sistemi var
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
	highScore: 0
});
/**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speedX = 0;
	self.speedY = 0;
	self.rotation = 0;
	self.rotationSpeed = 0;
	self.update = function () {
		self.x += self.speedX;
		self.y += self.speedY;
		// Rotate bullet if it has rotation speed
		if (self.rotationSpeed !== 0) {
			bulletGraphics.rotation += self.rotationSpeed;
		}
		// Check if bullet is off-screen with padding
		if (self.x < -50 || self.x > 2048 + 50 || self.y < -50 || self.y > 2732 + 50) {
			return true; // Return true to indicate it should be removed
		}
		return false;
	};
	return self;
});
var Ghost = Container.expand(function () {
	var self = Container.call(this);
	var ghostGraphics = self.attachAsset('ghost', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.8
	});
	// Trail effect using small ghost shapes
	self.trail = [];
	self.trailMax = 5;
	self.trailInterval = 3;
	self.trailCounter = 0;
	self.invulnerable = false;
	self.invulnerableTime = 0;
	self.blinkInterval = 5;
	self.update = function () {
		// Handle trail effect
		self.trailCounter++;
		if (self.trailCounter >= self.trailInterval) {
			self.trailCounter = 0;
			// Add new trail element
			if (self.trail.length >= self.trailMax) {
				var oldest = self.trail.shift();
				oldest.destroy();
			}
			var trail = LK.getAsset('ghost', {
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 0.3,
				scaleX: 0.7,
				scaleY: 0.7,
				x: self.x,
				y: self.y
			});
			game.addChildAt(trail, 0);
			self.trail.push(trail);
			// Fade out trail elements
			for (var i = 0; i < self.trail.length; i++) {
				var trailElement = self.trail[i];
				tween(trailElement, {
					alpha: 0
				}, {
					duration: 300,
					onFinish: function onFinish() {
						// Cleanup happens in the shift above
					}
				});
			}
		}
		// Handle invulnerability blinking
		if (self.invulnerable) {
			self.invulnerableTime--;
			if (self.invulnerableTime <= 0) {
				self.invulnerable = false;
				ghostGraphics.alpha = 0.8;
			} else {
				// Blink effect
				if (self.invulnerableTime % self.blinkInterval === 0) {
					ghostGraphics.alpha = ghostGraphics.alpha < 0.4 ? 0.8 : 0.3;
				}
			}
		}
	};
	self.makeInvulnerable = function (time) {
		self.invulnerable = true;
		self.invulnerableTime = time;
	};
	return self;
});
var WaveIndicator = Container.expand(function () {
	var self = Container.call(this);
	var indicatorGraphic = self.attachAsset('wave_indicator', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.active = false;
	self.setActive = function (isActive) {
		self.active = isActive;
		if (isActive) {
			tween(indicatorGraphic, {
				alpha: 1,
				scaleX: 1.2,
				scaleY: 1.2
			}, {
				duration: 300,
				onFinish: function onFinish() {
					tween(indicatorGraphic, {
						scaleX: 1,
						scaleY: 1
					}, {
						duration: 200
					});
				}
			});
		} else {
			indicatorGraphic.alpha = 0.4;
			indicatorGraphic.scaleX = 1;
			indicatorGraphic.scaleY = 1;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000033
});
/**** 
* Game Code
****/ 
// Background
var background = LK.getAsset('background', {
	anchorX: 0,
	anchorY: 0,
	x: 0,
	y: 0
});
game.addChild(background);
// Game state
var state = {
	score: 0,
	wave: 1,
	waveTimer: 0,
	difficulty: 1,
	isGameOver: false,
	isPaused: false,
	highScore: storage.highScore || 0
};
// Player
var ghost = new Ghost();
ghost.x = 2048 / 2;
ghost.y = 2732 / 2;
game.addChild(ghost);
// Add wave indicators
var waveIndicators = [];
var indicatorSpacing = 30;
var totalIndicators = 5;
var indicatorStartX = (2048 - (totalIndicators - 1) * indicatorSpacing) / 2;
for (var i = 0; i < totalIndicators; i++) {
	var indicator = new WaveIndicator();
	indicator.x = indicatorStartX + i * indicatorSpacing;
	indicator.y = 50;
	indicator.setActive(i === 0); // Set first one active
	waveIndicators.push(indicator);
	LK.gui.top.addChild(indicator);
}
// Bullet management
var bullets = [];
var patterns = {
	// Wave patterns
	circle: function circle(centerX, centerY, count, speed, size) {
		var angleStep = Math.PI * 2 / count;
		for (var i = 0; i < count; i++) {
			var angle = i * angleStep;
			createBullet(centerX, centerY, Math.cos(angle) * speed, Math.sin(angle) * speed, size);
		}
	},
	spiral: function spiral(centerX, centerY, count, speed, size) {
		var timeout = 0;
		var angleStep = Math.PI * 2 / count;
		for (var i = 0; i < count; i++) {
			(function (index) {
				LK.setTimeout(function () {
					var angle = index * angleStep;
					createBullet(centerX, centerY, Math.cos(angle) * speed, Math.sin(angle) * speed, size);
				}, timeout);
				timeout += 100;
			})(i);
		}
	},
	random: function random(count, speed, size) {
		for (var i = 0; i < count; i++) {
			var side = Math.floor(Math.random() * 4); // 0:top, 1:right, 2:bottom, 3:left
			var startX, startY;
			var targetX = ghost.x + (Math.random() * 100 - 50);
			var targetY = ghost.y + (Math.random() * 100 - 50);
			switch (side) {
				case 0:
					// Top
					startX = Math.random() * 2048;
					startY = -50;
					break;
				case 1:
					// Right
					startX = 2048 + 50;
					startY = Math.random() * 2732;
					break;
				case 2:
					// Bottom
					startX = Math.random() * 2048;
					startY = 2732 + 50;
					break;
				case 3:
					// Left
					startX = -50;
					startY = Math.random() * 2732;
					break;
			}
			var angle = Math.atan2(targetY - startY, targetX - startX);
			createBullet(startX, startY, Math.cos(angle) * speed, Math.sin(angle) * speed, size, 0.05);
		}
	},
	aimed: function aimed(count, speed, size) {
		var angleSpread = Math.PI / 4; // 45 degree spread
		for (var i = 0; i < count; i++) {
			var side = Math.floor(Math.random() * 4);
			var startX, startY;
			switch (side) {
				case 0:
					// Top
					startX = Math.random() * 2048;
					startY = -50;
					break;
				case 1:
					// Right
					startX = 2048 + 50;
					startY = Math.random() * 2732;
					break;
				case 2:
					// Bottom
					startX = Math.random() * 2048;
					startY = 2732 + 50;
					break;
				case 3:
					// Left
					startX = -50;
					startY = Math.random() * 2732;
					break;
			}
			var baseAngle = Math.atan2(ghost.y - startY, ghost.x - startX);
			var angleOffset = angleSpread * (Math.random() - 0.5);
			var angle = baseAngle + angleOffset;
			createBullet(startX, startY, Math.cos(angle) * speed, Math.sin(angle) * speed, size);
		}
	}
};
function createBullet(x, y, speedX, speedY, scale, rotationSpeed) {
	var bullet = new Bullet();
	bullet.x = x;
	bullet.y = y;
	bullet.speedX = speedX;
	bullet.speedY = speedY;
	bullet.rotationSpeed = rotationSpeed || 0;
	if (scale) {
		bullet.scale.set(scale);
	}
	bullets.push(bullet);
	game.addChild(bullet);
	return bullet;
}
function spawnWave() {
	var baseCount = 10;
	var baseSpeed = 3;
	// Update wave indicators
	var currentWaveIndex = (state.wave - 1) % totalIndicators;
	for (var i = 0; i < waveIndicators.length; i++) {
		waveIndicators[i].setActive(i === currentWaveIndex);
	}
	// Increase difficulty with each wave
	var count = Math.floor(baseCount * Math.sqrt(state.difficulty));
	var speed = baseSpeed * (1 + (state.difficulty - 1) * 0.1);
	// Play wave complete sound if not the first wave
	if (state.wave > 1) {
		LK.getSound('wave_complete').play();
	}
	// Choose pattern based on wave
	switch ((state.wave - 1) % 4) {
		case 0:
			patterns.circle(2048 / 2, 2732 / 2, count, speed, 1);
			break;
		case 1:
			patterns.spiral(2048 / 2, 2732 / 2, count, speed, 1);
			break;
		case 2:
			patterns.random(count, speed, 1);
			break;
		case 3:
			patterns.aimed(count, speed, 1);
			break;
	}
	// Make player briefly invulnerable after a new wave
	ghost.makeInvulnerable(60);
	// Increment difficulty
	state.difficulty += 0.2;
	// Set timer for next wave
	state.waveTimer = Math.max(180, 300 - state.wave * 10); // Decrease time between waves
}
// Initialize scoreboard
var scoreTxt = new Text2('Score: 0', {
	size: 50,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0); // Anchor to top-right
LK.gui.topRight.addChild(scoreTxt);
// Wave indicator text
var waveTxt = new Text2('Wave: 1', {
	size: 50,
	fill: 0xFFFFFF
});
waveTxt.anchor.set(0, 0); // Anchor to top-left
LK.gui.top.addChild(waveTxt);
// Allow dragging of the ghost
var isDragging = false;
// Handle input
game.down = function (x, y) {
	if (!state.isPaused && !state.isGameOver) {
		ghost.x = x; // Teleport ghost to mouse x position
		ghost.y = y; // Teleport ghost to mouse y position
	}
};
game.move = function (x, y) {
	// Removed dragging functionality for ghost
};
game.up = function () {
	// Removed dragging state reset
};
// Main game update function
game.update = function () {
	if (state.isGameOver) {
		return;
	}
	// Increment score
	state.score++;
	scoreTxt.setText('Score: ' + state.score);
	waveTxt.setText('Wave: ' + state.wave);
	// Wave timer logic
	if (state.waveTimer > 0) {
		state.waveTimer--;
		if (state.waveTimer === 0 || bullets.length === 0) {
			state.wave++;
			spawnWave();
		}
	}
	// Update ghost
	ghost.update();
	// Update bullets
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		if (bullet.update()) {
			// Bullet is off-screen, remove it
			bullet.destroy();
			bullets.splice(i, 1);
			continue;
		}
		// Check collision with ghost
		if (!ghost.invulnerable && bullet.intersects(ghost)) {
			// Handle collision
			LK.getSound('hit').play();
			// Flash screen
			LK.effects.flashScreen(0xff0000, 500);
			// Game over
			state.isGameOver = true;
			// Update high score
			if (state.score > state.highScore) {
				state.highScore = state.score;
				storage.highScore = state.score;
			}
			// Play game over sound
			LK.getSound('game_over').play();
			// Show game over screen after a short delay
			LK.setTimeout(function () {
				LK.showGameOver();
			}, 1000);
			break;
		}
	}
};
// Start first wave
spawnWave();
// Play background music
LK.playMusic('game_music', {
	fade: {
		start: 0,
		end: 0.4,
		duration: 1000
	}
}); ===================================================================
--- original.js
+++ change.js
@@ -342,24 +342,17 @@
 var isDragging = false;
 // Handle input
 game.down = function (x, y) {
 	if (!state.isPaused && !state.isGameOver) {
-		isDragging = true;
-		ghost.x = x;
-		ghost.y = y;
+		ghost.x = x; // Teleport ghost to mouse x position
+		ghost.y = y; // Teleport ghost to mouse y position
 	}
 };
 game.move = function (x, y) {
-	if (isDragging && !state.isPaused && !state.isGameOver) {
-		ghost.x = x;
-		ghost.y = y;
-		// Keep ghost within bounds
-		ghost.x = Math.max(40, Math.min(2048 - 40, ghost.x));
-		ghost.y = Math.max(40, Math.min(2732 - 40, ghost.y));
-	}
+	// Removed dragging functionality for ghost
 };
 game.up = function () {
-	isDragging = false;
+	// Removed dragging state reset
 };
 // Main game update function
 game.update = function () {
 	if (state.isGameOver) {