/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.shootCooldown = 0; self.shootDelay = 90; // 1.5 seconds at 60fps self.update = function () { // Look towards Spider-Man var dx = spiderMan.x - self.x; var dy = spiderMan.y - self.y; var angle = Math.atan2(dy, dx); enemyGraphics.rotation = angle; // Shooting behavior self.shootCooldown--; if (self.shootCooldown <= 0) { self.shoot(); self.shootCooldown = self.shootDelay + Math.random() * 60; // Add randomness } }; self.shoot = function () { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y; var dx = spiderMan.x - self.x; var dy = spiderMan.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); bullet.velocityX = dx / distance * 6; bullet.velocityY = dy / distance * 6; enemyBullets.push(bullet); game.addChild(bullet); }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xffffff, 200); LK.getSound('enemyHit').play(); if (self.health <= 0) { self.destroy(); return true; // Enemy died } return false; }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 25; self.velocityX = 0; self.velocityY = 0; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; // Check bounds if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.destroy(); } }; return self; }); var SpiderMan = Container.expand(function () { var self = Container.call(this); var spiderGraphics = self.attachAsset('spiderMan', { anchorX: 0.5, anchorY: 0.5 }); self.health = 200; self.maxHealth = 200; self.speed = 8; self.isSwinging = false; self.swingAnchor = null; self.swingRadius = 0; self.swingAngle = 0; self.velocityX = 0; self.velocityY = 0; self.webLine = null; self.update = function () { if (self.isSwinging && self.swingAnchor) { // Web swinging physics var dx = self.x - self.swingAnchor.x; var dy = self.y - self.swingAnchor.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.swingRadius) { // Constrain to swing radius var angle = Math.atan2(dy, dx); self.x = self.swingAnchor.x + Math.cos(angle) * self.swingRadius; self.y = self.swingAnchor.y + Math.sin(angle) * self.swingRadius; // Apply swing momentum self.velocityX += Math.cos(angle + Math.PI / 2) * 0.3; self.velocityY += 2; // Gravity } // Update web line position if (self.webLine) { self.webLine.x = (self.x + self.swingAnchor.x) / 2; self.webLine.y = (self.y + self.swingAnchor.y) / 2; var lineAngle = Math.atan2(self.swingAnchor.y - self.y, self.swingAnchor.x - self.x); self.webLine.rotation = lineAngle + Math.PI / 2; self.webLine.height = Math.sqrt(dx * dx + dy * dy); } } else { // Free fall physics self.velocityY += 0.5; // Gravity self.x += self.velocityX; self.y += self.velocityY; // Air resistance self.velocityX *= 0.98; self.velocityY *= 0.99; } // Keep Spider-Man on screen if (self.x < 40) { self.x = 40; self.velocityX = 0; } if (self.x > 2008) { self.x = 2008; self.velocityX = 0; } if (self.y > 2600) { self.y = 2600; self.velocityY = 0; } if (self.y < 40) { self.y = 40; self.velocityY = 0; } }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xff0000, 300); LK.getSound('playerHit').play(); if (self.health <= 0) { LK.showGameOver(); } }; self.startSwinging = function (attachPoint) { self.isSwinging = true; self.swingAnchor = attachPoint; var dx = self.x - attachPoint.x; var dy = self.y - attachPoint.y; self.swingRadius = Math.sqrt(dx * dx + dy * dy); // Create web line self.webLine = game.addChild(LK.getAsset('webLine', { anchorX: 0.5, anchorY: 0 })); }; self.stopSwinging = function () { self.isSwinging = false; self.swingAnchor = null; if (self.webLine) { self.webLine.destroy(); self.webLine = null; } }; return self; }); var WebProjectile = Container.expand(function () { var self = Container.call(this); var webGraphics = self.attachAsset('webProjectile', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.damage = 50; self.velocityX = 0; self.velocityY = 0; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; // Check bounds if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game variables var spiderMan; var enemies = []; var webProjectiles = []; var enemyBullets = []; var attachPoints = []; var spiderButton; var healthBar; var waveNumber = 1; var enemiesDefeated = 0; var spawnTimer = 0; // Create Spider-Man spiderMan = game.addChild(new SpiderMan()); spiderMan.x = 1024; spiderMan.y = 1800; // Create attachment points for web swinging for (var i = 0; i < 8; i++) { var attachPoint = game.addChild(LK.getAsset('attachPoint', { anchorX: 0.5, anchorY: 0.5 })); attachPoint.x = 200 + i * 250; attachPoint.y = 200 + Math.random() * 300; attachPoints.push(attachPoint); } // Create Spider button spiderButton = LK.gui.right.addChild(new Text2('SPIDER', { size: 60, fill: 0xFF0000 })); spiderButton.anchor.set(0.5, 0.5); spiderButton.x = -150; // Create health display healthBar = LK.gui.topLeft.addChild(new Text2('Health: 200', { size: 50, fill: 0xFFFFFF })); healthBar.x = 150; healthBar.y = 50; // Spawn initial enemies function spawnEnemies(count) { for (var i = 0; i < count; i++) { var enemy = new Enemy(); enemy.x = Math.random() * 1800 + 100; enemy.y = Math.random() * 400 + 300; enemies.push(enemy); game.addChild(enemy); } } spawnEnemies(3); // Touch handlers spiderButton.down = function (x, y, obj) { // Shoot web projectile var webShot = new WebProjectile(); webShot.x = spiderMan.x; webShot.y = spiderMan.y; // Find nearest enemy var nearestEnemy = null; var nearestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - spiderMan.x; var dy = enemy.y - spiderMan.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestEnemy = enemy; } } if (nearestEnemy) { var dx = nearestEnemy.x - spiderMan.x; var dy = nearestEnemy.y - spiderMan.y; var distance = Math.sqrt(dx * dx + dy * dy); webShot.velocityX = dx / distance * webShot.speed; webShot.velocityY = dy / distance * webShot.speed; } else { webShot.velocityY = -webShot.speed; } webProjectiles.push(webShot); game.addChild(webShot); LK.getSound('webShoot').play(); }; game.down = function (x, y, obj) { // Move Spider-Man to touched location spiderMan.x = x; spiderMan.y = y; // Stop any current swinging spiderMan.stopSwinging(); }; game.up = function (x, y, obj) { // No longer needed for direct movement }; // Main game loop game.update = function () { // Update health display healthBar.setText('Health: ' + spiderMan.health); // Handle web projectile collisions for (var i = webProjectiles.length - 1; i >= 0; i--) { var web = webProjectiles[i]; var webHit = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (web.intersects(enemy)) { if (enemy.takeDamage(web.damage)) { // Enemy died enemies.splice(j, 1); enemiesDefeated++; LK.setScore(LK.getScore() + 100); } web.destroy(); webProjectiles.splice(i, 1); webHit = true; break; } } } // Handle enemy bullet collisions for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; if (bullet.intersects(spiderMan)) { spiderMan.takeDamage(bullet.damage); bullet.destroy(); enemyBullets.splice(i, 1); } } // Remove destroyed objects from arrays webProjectiles = webProjectiles.filter(function (web) { return web.parent !== null; }); enemyBullets = enemyBullets.filter(function (bullet) { return bullet.parent !== null; }); // Spawn new wave when all enemies defeated if (enemies.length === 0) { spawnTimer++; if (spawnTimer > 180) { // 3 seconds waveNumber++; spawnEnemies(Math.min(2 + waveNumber, 6)); spawnTimer = 0; } } // Win condition if (enemiesDefeated >= 20) { LK.showYouWin(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.shootCooldown = 0;
self.shootDelay = 90; // 1.5 seconds at 60fps
self.update = function () {
// Look towards Spider-Man
var dx = spiderMan.x - self.x;
var dy = spiderMan.y - self.y;
var angle = Math.atan2(dy, dx);
enemyGraphics.rotation = angle;
// Shooting behavior
self.shootCooldown--;
if (self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = self.shootDelay + Math.random() * 60; // Add randomness
}
};
self.shoot = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y;
var dx = spiderMan.x - self.x;
var dy = spiderMan.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.velocityX = dx / distance * 6;
bullet.velocityY = dy / distance * 6;
enemyBullets.push(bullet);
game.addChild(bullet);
};
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xffffff, 200);
LK.getSound('enemyHit').play();
if (self.health <= 0) {
self.destroy();
return true; // Enemy died
}
return false;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.damage = 25;
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Check bounds
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.destroy();
}
};
return self;
});
var SpiderMan = Container.expand(function () {
var self = Container.call(this);
var spiderGraphics = self.attachAsset('spiderMan', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 200;
self.maxHealth = 200;
self.speed = 8;
self.isSwinging = false;
self.swingAnchor = null;
self.swingRadius = 0;
self.swingAngle = 0;
self.velocityX = 0;
self.velocityY = 0;
self.webLine = null;
self.update = function () {
if (self.isSwinging && self.swingAnchor) {
// Web swinging physics
var dx = self.x - self.swingAnchor.x;
var dy = self.y - self.swingAnchor.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > self.swingRadius) {
// Constrain to swing radius
var angle = Math.atan2(dy, dx);
self.x = self.swingAnchor.x + Math.cos(angle) * self.swingRadius;
self.y = self.swingAnchor.y + Math.sin(angle) * self.swingRadius;
// Apply swing momentum
self.velocityX += Math.cos(angle + Math.PI / 2) * 0.3;
self.velocityY += 2; // Gravity
}
// Update web line position
if (self.webLine) {
self.webLine.x = (self.x + self.swingAnchor.x) / 2;
self.webLine.y = (self.y + self.swingAnchor.y) / 2;
var lineAngle = Math.atan2(self.swingAnchor.y - self.y, self.swingAnchor.x - self.x);
self.webLine.rotation = lineAngle + Math.PI / 2;
self.webLine.height = Math.sqrt(dx * dx + dy * dy);
}
} else {
// Free fall physics
self.velocityY += 0.5; // Gravity
self.x += self.velocityX;
self.y += self.velocityY;
// Air resistance
self.velocityX *= 0.98;
self.velocityY *= 0.99;
}
// Keep Spider-Man on screen
if (self.x < 40) {
self.x = 40;
self.velocityX = 0;
}
if (self.x > 2008) {
self.x = 2008;
self.velocityX = 0;
}
if (self.y > 2600) {
self.y = 2600;
self.velocityY = 0;
}
if (self.y < 40) {
self.y = 40;
self.velocityY = 0;
}
};
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 300);
LK.getSound('playerHit').play();
if (self.health <= 0) {
LK.showGameOver();
}
};
self.startSwinging = function (attachPoint) {
self.isSwinging = true;
self.swingAnchor = attachPoint;
var dx = self.x - attachPoint.x;
var dy = self.y - attachPoint.y;
self.swingRadius = Math.sqrt(dx * dx + dy * dy);
// Create web line
self.webLine = game.addChild(LK.getAsset('webLine', {
anchorX: 0.5,
anchorY: 0
}));
};
self.stopSwinging = function () {
self.isSwinging = false;
self.swingAnchor = null;
if (self.webLine) {
self.webLine.destroy();
self.webLine = null;
}
};
return self;
});
var WebProjectile = Container.expand(function () {
var self = Container.call(this);
var webGraphics = self.attachAsset('webProjectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12;
self.damage = 50;
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Check bounds
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.destroy();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game variables
var spiderMan;
var enemies = [];
var webProjectiles = [];
var enemyBullets = [];
var attachPoints = [];
var spiderButton;
var healthBar;
var waveNumber = 1;
var enemiesDefeated = 0;
var spawnTimer = 0;
// Create Spider-Man
spiderMan = game.addChild(new SpiderMan());
spiderMan.x = 1024;
spiderMan.y = 1800;
// Create attachment points for web swinging
for (var i = 0; i < 8; i++) {
var attachPoint = game.addChild(LK.getAsset('attachPoint', {
anchorX: 0.5,
anchorY: 0.5
}));
attachPoint.x = 200 + i * 250;
attachPoint.y = 200 + Math.random() * 300;
attachPoints.push(attachPoint);
}
// Create Spider button
spiderButton = LK.gui.right.addChild(new Text2('SPIDER', {
size: 60,
fill: 0xFF0000
}));
spiderButton.anchor.set(0.5, 0.5);
spiderButton.x = -150;
// Create health display
healthBar = LK.gui.topLeft.addChild(new Text2('Health: 200', {
size: 50,
fill: 0xFFFFFF
}));
healthBar.x = 150;
healthBar.y = 50;
// Spawn initial enemies
function spawnEnemies(count) {
for (var i = 0; i < count; i++) {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 100;
enemy.y = Math.random() * 400 + 300;
enemies.push(enemy);
game.addChild(enemy);
}
}
spawnEnemies(3);
// Touch handlers
spiderButton.down = function (x, y, obj) {
// Shoot web projectile
var webShot = new WebProjectile();
webShot.x = spiderMan.x;
webShot.y = spiderMan.y;
// Find nearest enemy
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - spiderMan.x;
var dy = enemy.y - spiderMan.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
if (nearestEnemy) {
var dx = nearestEnemy.x - spiderMan.x;
var dy = nearestEnemy.y - spiderMan.y;
var distance = Math.sqrt(dx * dx + dy * dy);
webShot.velocityX = dx / distance * webShot.speed;
webShot.velocityY = dy / distance * webShot.speed;
} else {
webShot.velocityY = -webShot.speed;
}
webProjectiles.push(webShot);
game.addChild(webShot);
LK.getSound('webShoot').play();
};
game.down = function (x, y, obj) {
// Move Spider-Man to touched location
spiderMan.x = x;
spiderMan.y = y;
// Stop any current swinging
spiderMan.stopSwinging();
};
game.up = function (x, y, obj) {
// No longer needed for direct movement
};
// Main game loop
game.update = function () {
// Update health display
healthBar.setText('Health: ' + spiderMan.health);
// Handle web projectile collisions
for (var i = webProjectiles.length - 1; i >= 0; i--) {
var web = webProjectiles[i];
var webHit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (web.intersects(enemy)) {
if (enemy.takeDamage(web.damage)) {
// Enemy died
enemies.splice(j, 1);
enemiesDefeated++;
LK.setScore(LK.getScore() + 100);
}
web.destroy();
webProjectiles.splice(i, 1);
webHit = true;
break;
}
}
}
// Handle enemy bullet collisions
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.intersects(spiderMan)) {
spiderMan.takeDamage(bullet.damage);
bullet.destroy();
enemyBullets.splice(i, 1);
}
}
// Remove destroyed objects from arrays
webProjectiles = webProjectiles.filter(function (web) {
return web.parent !== null;
});
enemyBullets = enemyBullets.filter(function (bullet) {
return bullet.parent !== null;
});
// Spawn new wave when all enemies defeated
if (enemies.length === 0) {
spawnTimer++;
if (spawnTimer > 180) {
// 3 seconds
waveNumber++;
spawnEnemies(Math.min(2 + waveNumber, 6));
spawnTimer = 0;
}
}
// Win condition
if (enemiesDefeated >= 20) {
LK.showYouWin();
}
};