/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bullet = Container.expand(function (type) {
var self = Container.call(this);
var bulletSprite = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 'normal';
self.speed = 20;
if (self.type === 'special') {
bulletSprite.tint = 0x00ffff;
bulletSprite.scaleX = 1.5;
bulletSprite.scaleY = 1.5;
self.damage = 3;
} else {
self.damage = 1;
}
self.update = function () {
self.x += self.speed;
// Check if bullet is off screen
if (self.x > 2200) {
self.destroy();
var index = bullets.indexOf(self);
if (index !== -1) {
bullets.splice(index, 1);
}
}
// Check for enemy collision
for (var i = enemies.length - 1; i >= 0; i--) {
if (self.intersects(enemies[i])) {
enemies[i].takeDamage(self.damage);
LK.getSound('hit').play();
// Remove bullet unless it's a special that can pierce
if (self.type !== 'special' || self.damage <= 0) {
self.destroy();
var index = bullets.indexOf(self);
if (index !== -1) {
bullets.splice(index, 1);
}
break;
} else {
// Special bullets can hit multiple enemies but lose power
self.damage -= 1;
}
}
}
};
return self;
});
var Doraemon = Container.expand(function () {
var self = Container.call(this);
var doraemonSprite = self.attachAsset('doraemon', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.isJumping = false;
self.jumpVelocity = 0;
self.canShoot = true;
self.gadgets = 100;
self.currentGadget = 'normal';
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.jumpVelocity = -25;
}
};
self.shoot = function () {
if (self.canShoot && self.gadgets > 0) {
self.gadgets -= 1;
self.canShoot = false;
var bullet = new Bullet(self.currentGadget);
bullet.x = self.x + 50;
bullet.y = self.y;
game.addChild(bullet);
bullets.push(bullet);
LK.getSound('shoot').play();
LK.setTimeout(function () {
self.canShoot = true;
}, 300);
return bullet;
}
return null;
};
self.takeDamage = function () {
self.health -= 1;
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
LK.showGameOver();
}
};
self.collectPowerup = function (type) {
LK.getSound('powerup').play();
if (type === 'health') {
self.health = Math.min(self.health + 1, 5);
} else if (type === 'gadget') {
self.gadgets += 20;
} else if (type === 'special') {
self.currentGadget = 'special';
LK.setTimeout(function () {
self.currentGadget = 'normal';
}, 10000);
}
};
self.update = function () {
if (self.isJumping) {
self.y += self.jumpVelocity;
self.jumpVelocity += 1;
// Check if landed on platform
if (self.y >= platformY - 150) {
self.y = platformY - 150;
self.isJumping = false;
self.jumpVelocity = 0;
}
}
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var enemySprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
if (type === 'fast') {
enemySprite.scaleX = 0.8;
enemySprite.scaleY = 0.8;
self.speed = -12;
self.health = 1;
} else if (type === 'strong') {
enemySprite.scaleX = 1.3;
enemySprite.scaleY = 1.3;
self.speed = -5;
self.health = 3;
} else {
// Normal enemy
self.speed = -8;
self.health = 1;
}
self.type = type || 'normal';
self.update = function () {
self.x += self.speed;
// Check if enemy is off screen
if (self.x < -200) {
self.destroy();
var index = enemies.indexOf(self);
if (index !== -1) {
enemies.splice(index, 1);
player.takeDamage();
}
}
};
self.takeDamage = function (damage) {
self.health -= damage || 1;
LK.effects.flashObject(self, 0xffffff, 200);
if (self.health <= 0) {
LK.getSound('enemyDefeat').play();
LK.setScore(LK.getScore() + (self.type === 'strong' ? 3 : 1));
scoreText.setText(LK.getScore());
// Chance to drop a powerup
if (Math.random() < 0.3) {
var powerupTypes = ['health', 'gadget', 'special'];
var type = powerupTypes[Math.floor(Math.random() * powerupTypes.length)];
var powerup = new Powerup(type);
powerup.x = self.x;
powerup.y = self.y;
game.addChild(powerup);
powerups.push(powerup);
}
self.destroy();
var index = enemies.indexOf(self);
if (index !== -1) {
enemies.splice(index, 1);
}
}
};
return self;
});
var Powerup = Container.expand(function (type) {
var self = Container.call(this);
var powerupSprite = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 'gadget';
if (self.type === 'health') {
powerupSprite.tint = 0xff0000;
} else if (self.type === 'special') {
powerupSprite.tint = 0x00ffff;
}
self.speed = -3;
self.ySpeed = 0;
self.bounceHeight = 5;
self.update = function () {
self.x += self.speed;
self.y += self.ySpeed;
// Bouncing effect
self.ySpeed += 0.2;
if (self.y >= platformY - 35) {
self.y = platformY - 35;
self.ySpeed = -self.bounceHeight;
}
// Check if powerup is off screen
if (self.x < -100) {
self.destroy();
var index = powerups.indexOf(self);
if (index !== -1) {
powerups.splice(index, 1);
}
}
// Check for player collision
if (self.intersects(player)) {
player.collectPowerup(self.type);
self.destroy();
var index = powerups.indexOf(self);
if (index !== -1) {
powerups.splice(index, 1);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Game constants
var platformY = 2500;
// Game variables
var player;
var enemies = [];
var bullets = [];
var powerups = [];
var spawnRate = 2000; // milliseconds
var waveCounter = 0;
var dragNode = null;
// Create background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Create platform
var platform = game.addChild(LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: platformY
}));
platform.scaleX = 5; // Make platform wider
// Create player
player = game.addChild(new Doraemon());
player.x = 300;
player.y = platformY - 150;
// Create score display
var scoreText = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.setText('Score: ' + LK.getScore());
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create health display
var healthText = new Text2('Health: 3', {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
healthText.x = 100;
LK.gui.topRight.addChild(healthText);
// Create gadget meter
var gadgetText = new Text2('Gadgets: 100', {
size: 60,
fill: 0xFFCC00
});
gadgetText.anchor.set(0, 0);
gadgetText.x = 100;
gadgetText.y = 70;
LK.gui.topRight.addChild(gadgetText);
// Start spawning enemies
var spawnTimer = LK.setInterval(function () {
spawnEnemy();
}, spawnRate);
// Increase difficulty over time
var difficultyTimer = LK.setInterval(function () {
waveCounter++;
if (spawnRate > 500) {
spawnRate -= 100;
LK.clearInterval(spawnTimer);
spawnTimer = LK.setInterval(function () {
spawnEnemy();
}, spawnRate);
}
// Show wave notification
var waveText = new Text2('Wave ' + waveCounter + '!', {
size: 120,
fill: 0xFF0000
});
waveText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(waveText);
tween(waveText, {
alpha: 0
}, {
duration: 2000,
onFinish: function onFinish() {
waveText.destroy();
}
});
}, 20000);
function spawnEnemy() {
var types = ['normal', 'normal', 'normal', 'fast', 'strong'];
var randomType = types[Math.floor(Math.random() * types.length)];
// Higher chance of stronger enemies in later waves
if (waveCounter > 3) {
if (Math.random() < 0.4) {
randomType = 'fast';
}
if (waveCounter > 5 && Math.random() < 0.3) {
randomType = 'strong';
}
}
var enemy = new Enemy(randomType);
enemy.x = 2200;
enemy.y = platformY - 150 - Math.random() * 300; // Spawn at different heights
game.addChild(enemy);
enemies.push(enemy);
}
// Game input handlers
game.down = function (x, y, obj) {
// Shoot when tapping
player.shoot();
// Allow jumping by tapping above player
if (y < player.y) {
player.jump();
}
// Start dragging when tapping player
var bounds = new Rectangle(player.x - player.width / 2, player.y - player.height / 2, player.width, player.height);
if (bounds.contains(x, y)) {
dragNode = player;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.move = function (x, y, obj) {
if (dragNode) {
// Only allow horizontal movement within bounds
dragNode.x = Math.max(100, Math.min(x, 1500));
}
};
// Game update function
game.update = function () {
// Update score display
scoreText.setText('Score: ' + LK.getScore());
// Update health display
healthText.setText('Health: ' + player.health);
// Update gadget display
gadgetText.setText('Gadgets: ' + player.gadgets);
// Special gadget indicator
if (player.currentGadget === 'special') {
gadgetText.tint = 0x00ffff;
} else {
gadgetText.tint = 0xffffff;
}
// Auto-regenerate gadgets
if (LK.ticks % 60 === 0) {
player.gadgets += 1;
}
// Check for game over
if (player.health <= 0) {
LK.showGameOver();
}
// Update all game objects
for (var i = bullets.length - 1; i >= 0; i--) {
bullets[i].update();
}
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
}
for (var i = powerups.length - 1; i >= 0; i--) {
powerups[i].update();
}
player.update();
};
// Play background music
LK.playMusic('bgMusic'); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bullet = Container.expand(function (type) {
var self = Container.call(this);
var bulletSprite = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 'normal';
self.speed = 20;
if (self.type === 'special') {
bulletSprite.tint = 0x00ffff;
bulletSprite.scaleX = 1.5;
bulletSprite.scaleY = 1.5;
self.damage = 3;
} else {
self.damage = 1;
}
self.update = function () {
self.x += self.speed;
// Check if bullet is off screen
if (self.x > 2200) {
self.destroy();
var index = bullets.indexOf(self);
if (index !== -1) {
bullets.splice(index, 1);
}
}
// Check for enemy collision
for (var i = enemies.length - 1; i >= 0; i--) {
if (self.intersects(enemies[i])) {
enemies[i].takeDamage(self.damage);
LK.getSound('hit').play();
// Remove bullet unless it's a special that can pierce
if (self.type !== 'special' || self.damage <= 0) {
self.destroy();
var index = bullets.indexOf(self);
if (index !== -1) {
bullets.splice(index, 1);
}
break;
} else {
// Special bullets can hit multiple enemies but lose power
self.damage -= 1;
}
}
}
};
return self;
});
var Doraemon = Container.expand(function () {
var self = Container.call(this);
var doraemonSprite = self.attachAsset('doraemon', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.isJumping = false;
self.jumpVelocity = 0;
self.canShoot = true;
self.gadgets = 100;
self.currentGadget = 'normal';
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.jumpVelocity = -25;
}
};
self.shoot = function () {
if (self.canShoot && self.gadgets > 0) {
self.gadgets -= 1;
self.canShoot = false;
var bullet = new Bullet(self.currentGadget);
bullet.x = self.x + 50;
bullet.y = self.y;
game.addChild(bullet);
bullets.push(bullet);
LK.getSound('shoot').play();
LK.setTimeout(function () {
self.canShoot = true;
}, 300);
return bullet;
}
return null;
};
self.takeDamage = function () {
self.health -= 1;
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
LK.showGameOver();
}
};
self.collectPowerup = function (type) {
LK.getSound('powerup').play();
if (type === 'health') {
self.health = Math.min(self.health + 1, 5);
} else if (type === 'gadget') {
self.gadgets += 20;
} else if (type === 'special') {
self.currentGadget = 'special';
LK.setTimeout(function () {
self.currentGadget = 'normal';
}, 10000);
}
};
self.update = function () {
if (self.isJumping) {
self.y += self.jumpVelocity;
self.jumpVelocity += 1;
// Check if landed on platform
if (self.y >= platformY - 150) {
self.y = platformY - 150;
self.isJumping = false;
self.jumpVelocity = 0;
}
}
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var enemySprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
if (type === 'fast') {
enemySprite.scaleX = 0.8;
enemySprite.scaleY = 0.8;
self.speed = -12;
self.health = 1;
} else if (type === 'strong') {
enemySprite.scaleX = 1.3;
enemySprite.scaleY = 1.3;
self.speed = -5;
self.health = 3;
} else {
// Normal enemy
self.speed = -8;
self.health = 1;
}
self.type = type || 'normal';
self.update = function () {
self.x += self.speed;
// Check if enemy is off screen
if (self.x < -200) {
self.destroy();
var index = enemies.indexOf(self);
if (index !== -1) {
enemies.splice(index, 1);
player.takeDamage();
}
}
};
self.takeDamage = function (damage) {
self.health -= damage || 1;
LK.effects.flashObject(self, 0xffffff, 200);
if (self.health <= 0) {
LK.getSound('enemyDefeat').play();
LK.setScore(LK.getScore() + (self.type === 'strong' ? 3 : 1));
scoreText.setText(LK.getScore());
// Chance to drop a powerup
if (Math.random() < 0.3) {
var powerupTypes = ['health', 'gadget', 'special'];
var type = powerupTypes[Math.floor(Math.random() * powerupTypes.length)];
var powerup = new Powerup(type);
powerup.x = self.x;
powerup.y = self.y;
game.addChild(powerup);
powerups.push(powerup);
}
self.destroy();
var index = enemies.indexOf(self);
if (index !== -1) {
enemies.splice(index, 1);
}
}
};
return self;
});
var Powerup = Container.expand(function (type) {
var self = Container.call(this);
var powerupSprite = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 'gadget';
if (self.type === 'health') {
powerupSprite.tint = 0xff0000;
} else if (self.type === 'special') {
powerupSprite.tint = 0x00ffff;
}
self.speed = -3;
self.ySpeed = 0;
self.bounceHeight = 5;
self.update = function () {
self.x += self.speed;
self.y += self.ySpeed;
// Bouncing effect
self.ySpeed += 0.2;
if (self.y >= platformY - 35) {
self.y = platformY - 35;
self.ySpeed = -self.bounceHeight;
}
// Check if powerup is off screen
if (self.x < -100) {
self.destroy();
var index = powerups.indexOf(self);
if (index !== -1) {
powerups.splice(index, 1);
}
}
// Check for player collision
if (self.intersects(player)) {
player.collectPowerup(self.type);
self.destroy();
var index = powerups.indexOf(self);
if (index !== -1) {
powerups.splice(index, 1);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Game constants
var platformY = 2500;
// Game variables
var player;
var enemies = [];
var bullets = [];
var powerups = [];
var spawnRate = 2000; // milliseconds
var waveCounter = 0;
var dragNode = null;
// Create background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Create platform
var platform = game.addChild(LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: platformY
}));
platform.scaleX = 5; // Make platform wider
// Create player
player = game.addChild(new Doraemon());
player.x = 300;
player.y = platformY - 150;
// Create score display
var scoreText = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.setText('Score: ' + LK.getScore());
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create health display
var healthText = new Text2('Health: 3', {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
healthText.x = 100;
LK.gui.topRight.addChild(healthText);
// Create gadget meter
var gadgetText = new Text2('Gadgets: 100', {
size: 60,
fill: 0xFFCC00
});
gadgetText.anchor.set(0, 0);
gadgetText.x = 100;
gadgetText.y = 70;
LK.gui.topRight.addChild(gadgetText);
// Start spawning enemies
var spawnTimer = LK.setInterval(function () {
spawnEnemy();
}, spawnRate);
// Increase difficulty over time
var difficultyTimer = LK.setInterval(function () {
waveCounter++;
if (spawnRate > 500) {
spawnRate -= 100;
LK.clearInterval(spawnTimer);
spawnTimer = LK.setInterval(function () {
spawnEnemy();
}, spawnRate);
}
// Show wave notification
var waveText = new Text2('Wave ' + waveCounter + '!', {
size: 120,
fill: 0xFF0000
});
waveText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(waveText);
tween(waveText, {
alpha: 0
}, {
duration: 2000,
onFinish: function onFinish() {
waveText.destroy();
}
});
}, 20000);
function spawnEnemy() {
var types = ['normal', 'normal', 'normal', 'fast', 'strong'];
var randomType = types[Math.floor(Math.random() * types.length)];
// Higher chance of stronger enemies in later waves
if (waveCounter > 3) {
if (Math.random() < 0.4) {
randomType = 'fast';
}
if (waveCounter > 5 && Math.random() < 0.3) {
randomType = 'strong';
}
}
var enemy = new Enemy(randomType);
enemy.x = 2200;
enemy.y = platformY - 150 - Math.random() * 300; // Spawn at different heights
game.addChild(enemy);
enemies.push(enemy);
}
// Game input handlers
game.down = function (x, y, obj) {
// Shoot when tapping
player.shoot();
// Allow jumping by tapping above player
if (y < player.y) {
player.jump();
}
// Start dragging when tapping player
var bounds = new Rectangle(player.x - player.width / 2, player.y - player.height / 2, player.width, player.height);
if (bounds.contains(x, y)) {
dragNode = player;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.move = function (x, y, obj) {
if (dragNode) {
// Only allow horizontal movement within bounds
dragNode.x = Math.max(100, Math.min(x, 1500));
}
};
// Game update function
game.update = function () {
// Update score display
scoreText.setText('Score: ' + LK.getScore());
// Update health display
healthText.setText('Health: ' + player.health);
// Update gadget display
gadgetText.setText('Gadgets: ' + player.gadgets);
// Special gadget indicator
if (player.currentGadget === 'special') {
gadgetText.tint = 0x00ffff;
} else {
gadgetText.tint = 0xffffff;
}
// Auto-regenerate gadgets
if (LK.ticks % 60 === 0) {
player.gadgets += 1;
}
// Check for game over
if (player.health <= 0) {
LK.showGameOver();
}
// Update all game objects
for (var i = bullets.length - 1; i >= 0; i--) {
bullets[i].update();
}
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
}
for (var i = powerups.length - 1; i >= 0; i--) {
powerups[i].update();
}
player.update();
};
// Play background music
LK.playMusic('bgMusic');
Bullet gun. In-Game asset. 2d. High contrast. No shadows
Doraemon gadget. In-Game asset. 2d. High contrast. No shadows
Powerup. In-Game asset. 2d. High contrast. No shadows
Platform. In-Game asset. 2d. High contrast. No shadows
Doraemon shooting a gun. In-Game asset. 2d. High contrast. No shadows
Background war. In-Game asset. 2d. No shadows
Enemy. In-Game asset. 2d. No shadows