/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
var enemyShadow = LK.getAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.2,
scaleX: 1.1,
scaleY: 0.3
});
self.addChild(enemyShadow);
enemyShadow.y = 50;
self.gridX = 0;
self.gridY = 0;
self.speed = 2;
self.pathPoints = [];
self.currentPathIndex = 0;
self.direction = 1;
self.moveCounter = 0;
self.isStunned = false;
self.stunTimeRemaining = 0;
self.setPath = function (path) {
self.pathPoints = path;
self.currentPathIndex = 0;
if (path.length > 0) {
self.gridX = path[0].x;
self.gridY = path[0].y;
}
};
self.update = function () {
if (self.isStunned) {
self.stunTimeRemaining--;
if (self.stunTimeRemaining <= 0) {
self.isStunned = false;
tween(self, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
return;
}
if (self.pathPoints.length === 0) return;
self.moveCounter++;
if (self.moveCounter < self.speed) return;
self.moveCounter = 0;
self.currentPathIndex = (self.currentPathIndex + self.direction) % self.pathPoints.length;
if (self.currentPathIndex < 0) self.currentPathIndex = self.pathPoints.length - 1;
var nextPoint = self.pathPoints[self.currentPathIndex];
self.gridX = nextPoint.x;
self.gridY = nextPoint.y;
var pyramidSize = 9;
var tilesInRow = pyramidSize - self.gridY;
var rowCenterOffset = (tilesInRow - 1) * 40;
var centerX = 1024;
var baseY = 200 + self.gridY * 70;
self.x = centerX - rowCenterOffset + self.gridX * 80;
self.y = baseY;
};
self.stun = function (duration) {
if (!self.isStunned) {
self.isStunned = true;
self.stunTimeRemaining = duration;
tween(self, {
tint: 0xFF00FF
}, {
duration: 100
});
}
};
return self;
});
//{SmartEnemy:38}
var GummyEnemy = Container.expand(function () {
var self = Container.call(this);
var gummyGraphics = self.attachAsset('nuevo', {
anchorX: 0.5,
anchorY: 0.5
});
var gummyShadow = LK.getAsset('nuevo', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.2,
scaleX: 1.1,
scaleY: 0.3
});
self.addChild(gummyShadow);
gummyShadow.y = 50;
self.gridX = 0;
self.gridY = 0;
self.speed = 1;
self.moveCounter = 0;
self.isStunned = false;
self.stunTimeRemaining = 0;
self.positionHistory = [];
self.delayFrames = 420;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
if (self.isStunned) {
self.stunTimeRemaining--;
if (self.stunTimeRemaining <= 0) {
self.isStunned = false;
tween(self, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
return;
}
self.moveCounter++;
if (self.moveCounter < self.speed) return;
self.moveCounter = 0;
var targetGridX = self.gridX;
var targetGridY = self.gridY;
if (self.positionHistory.length > 0) {
var delayedPos = self.positionHistory[0];
targetGridX = delayedPos.x;
targetGridY = delayedPos.y;
}
var diffX = targetGridX - self.gridX;
var diffY = targetGridY - self.gridY;
if (diffX > 0) self.gridX++;else if (diffX < 0) self.gridX--;
if (diffY > 0) self.gridY++;else if (diffY < 0) self.gridY--;
var pyramidSize = 9;
if (self.gridY < 0) self.gridY = 0;
if (self.gridY >= pyramidSize) self.gridY = pyramidSize - 1;
var tilesInRow = pyramidSize - self.gridY;
if (self.gridX < 0) self.gridX = 0;
if (self.gridX >= tilesInRow) self.gridX = tilesInRow - 1;
var rowCenterOffset = (tilesInRow - 1) * 40;
var centerX = 1024;
var baseY = 200 + self.gridY * 70;
self.x = centerX - rowCenterOffset + self.gridX * 80;
self.y = baseY;
};
self.recordPosition = function (x, y) {
self.positionHistory.push({
x: x,
y: y
});
if (self.positionHistory.length > self.delayFrames) {
self.positionHistory.shift();
}
};
self.stun = function (duration) {
if (!self.isStunned) {
self.isStunned = true;
self.stunTimeRemaining = duration;
tween(self, {
tint: 0xFF00FF
}, {
duration: 100
});
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var puGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.type = 'freeze';
self.active = true;
self.pulseDirection = 1;
self.pulseAmount = 0;
self.update = function () {
self.pulseAmount += self.pulseDirection * 2;
if (self.pulseAmount > 15) self.pulseDirection = -1;
if (self.pulseAmount < 0) self.pulseDirection = 1;
puGraphics.scaleX = 1 + self.pulseAmount / 100;
puGraphics.scaleY = 1 + self.pulseAmount / 100;
};
return self;
});
var Projectile = Container.expand(function () {
var self = Container.call(this);
var projectileGraphics = self.attachAsset('disparo', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.4
});
self.gridX = 0;
self.gridY = 0;
self.velocityX = 0;
self.velocityY = 0;
self.isActive = true;
self.lastY = 0;
self.update = function () {
if (!self.isActive) return;
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += 0.3;
if (self.lastY <= -100 && self.y < -100) {
self.isActive = false;
self.destroy();
}
self.lastY = self.y;
};
return self;
});
var QBert = Container.expand(function () {
var self = Container.call(this);
var qbertGraphics = self.attachAsset('qbert', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.isJumping = false;
self.jumpDuration = 300;
self.jumpHeight = 40;
self.startX = 0;
self.startY = 0;
self.targetX = 0;
self.targetY = 0;
self.jumpTo = function (newGridX, newGridY, tileMap) {
if (self.isJumping) return false;
if (newGridY < 0 || newGridY >= tileMap.length || newGridX < 0 || newGridX >= tileMap[newGridY].length) {
return false;
}
self.isJumping = true;
self.gridX = newGridX;
self.gridY = newGridY;
self.startX = self.x;
self.startY = self.y;
var pyramidSize = 9;
var tilesInRow = pyramidSize - newGridY;
var rowCenterOffset = (tilesInRow - 1) * 40;
var centerX = 1024;
var baseY = 200 + newGridY * 70;
self.targetX = centerX - rowCenterOffset + newGridX * 80;
self.targetY = baseY;
var currentTile = tileMap[newGridY][newGridX];
if (currentTile) {
currentTile.change();
}
tween(self, {
x: self.targetX,
y: self.targetY,
scaleX: 0.9,
scaleY: 0.9
}, {
duration: self.jumpDuration / 2,
easing: tween.easeIn,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: self.jumpDuration / 2,
easing: tween.easeOut
});
self.isJumping = false;
}
});
tween(qbertGraphics, {
y: -self.jumpHeight
}, {
duration: self.jumpDuration / 2,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(qbertGraphics, {
y: 0
}, {
duration: self.jumpDuration / 2,
easing: tween.easeIn
});
}
});
LK.getSound('jump').play();
return true;
};
return self;
});
var SmartEnemy = Container.expand(function () {
var self = Container.call(this);
//{SmartEnemy:1}
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
//{SmartEnemy:2}
anchorY: 0.5 //{SmartEnemy:3}
}); //{SmartEnemy:4}
var enemyShadow = LK.getAsset('enemy', {
anchorX: 0.5,
//{SmartEnemy:5}
anchorY: 0.5,
//{SmartEnemy:6}
alpha: 0.2,
scaleX: 1.1,
//{SmartEnemy:7}
scaleY: 0.3 //{SmartEnemy:8}
}); //{SmartEnemy:9}
self.addChild(enemyShadow);
enemyShadow.y = 50;
self.gridX = 0; //{SmartEnemy:10}
self.gridY = 0; //{SmartEnemy:11}
self.speed = 2;
self.moveCounter = 0; //{SmartEnemy:12}
self.isStunned = false; //{SmartEnemy:13}
self.stunTimeRemaining = 0;
self.positionHistory = []; //{SmartEnemy:14}
self.delayFrames = 600; // 10 seconds at 60 FPS
self.lastX = 0;
self.lastY = 0;
self.update = function () {
//{SmartEnemy:15}
if (self.isStunned) {
self.stunTimeRemaining--;
if (self.stunTimeRemaining <= 0) {
self.isStunned = false; //{SmartEnemy:16}
tween(self, {
//{SmartEnemy:17}
tint: 0xFFFFFF
}, {
//{SmartEnemy:18}
duration: 200
}); //{SmartEnemy:19}
} //{SmartEnemy:20}
return; //{SmartEnemy:21}
} //{SmartEnemy:22}
self.moveCounter++;
if (self.moveCounter < self.speed) return;
self.moveCounter = 0; //{SmartEnemy:23}
var targetGridX = self.gridX;
var targetGridY = self.gridY;
if (self.positionHistory.length > 0) {
var delayedPos = self.positionHistory[0];
targetGridX = delayedPos.x;
targetGridY = delayedPos.y;
} //{SmartEnemy:24}
var diffX = targetGridX - self.gridX;
var diffY = targetGridY - self.gridY;
if (diffX > 0) self.gridX++;else if (diffX < 0) self.gridX--;
if (diffY > 0) self.gridY++;else if (diffY < 0) self.gridY--;
var pyramidSize = 9; //{SmartEnemy:25}
if (self.gridY < 0) self.gridY = 0;
if (self.gridY >= pyramidSize) self.gridY = pyramidSize - 1;
var tilesInRow = pyramidSize - self.gridY;
if (self.gridX < 0) self.gridX = 0;
if (self.gridX >= tilesInRow) self.gridX = tilesInRow - 1;
var rowCenterOffset = (tilesInRow - 1) * 40; //{SmartEnemy:26}
var centerX = 1024; //{SmartEnemy:27}
var baseY = 200 + self.gridY * 70;
self.x = centerX - rowCenterOffset + self.gridX * 80;
self.y = baseY;
}; //{SmartEnemy:28}
self.recordPosition = function (x, y) {
self.positionHistory.push({
x: x,
y: y
}); //{SmartEnemy:29}
if (self.positionHistory.length > self.delayFrames) {
self.positionHistory.shift();
} //{SmartEnemy:30}
}; //{SmartEnemy:31}
self.stun = function (duration) {
if (!self.isStunned) {
self.isStunned = true;
self.stunTimeRemaining = duration;
tween(self, {
//{SmartEnemy:32}
tint: 0xFF00FF
}, {
//{SmartEnemy:33}
duration: 100
}); //{SmartEnemy:34}
} //{SmartEnemy:35}
}; //{SmartEnemy:36}
return self; //{SmartEnemy:37}
});
//{SmartEnemy:38}
var Tile = Container.expand(function () {
var self = Container.call(this);
var tileTop = self.attachAsset('tileTop', {
anchorX: 0.5,
anchorY: 0.5
});
var tileLeft = self.attachAsset('tileLeft', {
anchorX: 1.0,
anchorY: 0.0
});
var tileRight = self.attachAsset('tileRight', {
anchorX: 0.0,
anchorY: 0.0
});
var tileShadow = self.attachAsset('tileLeft', {
anchorX: 1.0,
anchorY: 0.0
});
tileShadow.alpha = 0.3;
tileShadow.x = -40;
tileShadow.y = 50;
tileLeft.x = -40;
tileLeft.y = 40;
tileRight.x = 40;
tileRight.y = 40;
self.gridX = 0;
self.gridY = 0;
self.isChanged = false;
self.targetColor = 0x4A90E2;
self.changedColor = 0x2ECC71;
self.targetLeftColor = 0x2d5aa6;
self.changedLeftColor = 0x1a944a;
self.targetRightColor = 0x356fb6;
self.changedRightColor = 0x1fc066;
self.change = function () {
if (!self.isChanged) {
self.isChanged = true;
tileTop.tint = self.changedColor;
tileLeft.tint = self.changedLeftColor;
tileRight.tint = self.changedRightColor;
tween(tileTop, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut
});
LK.getSound('tileChange').play();
}
};
self.reset = function () {
self.isChanged = false;
tileTop.tint = self.targetColor;
tileLeft.tint = self.targetLeftColor;
tileRight.tint = self.targetRightColor;
};
self.getTileColor = function () {
return self.isChanged ? self.changedColor : self.targetColor;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1A1A2E
});
/****
* Game Code
****/
var currentLevel = storage.currentLevel || 1;
var score = storage.score || 0;
var lives = 3;
var levelTime = 180;
var timeRemaining = levelTime;
var gameActive = true;
var tileMap = [];
var qbert = null;
var enemies = [];
var powerups = [];
var changedTileCount = 0;
var totalTiles = 0;
var projectiles = [];
var scoreText = new Text2(score.toString(), {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var levelText = new Text2('Level ' + currentLevel, {
size: 60,
fill: 0xFFD93D
});
levelText.anchor.set(0.5, 0);
levelText.x = 200;
LK.gui.top.addChild(levelText);
var timerText = new Text2(timeRemaining.toString(), {
size: 60,
fill: 0xFF6B35
});
timerText.anchor.set(0.5, 0);
timerText.x = -200;
LK.gui.top.addChild(timerText);
function initializePyramid() {
game.removeChildren();
tileMap = [];
enemies = [];
powerups = [];
projectiles = [];
changedTileCount = 0;
timeRemaining = levelTime - (currentLevel - 1) * 5;
if (timeRemaining < 60) timeRemaining = 60;
var pyramidSize = 7 + Math.floor(Math.random() * 3);
if (pyramidSize > 9) pyramidSize = 9;
if (currentLevel > 1 && Math.random() > 0.5) {
pyramidSize = 9;
} //{InitPyram:1}
totalTiles = 0;
for (var row = 0; row < pyramidSize; row++) {
tileMap[row] = [];
var tilesInRow = pyramidSize - row;
var rowCenterOffset = (tilesInRow - 1) * 40;
for (var col = 0; col < tilesInRow; col++) {
var tile = game.addChild(new Tile());
tile.gridX = col;
tile.gridY = row;
var centerX = 1024;
var baseY = 200 + row * 70;
tile.x = centerX - rowCenterOffset + col * 80;
tile.y = baseY;
tile.zIndex = row;
tileMap[row][col] = tile;
totalTiles++;
}
}
qbert = game.addChild(new QBert());
qbert.gridX = 0;
qbert.gridY = 0;
var centerX = 1024;
var baseY = 200 + 0 * 70;
qbert.x = centerX + qbert.gridX * 80;
qbert.y = baseY;
tileMap[0][qbert.gridX].change();
changedTileCount = 1;
var enemyCount = Math.min(1 + Math.floor((currentLevel - 1) / 3), 3);
for (var e = 0; e < enemyCount; e++) {
var useGummyEnemy = currentLevel > 3 && e === enemyCount - 1;
var useSmartEnemy = !useGummyEnemy && (e > 0 || currentLevel > 2 && Math.random() > 0.3);
var EnemyClass = useGummyEnemy ? GummyEnemy : useSmartEnemy ? SmartEnemy : Enemy;
var enemy = game.addChild(new EnemyClass()); //{InitPyram:2}
var startRow = Math.min(4 + Math.floor(e / 2), pyramidSize - 1);
enemy.gridX = Math.floor(Math.random() * (pyramidSize - startRow));
enemy.gridY = startRow;
if (EnemyClass === Enemy) {
var path = [];
var tilesInPathRow = pyramidSize - startRow; //{InitPyram:2}
for (var p = 0; p < tilesInPathRow; p++) {
path.push({
x: p,
y: startRow
}); //{InitPyram:3}
} //{InitPyram:4}
enemy.setPath(path);
} //{InitPyram:5}
var tilesInPathRow = pyramidSize - startRow;
var enemyRowCenterOffset = (tilesInPathRow - 1) * 40;
var enemyCenterX = 1024;
var enemyBaseY = 200 + startRow * 70;
enemy.x = enemyCenterX - enemyRowCenterOffset + enemy.gridX * 80;
enemy.y = enemyBaseY;
enemy.speed = 50 - currentLevel * 3;
if (enemy.speed < 20) enemy.speed = 20;
enemies.push(enemy);
} //{InitPyram:6}
}
var gameTimer = LK.setInterval(function () {
if (!gameActive) return;
timeRemaining--;
timerText.setText(Math.max(0, timeRemaining).toString());
if (timeRemaining <= 0) {
gameActive = false;
LK.showGameOver();
}
}, 1000);
initializePyramid();
var dragStartX = 0;
var dragStartY = 0;
game.down = function (x, y, obj) {
dragStartX = x;
dragStartY = y;
if (!gameActive || !qbert) return;
var qbertScreenX = qbert.x;
var qbertScreenY = qbert.y;
var distToQBert = Math.sqrt((x - qbertScreenX) * (x - qbertScreenX) + (y - qbertScreenY) * (y - qbertScreenY));
if (distToQBert < 150) {
var dirX = x - qbertScreenX;
var dirY = y - qbertScreenY;
var length = Math.sqrt(dirX * dirX + dirY * dirY);
if (length > 0) {
dirX /= length;
dirY /= length;
var projectile = game.addChild(new Projectile());
projectile.x = qbertScreenX;
projectile.y = qbertScreenY;
projectile.velocityX = dirX * 8;
projectile.velocityY = dirY * 8;
projectiles.push(projectile);
LK.getSound('jump').play();
}
}
};
game.up = function (x, y, obj) {
if (!gameActive || !qbert) return;
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var threshold = 20;
var newGridX = qbert.gridX;
var newGridY = qbert.gridY;
if (Math.abs(deltaX) > Math.abs(deltaY)) {
if (deltaX > threshold) {
newGridX++;
} else if (deltaX < -threshold) {
newGridX--;
}
} else {
if (deltaY > threshold) {
newGridY++;
} else if (deltaY < -threshold) {
newGridY--;
}
}
qbert.jumpTo(newGridX, newGridY, tileMap);
};
game.update = function () {
if (!gameActive || !qbert) return;
for (var e = 0; e < enemies.length; e++) {
if (enemies[e].recordPosition) {
enemies[e].recordPosition(qbert.gridX, qbert.gridY);
} //{UpdateGame:1}
} //{UpdateGame:2}
for (var proj = projectiles.length - 1; proj >= 0; proj--) {
projectiles[proj].update();
if (!projectiles[proj].isActive) {
projectiles.splice(proj, 1);
continue;
}
for (var e = 0; e < enemies.length; e++) {
if (projectiles[proj].intersects(enemies[e])) {
enemies[e].stun(240);
score += 100;
scoreText.setText(score.toString());
projectiles[proj].isActive = false;
projectiles[proj].destroy();
projectiles.splice(proj, 1);
break;
}
}
}
for (var e = 0; e < enemies.length; e++) {
enemies[e].update();
if (enemies[e].gridX === qbert.gridX && enemies[e].gridY === qbert.gridY && !enemies[e].isStunned) {
gameActive = false;
lives--;
if (lives > 0) {
LK.showGameOver();
} else {
storage.currentLevel = 1;
storage.score = 0;
LK.showGameOver();
}
return;
}
}
for (var p = powerups.length - 1; p >= 0; p--) {
powerups[p].update();
if (powerups[p].gridX === qbert.gridX && powerups[p].gridY === qbert.gridY && powerups[p].active) {
powerups[p].active = false;
powerups[p].destroy();
powerups.splice(p, 1);
LK.getSound('powerup').play();
score += 500;
}
}
var completedTiles = 0;
for (var row = 0; row < tileMap.length; row++) {
for (var col = 0; col < tileMap[row].length; col++) {
if (tileMap[row][col].isChanged) {
completedTiles++;
}
}
}
if (completedTiles === totalTiles) {
gameActive = false;
score += timeRemaining * 100 + currentLevel * 1000;
scoreText.setText(score.toString());
storage.score = score;
storage.currentLevel = currentLevel + 1;
LK.getSound('levelComplete').play();
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
}
scoreText.setText(score.toString());
};
LK.playMusic('bgmusic', {
loop: true
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
var enemyShadow = LK.getAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.2,
scaleX: 1.1,
scaleY: 0.3
});
self.addChild(enemyShadow);
enemyShadow.y = 50;
self.gridX = 0;
self.gridY = 0;
self.speed = 2;
self.pathPoints = [];
self.currentPathIndex = 0;
self.direction = 1;
self.moveCounter = 0;
self.isStunned = false;
self.stunTimeRemaining = 0;
self.setPath = function (path) {
self.pathPoints = path;
self.currentPathIndex = 0;
if (path.length > 0) {
self.gridX = path[0].x;
self.gridY = path[0].y;
}
};
self.update = function () {
if (self.isStunned) {
self.stunTimeRemaining--;
if (self.stunTimeRemaining <= 0) {
self.isStunned = false;
tween(self, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
return;
}
if (self.pathPoints.length === 0) return;
self.moveCounter++;
if (self.moveCounter < self.speed) return;
self.moveCounter = 0;
self.currentPathIndex = (self.currentPathIndex + self.direction) % self.pathPoints.length;
if (self.currentPathIndex < 0) self.currentPathIndex = self.pathPoints.length - 1;
var nextPoint = self.pathPoints[self.currentPathIndex];
self.gridX = nextPoint.x;
self.gridY = nextPoint.y;
var pyramidSize = 9;
var tilesInRow = pyramidSize - self.gridY;
var rowCenterOffset = (tilesInRow - 1) * 40;
var centerX = 1024;
var baseY = 200 + self.gridY * 70;
self.x = centerX - rowCenterOffset + self.gridX * 80;
self.y = baseY;
};
self.stun = function (duration) {
if (!self.isStunned) {
self.isStunned = true;
self.stunTimeRemaining = duration;
tween(self, {
tint: 0xFF00FF
}, {
duration: 100
});
}
};
return self;
});
//{SmartEnemy:38}
var GummyEnemy = Container.expand(function () {
var self = Container.call(this);
var gummyGraphics = self.attachAsset('nuevo', {
anchorX: 0.5,
anchorY: 0.5
});
var gummyShadow = LK.getAsset('nuevo', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.2,
scaleX: 1.1,
scaleY: 0.3
});
self.addChild(gummyShadow);
gummyShadow.y = 50;
self.gridX = 0;
self.gridY = 0;
self.speed = 1;
self.moveCounter = 0;
self.isStunned = false;
self.stunTimeRemaining = 0;
self.positionHistory = [];
self.delayFrames = 420;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
if (self.isStunned) {
self.stunTimeRemaining--;
if (self.stunTimeRemaining <= 0) {
self.isStunned = false;
tween(self, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
return;
}
self.moveCounter++;
if (self.moveCounter < self.speed) return;
self.moveCounter = 0;
var targetGridX = self.gridX;
var targetGridY = self.gridY;
if (self.positionHistory.length > 0) {
var delayedPos = self.positionHistory[0];
targetGridX = delayedPos.x;
targetGridY = delayedPos.y;
}
var diffX = targetGridX - self.gridX;
var diffY = targetGridY - self.gridY;
if (diffX > 0) self.gridX++;else if (diffX < 0) self.gridX--;
if (diffY > 0) self.gridY++;else if (diffY < 0) self.gridY--;
var pyramidSize = 9;
if (self.gridY < 0) self.gridY = 0;
if (self.gridY >= pyramidSize) self.gridY = pyramidSize - 1;
var tilesInRow = pyramidSize - self.gridY;
if (self.gridX < 0) self.gridX = 0;
if (self.gridX >= tilesInRow) self.gridX = tilesInRow - 1;
var rowCenterOffset = (tilesInRow - 1) * 40;
var centerX = 1024;
var baseY = 200 + self.gridY * 70;
self.x = centerX - rowCenterOffset + self.gridX * 80;
self.y = baseY;
};
self.recordPosition = function (x, y) {
self.positionHistory.push({
x: x,
y: y
});
if (self.positionHistory.length > self.delayFrames) {
self.positionHistory.shift();
}
};
self.stun = function (duration) {
if (!self.isStunned) {
self.isStunned = true;
self.stunTimeRemaining = duration;
tween(self, {
tint: 0xFF00FF
}, {
duration: 100
});
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var puGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.type = 'freeze';
self.active = true;
self.pulseDirection = 1;
self.pulseAmount = 0;
self.update = function () {
self.pulseAmount += self.pulseDirection * 2;
if (self.pulseAmount > 15) self.pulseDirection = -1;
if (self.pulseAmount < 0) self.pulseDirection = 1;
puGraphics.scaleX = 1 + self.pulseAmount / 100;
puGraphics.scaleY = 1 + self.pulseAmount / 100;
};
return self;
});
var Projectile = Container.expand(function () {
var self = Container.call(this);
var projectileGraphics = self.attachAsset('disparo', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.4
});
self.gridX = 0;
self.gridY = 0;
self.velocityX = 0;
self.velocityY = 0;
self.isActive = true;
self.lastY = 0;
self.update = function () {
if (!self.isActive) return;
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += 0.3;
if (self.lastY <= -100 && self.y < -100) {
self.isActive = false;
self.destroy();
}
self.lastY = self.y;
};
return self;
});
var QBert = Container.expand(function () {
var self = Container.call(this);
var qbertGraphics = self.attachAsset('qbert', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.isJumping = false;
self.jumpDuration = 300;
self.jumpHeight = 40;
self.startX = 0;
self.startY = 0;
self.targetX = 0;
self.targetY = 0;
self.jumpTo = function (newGridX, newGridY, tileMap) {
if (self.isJumping) return false;
if (newGridY < 0 || newGridY >= tileMap.length || newGridX < 0 || newGridX >= tileMap[newGridY].length) {
return false;
}
self.isJumping = true;
self.gridX = newGridX;
self.gridY = newGridY;
self.startX = self.x;
self.startY = self.y;
var pyramidSize = 9;
var tilesInRow = pyramidSize - newGridY;
var rowCenterOffset = (tilesInRow - 1) * 40;
var centerX = 1024;
var baseY = 200 + newGridY * 70;
self.targetX = centerX - rowCenterOffset + newGridX * 80;
self.targetY = baseY;
var currentTile = tileMap[newGridY][newGridX];
if (currentTile) {
currentTile.change();
}
tween(self, {
x: self.targetX,
y: self.targetY,
scaleX: 0.9,
scaleY: 0.9
}, {
duration: self.jumpDuration / 2,
easing: tween.easeIn,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: self.jumpDuration / 2,
easing: tween.easeOut
});
self.isJumping = false;
}
});
tween(qbertGraphics, {
y: -self.jumpHeight
}, {
duration: self.jumpDuration / 2,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(qbertGraphics, {
y: 0
}, {
duration: self.jumpDuration / 2,
easing: tween.easeIn
});
}
});
LK.getSound('jump').play();
return true;
};
return self;
});
var SmartEnemy = Container.expand(function () {
var self = Container.call(this);
//{SmartEnemy:1}
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
//{SmartEnemy:2}
anchorY: 0.5 //{SmartEnemy:3}
}); //{SmartEnemy:4}
var enemyShadow = LK.getAsset('enemy', {
anchorX: 0.5,
//{SmartEnemy:5}
anchorY: 0.5,
//{SmartEnemy:6}
alpha: 0.2,
scaleX: 1.1,
//{SmartEnemy:7}
scaleY: 0.3 //{SmartEnemy:8}
}); //{SmartEnemy:9}
self.addChild(enemyShadow);
enemyShadow.y = 50;
self.gridX = 0; //{SmartEnemy:10}
self.gridY = 0; //{SmartEnemy:11}
self.speed = 2;
self.moveCounter = 0; //{SmartEnemy:12}
self.isStunned = false; //{SmartEnemy:13}
self.stunTimeRemaining = 0;
self.positionHistory = []; //{SmartEnemy:14}
self.delayFrames = 600; // 10 seconds at 60 FPS
self.lastX = 0;
self.lastY = 0;
self.update = function () {
//{SmartEnemy:15}
if (self.isStunned) {
self.stunTimeRemaining--;
if (self.stunTimeRemaining <= 0) {
self.isStunned = false; //{SmartEnemy:16}
tween(self, {
//{SmartEnemy:17}
tint: 0xFFFFFF
}, {
//{SmartEnemy:18}
duration: 200
}); //{SmartEnemy:19}
} //{SmartEnemy:20}
return; //{SmartEnemy:21}
} //{SmartEnemy:22}
self.moveCounter++;
if (self.moveCounter < self.speed) return;
self.moveCounter = 0; //{SmartEnemy:23}
var targetGridX = self.gridX;
var targetGridY = self.gridY;
if (self.positionHistory.length > 0) {
var delayedPos = self.positionHistory[0];
targetGridX = delayedPos.x;
targetGridY = delayedPos.y;
} //{SmartEnemy:24}
var diffX = targetGridX - self.gridX;
var diffY = targetGridY - self.gridY;
if (diffX > 0) self.gridX++;else if (diffX < 0) self.gridX--;
if (diffY > 0) self.gridY++;else if (diffY < 0) self.gridY--;
var pyramidSize = 9; //{SmartEnemy:25}
if (self.gridY < 0) self.gridY = 0;
if (self.gridY >= pyramidSize) self.gridY = pyramidSize - 1;
var tilesInRow = pyramidSize - self.gridY;
if (self.gridX < 0) self.gridX = 0;
if (self.gridX >= tilesInRow) self.gridX = tilesInRow - 1;
var rowCenterOffset = (tilesInRow - 1) * 40; //{SmartEnemy:26}
var centerX = 1024; //{SmartEnemy:27}
var baseY = 200 + self.gridY * 70;
self.x = centerX - rowCenterOffset + self.gridX * 80;
self.y = baseY;
}; //{SmartEnemy:28}
self.recordPosition = function (x, y) {
self.positionHistory.push({
x: x,
y: y
}); //{SmartEnemy:29}
if (self.positionHistory.length > self.delayFrames) {
self.positionHistory.shift();
} //{SmartEnemy:30}
}; //{SmartEnemy:31}
self.stun = function (duration) {
if (!self.isStunned) {
self.isStunned = true;
self.stunTimeRemaining = duration;
tween(self, {
//{SmartEnemy:32}
tint: 0xFF00FF
}, {
//{SmartEnemy:33}
duration: 100
}); //{SmartEnemy:34}
} //{SmartEnemy:35}
}; //{SmartEnemy:36}
return self; //{SmartEnemy:37}
});
//{SmartEnemy:38}
var Tile = Container.expand(function () {
var self = Container.call(this);
var tileTop = self.attachAsset('tileTop', {
anchorX: 0.5,
anchorY: 0.5
});
var tileLeft = self.attachAsset('tileLeft', {
anchorX: 1.0,
anchorY: 0.0
});
var tileRight = self.attachAsset('tileRight', {
anchorX: 0.0,
anchorY: 0.0
});
var tileShadow = self.attachAsset('tileLeft', {
anchorX: 1.0,
anchorY: 0.0
});
tileShadow.alpha = 0.3;
tileShadow.x = -40;
tileShadow.y = 50;
tileLeft.x = -40;
tileLeft.y = 40;
tileRight.x = 40;
tileRight.y = 40;
self.gridX = 0;
self.gridY = 0;
self.isChanged = false;
self.targetColor = 0x4A90E2;
self.changedColor = 0x2ECC71;
self.targetLeftColor = 0x2d5aa6;
self.changedLeftColor = 0x1a944a;
self.targetRightColor = 0x356fb6;
self.changedRightColor = 0x1fc066;
self.change = function () {
if (!self.isChanged) {
self.isChanged = true;
tileTop.tint = self.changedColor;
tileLeft.tint = self.changedLeftColor;
tileRight.tint = self.changedRightColor;
tween(tileTop, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut
});
LK.getSound('tileChange').play();
}
};
self.reset = function () {
self.isChanged = false;
tileTop.tint = self.targetColor;
tileLeft.tint = self.targetLeftColor;
tileRight.tint = self.targetRightColor;
};
self.getTileColor = function () {
return self.isChanged ? self.changedColor : self.targetColor;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1A1A2E
});
/****
* Game Code
****/
var currentLevel = storage.currentLevel || 1;
var score = storage.score || 0;
var lives = 3;
var levelTime = 180;
var timeRemaining = levelTime;
var gameActive = true;
var tileMap = [];
var qbert = null;
var enemies = [];
var powerups = [];
var changedTileCount = 0;
var totalTiles = 0;
var projectiles = [];
var scoreText = new Text2(score.toString(), {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var levelText = new Text2('Level ' + currentLevel, {
size: 60,
fill: 0xFFD93D
});
levelText.anchor.set(0.5, 0);
levelText.x = 200;
LK.gui.top.addChild(levelText);
var timerText = new Text2(timeRemaining.toString(), {
size: 60,
fill: 0xFF6B35
});
timerText.anchor.set(0.5, 0);
timerText.x = -200;
LK.gui.top.addChild(timerText);
function initializePyramid() {
game.removeChildren();
tileMap = [];
enemies = [];
powerups = [];
projectiles = [];
changedTileCount = 0;
timeRemaining = levelTime - (currentLevel - 1) * 5;
if (timeRemaining < 60) timeRemaining = 60;
var pyramidSize = 7 + Math.floor(Math.random() * 3);
if (pyramidSize > 9) pyramidSize = 9;
if (currentLevel > 1 && Math.random() > 0.5) {
pyramidSize = 9;
} //{InitPyram:1}
totalTiles = 0;
for (var row = 0; row < pyramidSize; row++) {
tileMap[row] = [];
var tilesInRow = pyramidSize - row;
var rowCenterOffset = (tilesInRow - 1) * 40;
for (var col = 0; col < tilesInRow; col++) {
var tile = game.addChild(new Tile());
tile.gridX = col;
tile.gridY = row;
var centerX = 1024;
var baseY = 200 + row * 70;
tile.x = centerX - rowCenterOffset + col * 80;
tile.y = baseY;
tile.zIndex = row;
tileMap[row][col] = tile;
totalTiles++;
}
}
qbert = game.addChild(new QBert());
qbert.gridX = 0;
qbert.gridY = 0;
var centerX = 1024;
var baseY = 200 + 0 * 70;
qbert.x = centerX + qbert.gridX * 80;
qbert.y = baseY;
tileMap[0][qbert.gridX].change();
changedTileCount = 1;
var enemyCount = Math.min(1 + Math.floor((currentLevel - 1) / 3), 3);
for (var e = 0; e < enemyCount; e++) {
var useGummyEnemy = currentLevel > 3 && e === enemyCount - 1;
var useSmartEnemy = !useGummyEnemy && (e > 0 || currentLevel > 2 && Math.random() > 0.3);
var EnemyClass = useGummyEnemy ? GummyEnemy : useSmartEnemy ? SmartEnemy : Enemy;
var enemy = game.addChild(new EnemyClass()); //{InitPyram:2}
var startRow = Math.min(4 + Math.floor(e / 2), pyramidSize - 1);
enemy.gridX = Math.floor(Math.random() * (pyramidSize - startRow));
enemy.gridY = startRow;
if (EnemyClass === Enemy) {
var path = [];
var tilesInPathRow = pyramidSize - startRow; //{InitPyram:2}
for (var p = 0; p < tilesInPathRow; p++) {
path.push({
x: p,
y: startRow
}); //{InitPyram:3}
} //{InitPyram:4}
enemy.setPath(path);
} //{InitPyram:5}
var tilesInPathRow = pyramidSize - startRow;
var enemyRowCenterOffset = (tilesInPathRow - 1) * 40;
var enemyCenterX = 1024;
var enemyBaseY = 200 + startRow * 70;
enemy.x = enemyCenterX - enemyRowCenterOffset + enemy.gridX * 80;
enemy.y = enemyBaseY;
enemy.speed = 50 - currentLevel * 3;
if (enemy.speed < 20) enemy.speed = 20;
enemies.push(enemy);
} //{InitPyram:6}
}
var gameTimer = LK.setInterval(function () {
if (!gameActive) return;
timeRemaining--;
timerText.setText(Math.max(0, timeRemaining).toString());
if (timeRemaining <= 0) {
gameActive = false;
LK.showGameOver();
}
}, 1000);
initializePyramid();
var dragStartX = 0;
var dragStartY = 0;
game.down = function (x, y, obj) {
dragStartX = x;
dragStartY = y;
if (!gameActive || !qbert) return;
var qbertScreenX = qbert.x;
var qbertScreenY = qbert.y;
var distToQBert = Math.sqrt((x - qbertScreenX) * (x - qbertScreenX) + (y - qbertScreenY) * (y - qbertScreenY));
if (distToQBert < 150) {
var dirX = x - qbertScreenX;
var dirY = y - qbertScreenY;
var length = Math.sqrt(dirX * dirX + dirY * dirY);
if (length > 0) {
dirX /= length;
dirY /= length;
var projectile = game.addChild(new Projectile());
projectile.x = qbertScreenX;
projectile.y = qbertScreenY;
projectile.velocityX = dirX * 8;
projectile.velocityY = dirY * 8;
projectiles.push(projectile);
LK.getSound('jump').play();
}
}
};
game.up = function (x, y, obj) {
if (!gameActive || !qbert) return;
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var threshold = 20;
var newGridX = qbert.gridX;
var newGridY = qbert.gridY;
if (Math.abs(deltaX) > Math.abs(deltaY)) {
if (deltaX > threshold) {
newGridX++;
} else if (deltaX < -threshold) {
newGridX--;
}
} else {
if (deltaY > threshold) {
newGridY++;
} else if (deltaY < -threshold) {
newGridY--;
}
}
qbert.jumpTo(newGridX, newGridY, tileMap);
};
game.update = function () {
if (!gameActive || !qbert) return;
for (var e = 0; e < enemies.length; e++) {
if (enemies[e].recordPosition) {
enemies[e].recordPosition(qbert.gridX, qbert.gridY);
} //{UpdateGame:1}
} //{UpdateGame:2}
for (var proj = projectiles.length - 1; proj >= 0; proj--) {
projectiles[proj].update();
if (!projectiles[proj].isActive) {
projectiles.splice(proj, 1);
continue;
}
for (var e = 0; e < enemies.length; e++) {
if (projectiles[proj].intersects(enemies[e])) {
enemies[e].stun(240);
score += 100;
scoreText.setText(score.toString());
projectiles[proj].isActive = false;
projectiles[proj].destroy();
projectiles.splice(proj, 1);
break;
}
}
}
for (var e = 0; e < enemies.length; e++) {
enemies[e].update();
if (enemies[e].gridX === qbert.gridX && enemies[e].gridY === qbert.gridY && !enemies[e].isStunned) {
gameActive = false;
lives--;
if (lives > 0) {
LK.showGameOver();
} else {
storage.currentLevel = 1;
storage.score = 0;
LK.showGameOver();
}
return;
}
}
for (var p = powerups.length - 1; p >= 0; p--) {
powerups[p].update();
if (powerups[p].gridX === qbert.gridX && powerups[p].gridY === qbert.gridY && powerups[p].active) {
powerups[p].active = false;
powerups[p].destroy();
powerups.splice(p, 1);
LK.getSound('powerup').play();
score += 500;
}
}
var completedTiles = 0;
for (var row = 0; row < tileMap.length; row++) {
for (var col = 0; col < tileMap[row].length; col++) {
if (tileMap[row][col].isChanged) {
completedTiles++;
}
}
}
if (completedTiles === totalTiles) {
gameActive = false;
score += timeRemaining * 100 + currentLevel * 1000;
scoreText.setText(score.toString());
storage.score = score;
storage.currentLevel = currentLevel + 1;
LK.getSound('levelComplete').play();
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
}
scoreText.setText(score.toString());
};
LK.playMusic('bgmusic', {
loop: true
});
Modern App Store icon, high definition, square with rounded corners, for a game titled "Q-Bert Reimagined" and with the description "A modern take on the classic Q-Bert formula: navigate an isometric pyramid, change tile colors by landing on them, and avoid enemies while completing each level before advancing.". No text on icon!
es una serpiente de color morado con forma de resorte y con cara traviesa. In-Game asset
es de color naranja . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
es una bolita de color naranja . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
es saltarín como una gomita furiosa. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat