/****
* 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.velocity = {
x: 0,
y: 0
};
self.lifetime = 120;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.lifetime--;
if (self.lifetime <= 0 || self.x > 2100 || self.x < -50) {
self.destroy();
for (var i = bullets.length - 1; i >= 0; i--) {
if (bullets[i] === self) {
bullets.splice(i, 1);
break;
}
}
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 1
});
self.velocity = {
x: -2,
y: 0
};
self.health = 1;
self.patrolDistance = 150;
self.startX = 0;
self.onGround = false;
self.update = function () {
// Apply gravity
if (!self.onGround) {
self.velocity.y += 1.2;
}
// Simple patrol movement
if (Math.abs(self.x - self.startX) > self.patrolDistance) {
self.velocity.x *= -1;
}
// Apply velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Remove if fallen off screen
if (self.y > 2800) {
self.destroy();
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
}
};
self.takeDamage = function () {
self.health--;
if (self.health <= 0) {
LK.effects.flashObject(self, 0xffffff, 300);
LK.getSound('enemyDeath').play();
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
self.destroy();
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
}
};
return self;
});
var Goal = Container.expand(function () {
var self = Container.call(this);
var goalGraphics = self.attachAsset('goal', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
goalGraphics.rotation += 0.05;
};
return self;
});
var Gold = Container.expand(function () {
var self = Container.call(this);
// Create gold visual using a yellow circle
var goldGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
goldGraphics.tint = 0xFFD700; // Gold color
goldGraphics.width = 30;
goldGraphics.height = 30;
self.update = function () {
goldGraphics.rotation += 0.1; // Spinning animation
};
return self;
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 1
});
self.velocity = {
x: 0,
y: 0
};
self.onGround = false;
self.health = 3;
self.maxHealth = 3;
self.moveSpeed = 8;
self.jumpPower = -30;
self.canAttack = true;
self.attackCooldown = 0;
self.update = function () {
// Apply gravity
if (!self.onGround) {
self.velocity.y += 1.2;
}
// Apply velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Handle attack cooldown
if (self.attackCooldown > 0) {
self.attackCooldown--;
if (self.attackCooldown === 0) {
self.canAttack = true;
}
}
// Keep hero in bounds
if (self.x < 40) self.x = 40;
if (self.x > 2008) self.x = 2008;
// Check if fallen off screen
if (self.y > 2800) {
self.takeDamage(1);
self.respawn();
}
};
self.jump = function () {
if (self.onGround) {
self.velocity.y = self.jumpPower;
self.onGround = false;
LK.getSound('jump').play();
}
};
self.attack = function () {
if (self.canAttack) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y - 40;
bullet.velocity.x = 12;
bullets.push(bullet);
game.addChild(bullet);
self.canAttack = false;
self.attackCooldown = 20;
LK.getSound('attack').play();
}
};
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('hit').play();
if (self.health <= 0) {
LK.showGameOver();
}
updateHealthDisplay();
};
self.respawn = function () {
self.x = spawnPoint.x;
self.y = spawnPoint.y;
self.velocity.x = 0;
self.velocity.y = 0;
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Spike = Container.expand(function () {
var self = Container.call(this);
var spikeGraphics = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var hero;
var enemies = [];
var platforms = [];
var spikes = [];
var bullets = [];
var golds = [];
var totalGolds = 0;
var collectedGolds = 0;
var goal;
var spawnPoint = {
x: 200,
y: 2400
};
var currentLevel = 1;
var leftPressed = false;
var rightPressed = false;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('Health: 3/3', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = -300;
LK.gui.topRight.addChild(healthText);
var levelText = new Text2('Level 1', {
size: 80,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var goldText = new Text2('Gold: 0/0', {
size: 60,
fill: 0xFFD700
});
goldText.anchor.set(0, 0);
goldText.x = -600;
LK.gui.topRight.addChild(goldText);
// Control buttons
var leftButton = new Text2('◀', {
size: 120,
fill: 0xFFFFFF
});
leftButton.anchor.set(0.5, 0.5);
leftButton.alpha = 0.7;
leftButton.x = 150;
leftButton.y = -150;
LK.gui.bottomLeft.addChild(leftButton);
var rightButton = new Text2('▶', {
size: 120,
fill: 0xFFFFFF
});
rightButton.anchor.set(0.5, 0.5);
rightButton.x = 300;
rightButton.y = -150;
LK.gui.bottomLeft.addChild(rightButton);
var jumpButton = new Text2('▲', {
size: 120,
fill: 0xFFFFFF
});
jumpButton.anchor.set(0.5, 0.5);
jumpButton.alpha = 0.7;
jumpButton.x = 450;
jumpButton.y = -150;
LK.gui.bottomLeft.addChild(jumpButton);
function updateHealthDisplay() {
healthText.setText('Health: ' + hero.health + '/' + hero.maxHealth);
}
function createGold(x, y) {
var gold = new Gold();
gold.x = x;
gold.y = y;
golds.push(gold);
game.addChild(gold);
totalGolds++;
}
function updateGoldDisplay() {
goldText.setText('Gold: ' + collectedGolds + '/' + totalGolds);
}
function createLevel1() {
// Reset gold counters
collectedGolds = 0;
totalGolds = 0;
// Ground platforms
createPlatform(200, 2500);
createPlatform(600, 2400);
createPlatform(1000, 2300);
createPlatform(1400, 2200);
createPlatform(1800, 2100);
// Some floating platforms
createPlatform(400, 2200);
createPlatform(800, 2000);
createPlatform(1200, 1800);
// Place gold on certain platforms
createGold(600, 2350); // On second platform
createGold(1000, 2250); // On third platform
createGold(800, 1950); // On floating platform
createGold(1200, 1750); // On highest platform
// Spikes
createSpike(500, 2500);
createSpike(900, 2300);
createSpike(1300, 2200);
// Enemies
createEnemy(700, 2360);
createEnemy(1100, 2260);
createEnemy(1500, 2160);
// Goal
goal = new Goal();
goal.x = 1800;
goal.y = 2000;
game.addChild(goal);
updateGoldDisplay();
}
function createPlatform(x, y) {
var platform = new Platform();
platform.x = x;
platform.y = y;
platforms.push(platform);
game.addChild(platform);
}
function createSpike(x, y) {
var spike = new Spike();
spike.x = x;
spike.y = y;
spikes.push(spike);
game.addChild(spike);
}
function createEnemy(x, y) {
var enemy = new Enemy();
enemy.x = x;
enemy.y = y;
enemy.startX = x;
enemies.push(enemy);
game.addChild(enemy);
}
function checkPlatformCollisions(obj) {
obj.onGround = false;
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
if (obj.intersects(platform)) {
var objBottom = obj.y;
var objTop = obj.y - 80;
var objLeft = obj.x - 40;
var objRight = obj.x + 40;
var platformTop = platform.y - 20;
var platformBottom = platform.y + 20;
var platformLeft = platform.x - 100;
var platformRight = platform.x + 100;
// Landing on top
if (obj.velocity.y > 0 && objBottom > platformTop && objTop < platformTop) {
obj.y = platformTop;
obj.velocity.y = 0;
obj.onGround = true;
}
// Hitting from below
else if (obj.velocity.y < 0 && objTop < platformBottom && objBottom > platformBottom) {
obj.y = platformBottom + 80;
obj.velocity.y = 0;
}
// Hitting from left
else if (obj.velocity.x > 0 && objRight > platformLeft && objLeft < platformLeft) {
obj.x = platformLeft - 40;
obj.velocity.x = 0;
}
// Hitting from right
else if (obj.velocity.x < 0 && objLeft < platformRight && objRight > platformRight) {
obj.x = platformRight + 40;
obj.velocity.x = 0;
}
}
}
}
function nextLevel() {
currentLevel++;
levelText.setText('Level ' + currentLevel);
// Clear current level
for (var i = 0; i < enemies.length; i++) {
enemies[i].destroy();
}
enemies = [];
for (var j = 0; j < platforms.length; j++) {
platforms[j].destroy();
}
platforms = [];
for (var k = 0; k < spikes.length; k++) {
spikes[k].destroy();
}
spikes = [];
for (var l = 0; l < golds.length; l++) {
golds[l].destroy();
}
golds = [];
if (goal) {
goal.destroy();
}
// Create new level (simple progression)
createLevel1(); // For now, recreate same level with more difficulty
// Reset hero position
hero.x = spawnPoint.x;
hero.y = spawnPoint.y;
hero.velocity.x = 0;
hero.velocity.y = 0;
}
// Initialize hero
hero = new Hero();
hero.x = spawnPoint.x;
hero.y = spawnPoint.y;
game.addChild(hero);
// Create first level
createLevel1();
updateHealthDisplay();
// Input handling
leftButton.down = function (x, y, obj) {
leftPressed = true;
leftButton.alpha = 1.0;
};
leftButton.up = function (x, y, obj) {
leftPressed = false;
leftButton.alpha = 0.7;
};
rightButton.down = function (x, y, obj) {
rightPressed = true;
rightButton.alpha = 1.0;
};
rightButton.up = function (x, y, obj) {
rightPressed = false;
rightButton.alpha = 0.7;
};
jumpButton.down = function (x, y, obj) {
hero.jump();
jumpButton.alpha = 1.0;
};
jumpButton.up = function (x, y, obj) {
jumpButton.alpha = 0.7;
};
// Keep attack functionality on main game area
game.down = function (x, y, obj) {
// Only handle attack when touching the main game area (not buttons)
var gameLocalPos = game.toLocal({
x: x,
y: y
});
if (gameLocalPos.x > 300 && gameLocalPos.x < 1748 && gameLocalPos.y < 2000) {
hero.attack();
}
};
game.update = function () {
// Handle hero movement input
hero.velocity.x = 0;
if (leftPressed) {
hero.velocity.x = -hero.moveSpeed;
}
if (rightPressed) {
hero.velocity.x = hero.moveSpeed;
}
// Check platform collisions for hero
checkPlatformCollisions(hero);
// Check platform collisions for enemies
for (var i = 0; i < enemies.length; i++) {
checkPlatformCollisions(enemies[i]);
}
// Check hero-enemy collisions
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
if (hero.intersects(enemy)) {
if (!hero.lastEnemyCollision || hero.lastEnemyCollision !== enemy) {
hero.takeDamage(1);
hero.lastEnemyCollision = enemy;
// Knockback
if (hero.x < enemy.x) {
hero.velocity.x = -15;
} else {
hero.velocity.x = 15;
}
}
}
}
// Reset collision tracking
if (hero.lastEnemyCollision) {
var stillColliding = false;
for (var k = 0; k < enemies.length; k++) {
if (enemies[k] === hero.lastEnemyCollision && hero.intersects(enemies[k])) {
stillColliding = true;
break;
}
}
if (!stillColliding) {
hero.lastEnemyCollision = null;
}
}
// Check hero-spike collisions
for (var l = 0; l < spikes.length; l++) {
var spike = spikes[l];
if (hero.intersects(spike)) {
if (!hero.lastSpikeCollision || hero.lastSpikeCollision !== spike) {
hero.takeDamage(1);
hero.lastSpikeCollision = spike;
}
}
}
// Reset spike collision tracking
if (hero.lastSpikeCollision) {
var stillCollidingSpike = hero.intersects(hero.lastSpikeCollision);
if (!stillCollidingSpike) {
hero.lastSpikeCollision = null;
}
}
// Check bullet-enemy collisions
for (var m = bullets.length - 1; m >= 0; m--) {
var bullet = bullets[m];
var hitEnemy = false;
for (var n = 0; n < enemies.length; n++) {
var enemy2 = enemies[n];
if (bullet.intersects(enemy2)) {
enemy2.takeDamage();
bullet.destroy();
bullets.splice(m, 1);
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
// Check bullet-platform collisions
for (var o = 0; o < platforms.length; o++) {
if (bullet.intersects(platforms[o])) {
bullet.destroy();
bullets.splice(m, 1);
break;
}
}
}
}
// Check hero-gold collisions
for (var p = golds.length - 1; p >= 0; p--) {
var gold = golds[p];
if (hero.intersects(gold)) {
collectedGolds++;
updateGoldDisplay();
LK.setScore(LK.getScore() + 50);
scoreText.setText('Score: ' + LK.getScore());
gold.destroy();
golds.splice(p, 1);
}
}
// Check goal collision
if (goal && hero.intersects(goal)) {
if (collectedGolds < totalGolds) {
// Show warning message if not all golds collected
if (!hero.lastGoalWarning || LK.ticks - hero.lastGoalWarning > 120) {
// Create warning text
var warningText = new Text2('Önce tüm altınları topla!', {
size: 80,
fill: 0xFF0000
});
warningText.anchor.set(0.5, 0.5);
warningText.x = hero.x;
warningText.y = hero.y - 150;
game.addChild(warningText);
// Remove warning after 2 seconds
LK.setTimeout(function () {
if (warningText.parent) {
warningText.destroy();
}
}, 2000);
hero.lastGoalWarning = LK.ticks;
}
} else if (enemies.length === 0) {
LK.setScore(LK.getScore() + 100);
scoreText.setText('Score: ' + LK.getScore());
if (currentLevel >= 3) {
LK.showYouWin();
} else {
nextLevel();
}
}
}
}; /****
* 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.velocity = {
x: 0,
y: 0
};
self.lifetime = 120;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.lifetime--;
if (self.lifetime <= 0 || self.x > 2100 || self.x < -50) {
self.destroy();
for (var i = bullets.length - 1; i >= 0; i--) {
if (bullets[i] === self) {
bullets.splice(i, 1);
break;
}
}
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 1
});
self.velocity = {
x: -2,
y: 0
};
self.health = 1;
self.patrolDistance = 150;
self.startX = 0;
self.onGround = false;
self.update = function () {
// Apply gravity
if (!self.onGround) {
self.velocity.y += 1.2;
}
// Simple patrol movement
if (Math.abs(self.x - self.startX) > self.patrolDistance) {
self.velocity.x *= -1;
}
// Apply velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Remove if fallen off screen
if (self.y > 2800) {
self.destroy();
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
}
};
self.takeDamage = function () {
self.health--;
if (self.health <= 0) {
LK.effects.flashObject(self, 0xffffff, 300);
LK.getSound('enemyDeath').play();
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
self.destroy();
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
}
};
return self;
});
var Goal = Container.expand(function () {
var self = Container.call(this);
var goalGraphics = self.attachAsset('goal', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
goalGraphics.rotation += 0.05;
};
return self;
});
var Gold = Container.expand(function () {
var self = Container.call(this);
// Create gold visual using a yellow circle
var goldGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
goldGraphics.tint = 0xFFD700; // Gold color
goldGraphics.width = 30;
goldGraphics.height = 30;
self.update = function () {
goldGraphics.rotation += 0.1; // Spinning animation
};
return self;
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 1
});
self.velocity = {
x: 0,
y: 0
};
self.onGround = false;
self.health = 3;
self.maxHealth = 3;
self.moveSpeed = 8;
self.jumpPower = -30;
self.canAttack = true;
self.attackCooldown = 0;
self.update = function () {
// Apply gravity
if (!self.onGround) {
self.velocity.y += 1.2;
}
// Apply velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Handle attack cooldown
if (self.attackCooldown > 0) {
self.attackCooldown--;
if (self.attackCooldown === 0) {
self.canAttack = true;
}
}
// Keep hero in bounds
if (self.x < 40) self.x = 40;
if (self.x > 2008) self.x = 2008;
// Check if fallen off screen
if (self.y > 2800) {
self.takeDamage(1);
self.respawn();
}
};
self.jump = function () {
if (self.onGround) {
self.velocity.y = self.jumpPower;
self.onGround = false;
LK.getSound('jump').play();
}
};
self.attack = function () {
if (self.canAttack) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y - 40;
bullet.velocity.x = 12;
bullets.push(bullet);
game.addChild(bullet);
self.canAttack = false;
self.attackCooldown = 20;
LK.getSound('attack').play();
}
};
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('hit').play();
if (self.health <= 0) {
LK.showGameOver();
}
updateHealthDisplay();
};
self.respawn = function () {
self.x = spawnPoint.x;
self.y = spawnPoint.y;
self.velocity.x = 0;
self.velocity.y = 0;
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Spike = Container.expand(function () {
var self = Container.call(this);
var spikeGraphics = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var hero;
var enemies = [];
var platforms = [];
var spikes = [];
var bullets = [];
var golds = [];
var totalGolds = 0;
var collectedGolds = 0;
var goal;
var spawnPoint = {
x: 200,
y: 2400
};
var currentLevel = 1;
var leftPressed = false;
var rightPressed = false;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('Health: 3/3', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = -300;
LK.gui.topRight.addChild(healthText);
var levelText = new Text2('Level 1', {
size: 80,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var goldText = new Text2('Gold: 0/0', {
size: 60,
fill: 0xFFD700
});
goldText.anchor.set(0, 0);
goldText.x = -600;
LK.gui.topRight.addChild(goldText);
// Control buttons
var leftButton = new Text2('◀', {
size: 120,
fill: 0xFFFFFF
});
leftButton.anchor.set(0.5, 0.5);
leftButton.alpha = 0.7;
leftButton.x = 150;
leftButton.y = -150;
LK.gui.bottomLeft.addChild(leftButton);
var rightButton = new Text2('▶', {
size: 120,
fill: 0xFFFFFF
});
rightButton.anchor.set(0.5, 0.5);
rightButton.x = 300;
rightButton.y = -150;
LK.gui.bottomLeft.addChild(rightButton);
var jumpButton = new Text2('▲', {
size: 120,
fill: 0xFFFFFF
});
jumpButton.anchor.set(0.5, 0.5);
jumpButton.alpha = 0.7;
jumpButton.x = 450;
jumpButton.y = -150;
LK.gui.bottomLeft.addChild(jumpButton);
function updateHealthDisplay() {
healthText.setText('Health: ' + hero.health + '/' + hero.maxHealth);
}
function createGold(x, y) {
var gold = new Gold();
gold.x = x;
gold.y = y;
golds.push(gold);
game.addChild(gold);
totalGolds++;
}
function updateGoldDisplay() {
goldText.setText('Gold: ' + collectedGolds + '/' + totalGolds);
}
function createLevel1() {
// Reset gold counters
collectedGolds = 0;
totalGolds = 0;
// Ground platforms
createPlatform(200, 2500);
createPlatform(600, 2400);
createPlatform(1000, 2300);
createPlatform(1400, 2200);
createPlatform(1800, 2100);
// Some floating platforms
createPlatform(400, 2200);
createPlatform(800, 2000);
createPlatform(1200, 1800);
// Place gold on certain platforms
createGold(600, 2350); // On second platform
createGold(1000, 2250); // On third platform
createGold(800, 1950); // On floating platform
createGold(1200, 1750); // On highest platform
// Spikes
createSpike(500, 2500);
createSpike(900, 2300);
createSpike(1300, 2200);
// Enemies
createEnemy(700, 2360);
createEnemy(1100, 2260);
createEnemy(1500, 2160);
// Goal
goal = new Goal();
goal.x = 1800;
goal.y = 2000;
game.addChild(goal);
updateGoldDisplay();
}
function createPlatform(x, y) {
var platform = new Platform();
platform.x = x;
platform.y = y;
platforms.push(platform);
game.addChild(platform);
}
function createSpike(x, y) {
var spike = new Spike();
spike.x = x;
spike.y = y;
spikes.push(spike);
game.addChild(spike);
}
function createEnemy(x, y) {
var enemy = new Enemy();
enemy.x = x;
enemy.y = y;
enemy.startX = x;
enemies.push(enemy);
game.addChild(enemy);
}
function checkPlatformCollisions(obj) {
obj.onGround = false;
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
if (obj.intersects(platform)) {
var objBottom = obj.y;
var objTop = obj.y - 80;
var objLeft = obj.x - 40;
var objRight = obj.x + 40;
var platformTop = platform.y - 20;
var platformBottom = platform.y + 20;
var platformLeft = platform.x - 100;
var platformRight = platform.x + 100;
// Landing on top
if (obj.velocity.y > 0 && objBottom > platformTop && objTop < platformTop) {
obj.y = platformTop;
obj.velocity.y = 0;
obj.onGround = true;
}
// Hitting from below
else if (obj.velocity.y < 0 && objTop < platformBottom && objBottom > platformBottom) {
obj.y = platformBottom + 80;
obj.velocity.y = 0;
}
// Hitting from left
else if (obj.velocity.x > 0 && objRight > platformLeft && objLeft < platformLeft) {
obj.x = platformLeft - 40;
obj.velocity.x = 0;
}
// Hitting from right
else if (obj.velocity.x < 0 && objLeft < platformRight && objRight > platformRight) {
obj.x = platformRight + 40;
obj.velocity.x = 0;
}
}
}
}
function nextLevel() {
currentLevel++;
levelText.setText('Level ' + currentLevel);
// Clear current level
for (var i = 0; i < enemies.length; i++) {
enemies[i].destroy();
}
enemies = [];
for (var j = 0; j < platforms.length; j++) {
platforms[j].destroy();
}
platforms = [];
for (var k = 0; k < spikes.length; k++) {
spikes[k].destroy();
}
spikes = [];
for (var l = 0; l < golds.length; l++) {
golds[l].destroy();
}
golds = [];
if (goal) {
goal.destroy();
}
// Create new level (simple progression)
createLevel1(); // For now, recreate same level with more difficulty
// Reset hero position
hero.x = spawnPoint.x;
hero.y = spawnPoint.y;
hero.velocity.x = 0;
hero.velocity.y = 0;
}
// Initialize hero
hero = new Hero();
hero.x = spawnPoint.x;
hero.y = spawnPoint.y;
game.addChild(hero);
// Create first level
createLevel1();
updateHealthDisplay();
// Input handling
leftButton.down = function (x, y, obj) {
leftPressed = true;
leftButton.alpha = 1.0;
};
leftButton.up = function (x, y, obj) {
leftPressed = false;
leftButton.alpha = 0.7;
};
rightButton.down = function (x, y, obj) {
rightPressed = true;
rightButton.alpha = 1.0;
};
rightButton.up = function (x, y, obj) {
rightPressed = false;
rightButton.alpha = 0.7;
};
jumpButton.down = function (x, y, obj) {
hero.jump();
jumpButton.alpha = 1.0;
};
jumpButton.up = function (x, y, obj) {
jumpButton.alpha = 0.7;
};
// Keep attack functionality on main game area
game.down = function (x, y, obj) {
// Only handle attack when touching the main game area (not buttons)
var gameLocalPos = game.toLocal({
x: x,
y: y
});
if (gameLocalPos.x > 300 && gameLocalPos.x < 1748 && gameLocalPos.y < 2000) {
hero.attack();
}
};
game.update = function () {
// Handle hero movement input
hero.velocity.x = 0;
if (leftPressed) {
hero.velocity.x = -hero.moveSpeed;
}
if (rightPressed) {
hero.velocity.x = hero.moveSpeed;
}
// Check platform collisions for hero
checkPlatformCollisions(hero);
// Check platform collisions for enemies
for (var i = 0; i < enemies.length; i++) {
checkPlatformCollisions(enemies[i]);
}
// Check hero-enemy collisions
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
if (hero.intersects(enemy)) {
if (!hero.lastEnemyCollision || hero.lastEnemyCollision !== enemy) {
hero.takeDamage(1);
hero.lastEnemyCollision = enemy;
// Knockback
if (hero.x < enemy.x) {
hero.velocity.x = -15;
} else {
hero.velocity.x = 15;
}
}
}
}
// Reset collision tracking
if (hero.lastEnemyCollision) {
var stillColliding = false;
for (var k = 0; k < enemies.length; k++) {
if (enemies[k] === hero.lastEnemyCollision && hero.intersects(enemies[k])) {
stillColliding = true;
break;
}
}
if (!stillColliding) {
hero.lastEnemyCollision = null;
}
}
// Check hero-spike collisions
for (var l = 0; l < spikes.length; l++) {
var spike = spikes[l];
if (hero.intersects(spike)) {
if (!hero.lastSpikeCollision || hero.lastSpikeCollision !== spike) {
hero.takeDamage(1);
hero.lastSpikeCollision = spike;
}
}
}
// Reset spike collision tracking
if (hero.lastSpikeCollision) {
var stillCollidingSpike = hero.intersects(hero.lastSpikeCollision);
if (!stillCollidingSpike) {
hero.lastSpikeCollision = null;
}
}
// Check bullet-enemy collisions
for (var m = bullets.length - 1; m >= 0; m--) {
var bullet = bullets[m];
var hitEnemy = false;
for (var n = 0; n < enemies.length; n++) {
var enemy2 = enemies[n];
if (bullet.intersects(enemy2)) {
enemy2.takeDamage();
bullet.destroy();
bullets.splice(m, 1);
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
// Check bullet-platform collisions
for (var o = 0; o < platforms.length; o++) {
if (bullet.intersects(platforms[o])) {
bullet.destroy();
bullets.splice(m, 1);
break;
}
}
}
}
// Check hero-gold collisions
for (var p = golds.length - 1; p >= 0; p--) {
var gold = golds[p];
if (hero.intersects(gold)) {
collectedGolds++;
updateGoldDisplay();
LK.setScore(LK.getScore() + 50);
scoreText.setText('Score: ' + LK.getScore());
gold.destroy();
golds.splice(p, 1);
}
}
// Check goal collision
if (goal && hero.intersects(goal)) {
if (collectedGolds < totalGolds) {
// Show warning message if not all golds collected
if (!hero.lastGoalWarning || LK.ticks - hero.lastGoalWarning > 120) {
// Create warning text
var warningText = new Text2('Önce tüm altınları topla!', {
size: 80,
fill: 0xFF0000
});
warningText.anchor.set(0.5, 0.5);
warningText.x = hero.x;
warningText.y = hero.y - 150;
game.addChild(warningText);
// Remove warning after 2 seconds
LK.setTimeout(function () {
if (warningText.parent) {
warningText.destroy();
}
}, 2000);
hero.lastGoalWarning = LK.ticks;
}
} else if (enemies.length === 0) {
LK.setScore(LK.getScore() + 100);
scoreText.setText('Score: ' + LK.getScore());
if (currentLevel >= 3) {
LK.showYouWin();
} else {
nextLevel();
}
}
}
};
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Adventure Quest: Hero's Journey" and with the description "Control a hero through challenging levels, fighting enemies and navigating obstacle courses in this action-packed adventure game.". No text on banner!
Canavar. In-Game asset. 2d. High contrast. No shadows
Kara delik. In-Game asset. 2d. High contrast. No shadows