/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Asteroid class
var Asteroid = Container.expand(function () {
var self = Container.call(this);
// Attach asteroid asset
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
// Set asteroid speed
self.speed = 3;
// Update function called every game tick
self.update = function () {
// Move asteroid based on speed
self.y += self.speed;
// Destroy asteroid when it gets out of player screen
if (self.y > 2732) {
self.destroy();
}
// Check for collision with player
if (self.intersects(player)) {
// Add a blasting effect
var blast = self.attachAsset('blast', {
anchorX: 0.5,
anchorY: 0.5
});
blast.x = player.x;
blast.y = player.y;
game.addChild(blast);
// Destroy the blast effect after a short delay
LK.setTimeout(function () {
blast.destroy();
}, 500);
// Play blast sound effect
LK.getSound('blastSound').play();
// Play blast sound effect
LK.getSound('blastSound').play();
// Trigger game over when asteroid hits player
LK.showGameOver();
}
};
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet asset
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Set bullet speed
self.speed = -14;
// Update function called every game tick
self.update = function () {
self.y += self.speed;
// Check for collision with enemy and asteroid
// Use spatial partitioning to optimize collision detection
// Custom grid implementation for spatial partitioning
var grid = {
width: 2048,
height: 2732,
cellSize: 100,
cells: {},
insert: function insert(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
if (!this.cells[key]) {
this.cells[key] = [];
}
this.cells[key].push(obj);
},
retrieve: function retrieve(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
return this.cells[key] || [];
},
clear: function clear() {
this.cells = {};
}
};
game.children.forEach(function (child) {
if (child instanceof Enemy || child instanceof Asteroid) {
grid.insert(child);
}
});
var nearbyTargets = grid.retrieve(self);
for (var i = 0; i < nearbyTargets.length; i++) {
var target = nearbyTargets[i];
if (self.intersects(target)) {
// Destroy target and bullet on collision
target.destroy();
self.destroy();
// Play blast sound effect
LK.getSound('blastSound').play();
// Increase score by 50 points when target dies
LK.setScore(LK.getScore() + 50);
// Update the scoreboard
scoreTxt.setText(LK.getScore());
// Add a blasting effect
var blast = self.attachAsset('blast', {
anchorX: 0.5,
anchorY: 0.5
});
blast.x = self.x;
blast.y = self.y;
game.addChild(blast);
// Destroy the blast effect after a short delay
LK.setTimeout(function () {
blast.destroy();
}, 500);
break;
}
}
// Destroy bullet when it goes past to the screen
if (self.y < 0) {
self.visible = false;
game.bulletPool.push(self);
}
};
// Add a reset method to reset bullet properties
self.reset = function () {
self.visible = true;
self.y = player.y;
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Attach enemy asset
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Set enemy speed
self.speed = 5;
// Update function called every game tick
self.update = function () {
// Move enemy based on speed
self.y += self.speed;
// Destroy enemy when it gets out of player screen
if (self.y > 2732) {
self.destroy();
}
// Enemy fires a bullet every 60 ticks
if (LK.ticks % 60 == 0) {
var enemyBullet = game.addChild(new EnemyBullet());
// Set bullet initial position to enemy's position
enemyBullet.x = self.x;
enemyBullet.y = self.y;
// Set bullet speed to move downwards
enemyBullet.speed = 10;
}
};
});
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet asset
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Set bullet speed
self.speed = 5;
// Update function called every game tick
self.update = function () {
self.y += self.speed;
// Check for collision with player
if (self.intersects(player)) {
// Add a blasting effect
var blast = self.attachAsset('blast', {
anchorX: 0.5,
anchorY: 0.5
});
blast.x = player.x;
blast.y = player.y;
game.addChild(blast);
// Destroy the blast effect after a short delay
LK.setTimeout(function () {
blast.destroy();
}, 500);
// Play blast sound effect
LK.getSound('blastSound').play();
// Play blast sound effect when player is destroyed by enemy bullet
LK.getSound('blastSound').play();
// Trigger game over when bullet hits player
LK.showGameOver();
}
};
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
// Attach player asset
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Set player speed
self.speed = 5;
// Update function called every game tick
self.update = function () {
// Player movement is handled in game.move event
};
});
/****
* Initialize Game
****/
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
var game = new LK.Game();
/****
* Game Code
****/
LK.playMusic('ourBackgroundMusic');
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
var background = game.attachAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: game.width / LK.getAsset('background', {}).width,
scaleY: game.height / LK.getAsset('background', {}).height
});
// Create a scoreboard and display it on the screen
var scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
game.update = function () {
// Spawn an enemy every 30 ticks and an asteroid every 40 ticks
if (LK.ticks % 60 == 0) {
var enemy = game.addChild(new Enemy());
// Set enemy initial position
enemy.x = Math.random() * 2048;
enemy.y = 0;
}
if (LK.ticks % 80 == 0) {
var asteroid = game.addChild(new Asteroid());
// Set asteroid initial position
asteroid.x = Math.random() * 2048;
asteroid.y = 0;
}
// Move enemies and asteroids continuously downwards
// Define a global grid object for spatial partitioning
var grid = {
width: 2048,
height: 2732,
cellSize: 100,
cells: {},
insert: function insert(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
if (!this.cells[key]) {
this.cells[key] = [];
}
this.cells[key].push(obj);
},
retrieve: function retrieve(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
return this.cells[key] || [];
},
clear: function clear() {
this.cells = {};
}
};
// Use the grid to optimize updates
grid.clear(); // Clear the grid before inserting new objects
game.children.forEach(function (child) {
if (child instanceof Enemy || child instanceof Asteroid) {
grid.insert(child);
}
});
var visibleObjects = grid.retrieve(player);
visibleObjects.forEach(function (child) {
child.y += 5;
// Destroy any object that passes behind the player
if (child.y > player.y + player.height / 2) {
child.destroy();
}
});
};
var player = game.addChild(new Player());
// Set player initial position
player.x = 1024;
player.y = 2732 - player.height / 2 - 300;
// Add mouse move event to the game
game.move = function (x, y, obj) {
// Move player only on x axis
player.x = x;
};
game.down = function (x, y, obj) {
// Create a bullet instance
// Use a bullet pool to optimize bullet creation
if (!game.bulletPool) {
game.bulletPool = [];
}
var bullet;
if (game.bulletPool.length > 0) {
bullet = game.bulletPool.pop();
bullet.visible = true;
} else {
bullet = game.addChild(new Bullet());
}
bullet.reset(); // Reset bullet properties
LK.getSound('fireBullet').play();
// Set bullet initial position to player's position
bullet.x = player.x;
bullet.y = player.y;
};
// Update the scoreboard every game tick
scoreTxt.setText(LK.getScore()); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Asteroid class
var Asteroid = Container.expand(function () {
var self = Container.call(this);
// Attach asteroid asset
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
// Set asteroid speed
self.speed = 3;
// Update function called every game tick
self.update = function () {
// Move asteroid based on speed
self.y += self.speed;
// Destroy asteroid when it gets out of player screen
if (self.y > 2732) {
self.destroy();
}
// Check for collision with player
if (self.intersects(player)) {
// Add a blasting effect
var blast = self.attachAsset('blast', {
anchorX: 0.5,
anchorY: 0.5
});
blast.x = player.x;
blast.y = player.y;
game.addChild(blast);
// Destroy the blast effect after a short delay
LK.setTimeout(function () {
blast.destroy();
}, 500);
// Play blast sound effect
LK.getSound('blastSound').play();
// Play blast sound effect
LK.getSound('blastSound').play();
// Trigger game over when asteroid hits player
LK.showGameOver();
}
};
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet asset
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Set bullet speed
self.speed = -14;
// Update function called every game tick
self.update = function () {
self.y += self.speed;
// Check for collision with enemy and asteroid
// Use spatial partitioning to optimize collision detection
// Custom grid implementation for spatial partitioning
var grid = {
width: 2048,
height: 2732,
cellSize: 100,
cells: {},
insert: function insert(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
if (!this.cells[key]) {
this.cells[key] = [];
}
this.cells[key].push(obj);
},
retrieve: function retrieve(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
return this.cells[key] || [];
},
clear: function clear() {
this.cells = {};
}
};
game.children.forEach(function (child) {
if (child instanceof Enemy || child instanceof Asteroid) {
grid.insert(child);
}
});
var nearbyTargets = grid.retrieve(self);
for (var i = 0; i < nearbyTargets.length; i++) {
var target = nearbyTargets[i];
if (self.intersects(target)) {
// Destroy target and bullet on collision
target.destroy();
self.destroy();
// Play blast sound effect
LK.getSound('blastSound').play();
// Increase score by 50 points when target dies
LK.setScore(LK.getScore() + 50);
// Update the scoreboard
scoreTxt.setText(LK.getScore());
// Add a blasting effect
var blast = self.attachAsset('blast', {
anchorX: 0.5,
anchorY: 0.5
});
blast.x = self.x;
blast.y = self.y;
game.addChild(blast);
// Destroy the blast effect after a short delay
LK.setTimeout(function () {
blast.destroy();
}, 500);
break;
}
}
// Destroy bullet when it goes past to the screen
if (self.y < 0) {
self.visible = false;
game.bulletPool.push(self);
}
};
// Add a reset method to reset bullet properties
self.reset = function () {
self.visible = true;
self.y = player.y;
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Attach enemy asset
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Set enemy speed
self.speed = 5;
// Update function called every game tick
self.update = function () {
// Move enemy based on speed
self.y += self.speed;
// Destroy enemy when it gets out of player screen
if (self.y > 2732) {
self.destroy();
}
// Enemy fires a bullet every 60 ticks
if (LK.ticks % 60 == 0) {
var enemyBullet = game.addChild(new EnemyBullet());
// Set bullet initial position to enemy's position
enemyBullet.x = self.x;
enemyBullet.y = self.y;
// Set bullet speed to move downwards
enemyBullet.speed = 10;
}
};
});
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
// Attach bullet asset
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
// Set bullet speed
self.speed = 5;
// Update function called every game tick
self.update = function () {
self.y += self.speed;
// Check for collision with player
if (self.intersects(player)) {
// Add a blasting effect
var blast = self.attachAsset('blast', {
anchorX: 0.5,
anchorY: 0.5
});
blast.x = player.x;
blast.y = player.y;
game.addChild(blast);
// Destroy the blast effect after a short delay
LK.setTimeout(function () {
blast.destroy();
}, 500);
// Play blast sound effect
LK.getSound('blastSound').play();
// Play blast sound effect when player is destroyed by enemy bullet
LK.getSound('blastSound').play();
// Trigger game over when bullet hits player
LK.showGameOver();
}
};
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
// Attach player asset
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Set player speed
self.speed = 5;
// Update function called every game tick
self.update = function () {
// Player movement is handled in game.move event
};
});
/****
* Initialize Game
****/
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
var game = new LK.Game();
/****
* Game Code
****/
LK.playMusic('ourBackgroundMusic');
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
var background = game.attachAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: game.width / LK.getAsset('background', {}).width,
scaleY: game.height / LK.getAsset('background', {}).height
});
// Create a scoreboard and display it on the screen
var scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
game.update = function () {
// Spawn an enemy every 30 ticks and an asteroid every 40 ticks
if (LK.ticks % 60 == 0) {
var enemy = game.addChild(new Enemy());
// Set enemy initial position
enemy.x = Math.random() * 2048;
enemy.y = 0;
}
if (LK.ticks % 80 == 0) {
var asteroid = game.addChild(new Asteroid());
// Set asteroid initial position
asteroid.x = Math.random() * 2048;
asteroid.y = 0;
}
// Move enemies and asteroids continuously downwards
// Define a global grid object for spatial partitioning
var grid = {
width: 2048,
height: 2732,
cellSize: 100,
cells: {},
insert: function insert(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
if (!this.cells[key]) {
this.cells[key] = [];
}
this.cells[key].push(obj);
},
retrieve: function retrieve(obj) {
var cellX = Math.floor(obj.x / this.cellSize);
var cellY = Math.floor(obj.y / this.cellSize);
var key = cellX + ',' + cellY;
return this.cells[key] || [];
},
clear: function clear() {
this.cells = {};
}
};
// Use the grid to optimize updates
grid.clear(); // Clear the grid before inserting new objects
game.children.forEach(function (child) {
if (child instanceof Enemy || child instanceof Asteroid) {
grid.insert(child);
}
});
var visibleObjects = grid.retrieve(player);
visibleObjects.forEach(function (child) {
child.y += 5;
// Destroy any object that passes behind the player
if (child.y > player.y + player.height / 2) {
child.destroy();
}
});
};
var player = game.addChild(new Player());
// Set player initial position
player.x = 1024;
player.y = 2732 - player.height / 2 - 300;
// Add mouse move event to the game
game.move = function (x, y, obj) {
// Move player only on x axis
player.x = x;
};
game.down = function (x, y, obj) {
// Create a bullet instance
// Use a bullet pool to optimize bullet creation
if (!game.bulletPool) {
game.bulletPool = [];
}
var bullet;
if (game.bulletPool.length > 0) {
bullet = game.bulletPool.pop();
bullet.visible = true;
} else {
bullet = game.addChild(new Bullet());
}
bullet.reset(); // Reset bullet properties
LK.getSound('fireBullet').play();
// Set bullet initial position to player's position
bullet.x = player.x;
bullet.y = player.y;
};
// Update the scoreboard every game tick
scoreTxt.setText(LK.getScore());
Space craft in facing forward. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
spacecraft in 4k
fire blast. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
asteroid. Single Game Texture. In-Game asset. 2d. No shadows
dark nebula galaxy 4k. Single Game Texture. In-Game asset. 2d. Blank background. No shadows