===================================================================
--- original.js
+++ change.js
@@ -1,45 +1,25 @@
-var DropEffect = Container.expand(function (x, y) {
- var self = Container.call(this);
- var angle = Math.random() * Math.PI;
- var speed = 10 + Math.random() * 5;
- var speedX = Math.cos(angle) * speed;
- var speedY = Math.sin(angle) * speed;
- var spinSpeed = Math.random() * 0.2 - 0.1;
- var scale = 1;
- var scaleDecrement = 1 / 60;
- var variant = Math.floor(Math.random() * 3);
- var graphics = self.createAsset('pickup' + variant, 'Drop graphics', 0.5, 0.95);
- graphics.rotation = Math.random() * Math.PI * 2;
- ;
- self.x = x;
- self.y = y;
- self.update = update;
- ;
- function update(velocityX, velocityY) {
- self.x += speedX - velocityX;
- self.y += speedY - velocityY;
- scale -= scaleDecrement;
- graphics.rotation += spinSpeed;
- graphics.scale.set(scale);
- return scale <= 0;
- }
-});
+/****
+* Classes
+****/
var BloodsplatterEffect = Container.expand(function (x, y) {
var self = Container.call(this);
var duration = 15;
var remaining = duration;
var maxScale = 2.0;
var startAlpha = 0.5;
- var graphics = self.createAsset('bloodsplatter', 'Bloodsplatter graphics', 0.5, 0.5);
+ var graphics = self.attachAsset('bloodsplatter', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
graphics.alpha = startAlpha;
graphics.y = -graphics.height / 2;
;
self.x = x;
self.y = y;
- self.update = update;
+ self._update_migrated = _update_migrated;
;
- function update(velocityX, velocityY) {
+ function _update_migrated(velocityX, velocityY) {
var progress = 1 - remaining-- / duration;
if (remaining <= 0) {
return true;
}
@@ -48,128 +28,118 @@
self.x -= velocityX;
self.y -= velocityY;
}
});
-var Monster = Container.expand(function (x, y) {
+var DropEffect = Container.expand(function (x, y) {
var self = Container.call(this);
- var active = false;
- var updateTick = 0;
- var updatePeriod = 30;
- var jumpSpeedMax = 30;
- var jumpHeight = 100;
- var jumpVelocityX = 0;
- var jumpVelocityY = 0;
- var jumpDuration = updatePeriod * 2 / 3;
- var invulnerabilityBoost = 1.8;
- var jumpDistMax = jumpSpeedMax * jumpDuration;
- var jumpDistMaxSqr = jumpDistMax * jumpDistMax;
- var activationDist = 1000;
- var activationDistSqr = activationDist * activationDist;
- var despawnY = -2500;
- var shadowReduction = 0.1;
- var shadow = self.createAsset('shadow', 'Monster shadow', 0.45, 1);
- var graphics = self.createAsset('monster', 'Monster graphics', 0.5, 1);
- graphics.scale.x = Math.random() < 0.5 ? 1 : -1;
- shadow.width = graphics.width * 0.9;
- shadow.height = graphics.width * 0.45;
- shadow.tint = 0x000000;
- shadow.alpha = 0.5;
+ var angle = Math.random() * Math.PI;
+ var speed = 10 + Math.random() * 5;
+ var speedX = Math.cos(angle) * speed;
+ var speedY = Math.sin(angle) * speed;
+ var spinSpeed = Math.random() * 0.2 - 0.1;
+ var scale = 1;
+ var scaleDecrement = 1 / 60;
+ var variant = Math.floor(Math.random() * 3);
+ var graphics = self.createAsset('pickup' + variant, {
+ anchorX: 0.5,
+ anchorY: 0.95
+ });
+ graphics.rotation = Math.random() * Math.PI * 2;
;
self.x = x;
self.y = y;
- self.jumping = false;
- self.hitbox = shadow;
- self.update = update;
+ self._update_migrated = _update_migrated;
;
- function update(velocityX, velocityY, player) {
- if (!active) {
- var dx = player.x - self.x;
- var dy = player.y - self.y;
- var distSqr = dx * dx + dy * dy;
- if (distSqr <= activationDistSqr) {
- active = true;
- }
- }
- if (active) {
- var updateCurve = (-Math.cos(++updateTick * Math.PI / (updatePeriod / 2)) + 0.5) / 1.5;
- if (self.jumping) {
- if (updateCurve <= 0) {
- self.jumping = false;
- jumpVelocityX = 0;
- jumpVelocityY = 0;
- }
- } else {
- if (updateCurve > 0) {
- var boost = player.invulnerable ? invulnerabilityBoost : 1;
- var targetPosX = player.x + velocityX * jumpDuration * boost;
- var targetPosY = player.y + velocityY * jumpDuration * boost;
- var ddx = targetPosX - self.x;
- var ddy = targetPosY - self.y;
- var angle = Math.atan2(ddy, ddx);
- var targetDistSqr = ddx * ddx + ddy * ddy;
- var jumpSpeed = jumpSpeedMax * (targetDistSqr >= jumpDistMaxSqr ? 1 : Math.sqrt(targetDistSqr) / jumpDistMax);
- jumpVelocityX = Math.cos(angle) * jumpSpeed;
- jumpVelocityY = Math.sin(angle) * jumpSpeed;
- self.jumping = true;
- }
- }
- graphics.y = -Math.max(0, updateCurve) * jumpHeight;
- graphics.scale.x = player.x < self.x ? -1 : 1;
- graphics.scale.y = 1 + Math.min(0, updateCurve);
- shadow.scale.set(1 - shadowReduction * updateCurve);
- }
- self.x += jumpVelocityX - velocityX;
- self.y += jumpVelocityY - velocityY;
- return self.y < despawnY;
+ function _update_migrated(velocityX, velocityY) {
+ self.x += speedX - velocityX;
+ self.y += speedY - velocityY;
+ scale -= scaleDecrement;
+ graphics.rotation += spinSpeed;
+ graphics.scale.set(scale);
+ return scale <= 0;
}
});
-var Pickup = Container.expand(function (x, y) {
+var Interface = Container.expand(function (x, y) {
var self = Container.call(this);
- var activeDist = 300;
- var activeDistSqr = activeDist * activeDist;
- var collectDist = 50;
- var collectDistSqr = collectDist * collectDist;
- var collectSpeed = 25;
- var collectOffset = -50;
- var active = false;
- var variant = Math.floor(Math.random() * 3);
- var graphics = self.createAsset('pickup' + variant, 'Pickup graphics', 0.5, 0.95);
- var backShadow = self.createAsset('shadow', 'Pickup background shadow', 0.5, 0.5);
- var foreShadow = self.createAsset('shadow', 'Pickup foreground shadow', 0.5, 0.5);
- foreShadow.width = graphics.width;
- foreShadow.height = graphics.width * 0.25;
- backShadow.width = graphics.width;
- backShadow.height = graphics.width * 0.25;
- backShadow.tint = 0x000000;
- backShadow.y = -3;
+ var score = 0;
+ var lives = 3;
+ var lifeIcons = [];
+ var scoreIcon = self.attachAsset('scoreIcon', {
+ anchorX: 0.5
+ });
+ var scoreText = self.addChild(new Text2('| ' + score, {
+ size: 70,
+ fill: "#000000",
+ align: 'left'
+ }));
+ var distanceText = self.addChild(new Text2('0m', {
+ size: 70,
+ fill: "#000000",
+ align: 'right'
+ }));
+ for (var i = 0; i < lives; i++) {
+ var lifeIcon = self.attachAsset('lifeIcon', {
+ anchorX: 1
+ });
+ lifeIcon.x = -10 - i * 60;
+ lifeIcon.y = scoreIcon.height + 20;
+ lifeIcons.push(lifeIcon);
+ }
+ scoreText.x = -5;
+ scoreText.y = scoreIcon.height;
+ scoreText.anchor.set(0, 0);
+ distanceText.x = STAGE_WIDTH / 2 - 350;
+ distanceText.y = 30;
+ distanceText.anchor.set(1, 0);
;
self.x = x;
self.y = y;
- self.update = update;
+ self._update_migrated = _update_migrated;
+ self.changeScore = changeScore;
+ self.changeLives = changeLives;
;
- function update(velocityX, velocityY, player) {
- var dx = player.x - self.x;
- var dy = player.y + collectOffset - self.y;
- var distSqr = dx * dx + dy * dy;
- if (self.active) {
- var dist = Math.sqrt(distSqr);
- self.x += dx / dist * collectSpeed;
- self.y += dy / dist * collectSpeed;
- } else if (distSqr <= activeDistSqr) {
- self.active = true;
- backShadow.destroy();
- foreShadow.destroy();
- } else {
- self.x -= velocityX;
- self.y -= velocityY;
+ function _update_migrated(distance) {
+ distanceText.setText(Math.round(distance * SCREEN_METERAGE) + 'm');
+ }
+ function changeLives(amount) {
+ lives += amount;
+ for (var i = 0; i < lifeIcons.length; i++) {
+ lifeIcons[i].alpha = i < lives ? 1 : 0.5;
}
- return distSqr <= collectDistSqr;
+ if (amount < 0) {
+ LK.effects.flashScreen(0xaa0000, 300);
+ if (lives <= 0) {
+ return true;
+ }
+ }
+ return false;
}
+ function changeScore(amount) {
+ var returnValue = amount < 0 && score > 0;
+ score = Math.max(0, score + amount);
+ LK.setScore(score);
+ scoreText.setText('| ' + score);
+ return returnValue;
+ }
});
-var LandscapeTile = Container.expand(function (x, y, {lookup, xIndex, yIndex, density, pickups, monsters, player, key, landscapeTiles, layers, rampList}) {
+var LandscapeTile = Container.expand(function (x, y, _ref) {
var self = Container.call(this);
+ var lookup = _ref.lookup,
+ xIndex = _ref.xIndex,
+ yIndex = _ref.yIndex,
+ density = _ref.density,
+ pickups = _ref.pickups,
+ monsters = _ref.monsters,
+ player = _ref.player,
+ key = _ref.key,
+ landscapeTiles = _ref.landscapeTiles,
+ layers = _ref.layers,
+ rampList = _ref.rampList;
var obstructions = [];
- var background = self.createAsset('landscapeBackground', 'Landscape background', 0.5, 0.5);
+ var background = self.attachAsset('landscapeBackground', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
background.width = TILE_SIZE;
background.height = TILE_SIZE;
background.alpha = 0.03;
background.x = yIndex % 2 === 0 ? TILE_BACKGROUND_OFFSET : 0;
@@ -212,23 +182,31 @@
var cellWidth = TILE_SIZE / cols;
var cellHeight = TILE_SIZE / rows;
var landmark;
if (Math.random() <= SPAWN_PICKUP_CHANCE) {
- var {pointX, pointY} = randomPointInRect(self.x, self.y, TILE_SIZE, TILE_SIZE, clearanceDist);
+ var _randomPointInRect = randomPointInRect(self.x, self.y, TILE_SIZE, TILE_SIZE, clearanceDist),
+ pointX = _randomPointInRect.pointX,
+ pointY = _randomPointInRect.pointY;
pickups.push(landmark = self.parent.addChild(new Pickup(pointX, pointY)));
} else if (Math.random() <= SPAWN_RAMP_CHANCE) {
- var {pointX, pointY} = randomPointInRect(self.x, self.y, TILE_SIZE, TILE_SIZE, clearanceDist);
+ var _randomPointInRect2 = randomPointInRect(self.x, self.y, TILE_SIZE, TILE_SIZE, clearanceDist),
+ pointX = _randomPointInRect2.pointX,
+ pointY = _randomPointInRect2.pointY;
rampList.push(landmark = layers[LAYER_BACKGROUND].addChild(new Ramp(pointX, pointY)));
}
if (player.distanceTravelled > MONSTER_SPAWN_DIST && Math.random() <= SPAWN_MONSTER_CHANCE) {
- var {pointX, pointY} = randomPointInRect(self.x, self.y, TILE_SIZE, TILE_SIZE, clearanceDist);
+ var _randomPointInRect3 = randomPointInRect(self.x, self.y, TILE_SIZE, TILE_SIZE, clearanceDist),
+ pointX = _randomPointInRect3.pointX,
+ pointY = _randomPointInRect3.pointY;
monsters.push(self.parent.addChild(new Monster(self.x, self.y)));
}
for (i = 0; i < cols; i++) {
for (j = 0; j < rows; j++) {
if (Math.random() <= densityChance) {
var canPlace = true;
- var {pointX, pointY} = randomPointInRect(cellWidth * i, cellHeight * j, cellWidth, cellHeight, spawnBorder);
+ var _randomPointInRect4 = randomPointInRect(cellWidth * i, cellHeight * j, cellWidth, cellHeight, spawnBorder),
+ pointX = _randomPointInRect4.pointX,
+ pointY = _randomPointInRect4.pointY;
if (landmark) {
var dx = landmark.x - pointX;
var dy = landmark.y - pointY;
var distSqr = dx * dx + dy * dy;
@@ -252,96 +230,152 @@
landscapeTiles.push(lookup[leftKey] = self.parent.addChild(new LandscapeTile(self.x - TILE_SIZE, self.y, {
key: leftKey,
density: newDensity,
xIndex: xIndex - 1,
- yIndex,
- landscapeTiles,
- rampList,
- lookup,
- pickups,
- monsters,
- layers,
- player
+ yIndex: yIndex,
+ landscapeTiles: landscapeTiles,
+ rampList: rampList,
+ lookup: lookup,
+ pickups: pickups,
+ monsters: monsters,
+ layers: layers,
+ player: player
})));
}
if (!lookup[rightKey]) {
landscapeTiles.push(lookup[rightKey] = self.parent.addChild(new LandscapeTile(self.x + TILE_SIZE, self.y, {
key: rightKey,
density: newDensity,
xIndex: xIndex + 1,
- yIndex,
- landscapeTiles,
- rampList,
- lookup,
- pickups,
- monsters,
- layers,
- player
+ yIndex: yIndex,
+ landscapeTiles: landscapeTiles,
+ rampList: rampList,
+ lookup: lookup,
+ pickups: pickups,
+ monsters: monsters,
+ layers: layers,
+ player: player
})));
}
if (!lookup[downKey]) {
landscapeTiles.push(lookup[downKey] = self.parent.addChild(new LandscapeTile(self.x, self.y + TILE_SIZE, {
key: downKey,
density: newDensity,
yIndex: yIndex + 1,
- xIndex,
- landscapeTiles,
- rampList,
- lookup,
- pickups,
- monsters,
- layers,
- player
+ xIndex: xIndex,
+ landscapeTiles: landscapeTiles,
+ rampList: rampList,
+ lookup: lookup,
+ pickups: pickups,
+ monsters: monsters,
+ layers: layers,
+ player: player
})));
}
- function randomPointInRect(centerX, centerY, width, height, border = 0) {
+ function randomPointInRect(centerX, centerY, width, height) {
+ var border = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
var startX = centerX - width / 2 + border;
var startY = centerY - height / 2 + border;
var innerWidth = width - border * 2;
var innerHeight = height - border * 2;
var pointX = startX + Math.random() * innerWidth;
var pointY = startY + Math.random() * innerHeight;
return {
- pointX,
- pointY
+ pointX: pointX,
+ pointY: pointY
};
}
}
});
-var Ramp = Container.expand(function (x, y) {
+var Monster = Container.expand(function (x, y) {
var self = Container.call(this);
- var rampPillar = self.createAsset('rampPillar', 'Ramp pillar graphics', 0.5, 0.5);
- var rampShadow = self.createAsset('rampShadow', 'Ramp shadow graphics', 0.5, -0.2);
- var rampGraphics = self.createAsset('ramp', 'Ramp graphics', 0.5, 0);
- var hitbox = self.createAsset('hitbox', 'Ramp hitbox', 0.5, 0);
- rampShadow.rotation = 0.1;
- rampShadow.alpha = 0.5;
- rampShadow.tint = 0x000000;
- rampPillar.y = rampGraphics.height;
- hitbox.width = rampGraphics.width;
- hitbox.height = 50;
- hitbox.alpha = 0;
+ var active = false;
+ var updateTick = 0;
+ var updatePeriod = 30;
+ var jumpSpeedMax = 30;
+ var jumpHeight = 100;
+ var jumpVelocityX = 0;
+ var jumpVelocityY = 0;
+ var jumpDuration = updatePeriod * 2 / 3;
+ var invulnerabilityBoost = 1.8;
+ var jumpDistMax = jumpSpeedMax * jumpDuration;
+ var jumpDistMaxSqr = jumpDistMax * jumpDistMax;
+ var activationDist = 1000;
+ var activationDistSqr = activationDist * activationDist;
+ var despawnY = -2500;
+ var shadowReduction = 0.1;
+ var shadow = self.attachAsset('shadow', {
+ anchorX: 0.45,
+ anchorY: 1
+ });
+ var graphics = self.attachAsset('monster', {
+ anchorX: 0.5,
+ anchorY: 1
+ });
+ graphics.scale.x = Math.random() < 0.5 ? 1 : -1;
+ shadow.width = graphics.width * 0.9;
+ shadow.height = graphics.width * 0.45;
+ shadow.tint = 0x000000;
+ shadow.alpha = 0.5;
;
self.x = x;
self.y = y;
- self.hitbox = hitbox;
- self.update = update;
+ self.jumping = false;
+ self.hitbox = shadow;
+ self._update_migrated = _update_migrated;
;
- function update(velocityX, velocityY, player) {
- self.x -= velocityX;
- self.y -= velocityY;
- if (self.y < -200) {
- return true;
+ function _update_migrated(velocityX, velocityY, player) {
+ if (!active) {
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distSqr = dx * dx + dy * dy;
+ if (distSqr <= activationDistSqr) {
+ active = true;
+ }
}
- if (!player.airborne && player.hitbox.intersects(self.hitbox)) {
- player.ramp();
+ if (active) {
+ var updateCurve = (-Math.cos(++updateTick * Math.PI / (updatePeriod / 2)) + 0.5) / 1.5;
+ if (self.jumping) {
+ if (updateCurve <= 0) {
+ self.jumping = false;
+ jumpVelocityX = 0;
+ jumpVelocityY = 0;
+ }
+ } else {
+ if (updateCurve > 0) {
+ var boost = player.invulnerable ? invulnerabilityBoost : 1;
+ var targetPosX = player.x + velocityX * jumpDuration * boost;
+ var targetPosY = player.y + velocityY * jumpDuration * boost;
+ var ddx = targetPosX - self.x;
+ var ddy = targetPosY - self.y;
+ var angle = Math.atan2(ddy, ddx);
+ var targetDistSqr = ddx * ddx + ddy * ddy;
+ var jumpSpeed = jumpSpeedMax * (targetDistSqr >= jumpDistMaxSqr ? 1 : Math.sqrt(targetDistSqr) / jumpDistMax);
+ jumpVelocityX = Math.cos(angle) * jumpSpeed;
+ jumpVelocityY = Math.sin(angle) * jumpSpeed;
+ self.jumping = true;
+ }
+ }
+ graphics.y = -Math.max(0, updateCurve) * jumpHeight;
+ graphics.scale.x = player.x < self.x ? -1 : 1;
+ graphics.scale.y = 1 + Math.min(0, updateCurve);
+ shadow.scale.set(1 - shadowReduction * updateCurve);
}
+ self.x += jumpVelocityX - velocityX;
+ self.y += jumpVelocityY - velocityY;
+ return self.y < despawnY;
}
});
var Obstruction = Container.expand(function (x, y, type) {
var self = Container.call(this);
- var graphics = self.createAsset(type, 'Obstruction graphics', 0.5, 1);
- var hitbox = self.createAsset('hitbox', 'Obstruction hitbox', 0.5, 0.5);
+ var graphics = self.createAsset(type, {
+ anchorX: 0.5,
+ anchorY: 1
+ });
+ var hitbox = self.attachAsset('hitbox', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
var randomScale = 0.9 + Math.random() * 0.2;
hitbox.y = -25;
hitbox.alpha = 0;
hitbox.width = graphics.width * 0.8;
@@ -358,8 +392,60 @@
self.active = false;
graphics.alpha = 0.5;
}
});
+var Pickup = Container.expand(function (x, y) {
+ var self = Container.call(this);
+ var activeDist = 300;
+ var activeDistSqr = activeDist * activeDist;
+ var collectDist = 50;
+ var collectDistSqr = collectDist * collectDist;
+ var collectSpeed = 25;
+ var collectOffset = -50;
+ var active = false;
+ var variant = Math.floor(Math.random() * 3);
+ var graphics = self.createAsset('pickup' + variant, {
+ anchorX: 0.5,
+ anchorY: 0.95
+ });
+ var backShadow = self.attachAsset('shadow', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var foreShadow = self.attachAsset('shadow', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ foreShadow.width = graphics.width;
+ foreShadow.height = graphics.width * 0.25;
+ backShadow.width = graphics.width;
+ backShadow.height = graphics.width * 0.25;
+ backShadow.tint = 0x000000;
+ backShadow.y = -3;
+ ;
+ self.x = x;
+ self.y = y;
+ self._update_migrated = _update_migrated;
+ ;
+ function _update_migrated(velocityX, velocityY, player) {
+ var dx = player.x - self.x;
+ var dy = player.y + collectOffset - self.y;
+ var distSqr = dx * dx + dy * dy;
+ if (self.active) {
+ var dist = Math.sqrt(distSqr);
+ self.x += dx / dist * collectSpeed;
+ self.y += dy / dist * collectSpeed;
+ } else if (distSqr <= activeDistSqr) {
+ self.active = true;
+ backShadow.destroy();
+ foreShadow.destroy();
+ } else {
+ self.x -= velocityX;
+ self.y -= velocityY;
+ }
+ return distSqr <= collectDistSqr;
+ }
+});
var Player = Container.expand(function (x, y) {
var self = Container.call(this);
var angle = 0;
var speed = 0;
@@ -370,12 +456,24 @@
var rampDuration = 0;
var rampHeight = 0;
var rampHeightMax = 0;
var tiltSpeedFactor = 100;
- var playerShadow = self.createAsset('shadow', 'Player shadow', 0.5, 0.5);
- var platformGraphics = self.createAsset('platform', 'Platform image', 0.4, 0.5);
- var playerGraphics = self.createAsset('player', 'Player character', 0.575, 1);
- var hitbox = self.createAsset('hitbox', 'Player Hitbox', 0.5, 0.5);
+ var playerShadow = self.attachAsset('shadow', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var platformGraphics = self.attachAsset('platform', {
+ anchorX: 0.4,
+ anchorY: 0.5
+ });
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.575,
+ anchorY: 1
+ });
+ var hitbox = self.attachAsset('hitbox', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
playerShadow.alpha = 0.5;
playerShadow.scale.set(1.0, 0.6);
playerShadow.tint = 0x000000;
hitbox.width = 25;
@@ -389,12 +487,12 @@
self.invulnerableTime = 3 * 60;
self.invulnerableTimer = 0;
self.distanceTravelled = 0;
self.hitbox = hitbox;
- self.update = update;
+ self._update_migrated = _update_migrated;
self.ramp = ramp;
;
- function update(targetPosition) {
+ function _update_migrated(targetPosition) {
if (self.invulnerable) {
if (--self.invulnerableTimer <= 0) {
self.invulnerable = false;
}
@@ -428,10 +526,10 @@
playerGraphics.rotation = speed * reduction / tiltSpeedFactor * (Math.PI / 2) * facingSide;
playerGraphics.scale.x = facingSide;
}
return {
- velocityX,
- velocityY
+ velocityX: velocityX,
+ velocityY: velocityY
};
}
function angleClamp(angle) {
return angle >= 0 ? angle : angle < -Math.PI / 2 ? Math.PI : 0;
@@ -445,22 +543,63 @@
rampRemaining = rampDuration;
}
}
});
+var Ramp = Container.expand(function (x, y) {
+ var self = Container.call(this);
+ var rampPillar = self.attachAsset('rampPillar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var rampShadow = self.attachAsset('rampShadow', {
+ anchorX: 0.5
+ });
+ var rampGraphics = self.attachAsset('ramp', {
+ anchorX: 0.5
+ });
+ var hitbox = self.attachAsset('hitbox', {
+ anchorX: 0.5
+ });
+ rampShadow.rotation = 0.1;
+ rampShadow.alpha = 0.5;
+ rampShadow.tint = 0x000000;
+ rampPillar.y = rampGraphics.height;
+ hitbox.width = rampGraphics.width;
+ hitbox.height = 50;
+ hitbox.alpha = 0;
+ ;
+ self.x = x;
+ self.y = y;
+ self.hitbox = hitbox;
+ self._update_migrated = _update_migrated;
+ ;
+ function _update_migrated(velocityX, velocityY, player) {
+ self.x -= velocityX;
+ self.y -= velocityY;
+ if (self.y < -200) {
+ return true;
+ }
+ if (!player.airborne && player.hitbox.intersects(self.hitbox)) {
+ player.ramp();
+ }
+ }
+});
var Trail = Container.expand(function (x, y) {
var self = Container.call(this);
var trailLength = 60;
var trailAlpha = 0.4;
var trailElements = [];
;
self.x = x;
self.y = y;
- self.update = update;
+ self._update_migrated = _update_migrated;
;
- function update(velocityX, velocityY, active) {
+ function _update_migrated(velocityX, velocityY, active) {
var trailElement = null;
if (active && (velocityX !== 0 || velocityY !== 0)) {
- trailElement = self.createAsset('trail', 'Trail element', 0, 0.5);
+ trailElement = self.attachAsset('trail', {
+ anchorY: 0.5
+ });
var angle = Math.atan2(velocityY, velocityX);
var speed = Math.sqrt(velocityX * velocityX + velocityY * velocityY);
trailElement.rotation = angle;
trailElement.scale.x = speed / 100;
@@ -482,67 +621,19 @@
}
}
}
});
-var Interface = Container.expand(function (x, y) {
- var self = Container.call(this);
- var score = 0;
- var lives = 3;
- var lifeIcons = [];
- var scoreIcon = self.createAsset('scoreIcon', 'Score icon', 0.5, 0);
- var scoreText = self.addChild(new Text2('| ' + score, {
- size: 70,
- fill: "#000000",
- align: 'left'
- }));
- var distanceText = self.addChild(new Text2('0m', {
- size: 70,
- fill: "#000000",
- align: 'right'
- }));
- for (var i = 0; i < lives; i++) {
- var lifeIcon = self.createAsset('lifeIcon', 'Life icon', 1, 0);
- lifeIcon.x = -10 - i * 60;
- lifeIcon.y = scoreIcon.height + 20;
- lifeIcons.push(lifeIcon);
- }
- scoreText.x = -5;
- scoreText.y = scoreIcon.height;
- scoreText.anchor.set(0, 0);
- distanceText.x = STAGE_WIDTH / 2 - 350;
- distanceText.y = 30;
- distanceText.anchor.set(1, 0);
- ;
- self.x = x;
- self.y = y;
- self.update = update;
- self.changeScore = changeScore;
- self.changeLives = changeLives;
- ;
- function update(distance) {
- distanceText.setText(Math.round(distance * SCREEN_METERAGE) + 'm');
- }
- function changeLives(amount) {
- lives += amount;
- for (var i = 0; i < lifeIcons.length; i++) {
- lifeIcons[i].alpha = i < lives ? 1 : 0.5;
- }
- if (amount < 0) {
- LK.effects.flashScreen(0xaa0000, 300);
- if (lives <= 0) {
- return true;
- }
- }
- return false;
- }
- function changeScore(amount) {
- var returnValue = amount < 0 && score > 0;
- score = Math.max(0, score + amount);
- LK.setScore(score);
- scoreText.setText('| ' + score);
- return returnValue;
- }
+
+/****
+* Initialize Game
+****/
+var game = new LK.Game({
+ backgroundColor: 0x000000
});
+
+/****
+* Game Code
+****/
;
var STAGE_WIDTH = 2048;
var STAGE_HEIGHT = 2732;
var SCREEN_METERAGE = 1 / 150;
@@ -562,121 +653,120 @@
var LAYER_BACKGROUND = 0;
var LAYER_MIDGROUND = 1;
var LAYER_FOREGROUND = 2;
;
-var Game = Container.expand(function () {
- var self = Container.call(this);
- var playerPosX = Math.round(STAGE_WIDTH / 2);
- var playerPosY = Math.round(STAGE_WIDTH / 3);
- var landscapeLookup = {};
- var landscapeTiles = [];
- var pickups = [];
- var monsters = [];
- var effects = [];
- var rampList = [];
- var layers = [self.addChild(new Container()), self.addChild(new Container()), self.addChild(new Container())];
- var speed = 0;
- var interface = LK.gui.topCenter.addChild(new Interface(0, 10));
- var trail = layers[LAYER_BACKGROUND].addChild(new Trail(playerPosX, playerPosY));
- var player = layers[LAYER_MIDGROUND].addChild(new Player(playerPosX, playerPosY));
- landscapeTiles.push(landscapeLookup['0:0'] = layers[LAYER_FOREGROUND].addChild(new LandscapeTile(STAGE_WIDTH / 2, TILE_SIZE / 2, {
- density: -1,
- lookup: landscapeLookup,
- xIndex: 0,
- yIndex: 0,
- key: '0:0',
- landscapeTiles,
- rampList,
- monsters,
- pickups,
- layers,
- player
- })));
- var isMouseDown = false;
- var targetPosition = {
- x: playerPosX,
- y: playerPosY
- };
- LK.stageContainer.setBackgroundColor(0xFFFFFF);
- ;
- stage.on('down', function (obj) {
- isMouseDown = true;
- updatePosition(obj.event);
- });
- stage.on('up', function (obj) {
- isMouseDown = false;
- });
- stage.on('move', function (obj) {
- if (isMouseDown) {
- updatePosition(obj.event);
- }
- });
- LK.on('tick', function () {
- var {velocityX, velocityY} = player.update(targetPosition);
- trail.update(velocityX, velocityY, !player.airborne);
- interface.update(player.distanceTravelled);
- for (var i = landscapeTiles.length - 1; i >= 0; i--) {
- var landscapeTile = landscapeTiles[i];
- landscapeTile.x -= velocityX;
- landscapeTile.y -= velocityY;
- if (landscapeTile.y < -(TILE_SIZE / 2 + TILE_MARGIN)) {
- landscapeTile.destroy();
- landscapeTiles.splice(i, 1);
- landscapeLookup[landscapeTile.key] = undefined;
- } else if (!landscapeTile.active && landscapeTile.x > -TILE_MARGIN && landscapeTile.x < STAGE_WIDTH + TILE_MARGIN && landscapeTile.y < STAGE_HEIGHT + TILE_MARGIN) {
- landscapeTile.activate();
- } else if (landscapeTile.checkCollision(player)) {
- if (interface.changeScore(-1)) {
- effects.push(new DropEffect(self, player.x, player.y));
- }
- if (!player.invulnerable) {
- player.invulnerable = true;
- player.invulnerableTimer = player.invulnerableTime;
- }
+var playerPosX = Math.round(STAGE_WIDTH / 2);
+var playerPosY = Math.round(STAGE_WIDTH / 3);
+var landscapeLookup = {};
+var landscapeTiles = [];
+var pickups = [];
+var monsters = [];
+var effects = [];
+var rampList = [];
+var layers = [game.addChild(new Container()), game.addChild(new Container()), game.addChild(new Container())];
+var speed = 0;
+var __interface = LK.gui.top.addChild(new Interface(0, 10));
+var trail = layers[LAYER_BACKGROUND].addChild(new Trail(playerPosX, playerPosY));
+var player = layers[LAYER_MIDGROUND].addChild(new Player(playerPosX, playerPosY));
+landscapeTiles.push(landscapeLookup['0:0'] = layers[LAYER_FOREGROUND].addChild(new LandscapeTile(STAGE_WIDTH / 2, TILE_SIZE / 2, {
+ density: -1,
+ lookup: landscapeLookup,
+ xIndex: 0,
+ yIndex: 0,
+ key: '0:0',
+ landscapeTiles: landscapeTiles,
+ rampList: rampList,
+ monsters: monsters,
+ pickups: pickups,
+ layers: layers,
+ player: player
+})));
+var isMouseDown = false;
+var targetPosition = {
+ x: playerPosX,
+ y: playerPosY
+};
+game.setBackgroundColor(0xFFFFFF);
+;
+game.on('down', function (x, y, obj) {
+ isMouseDown = true;
+ updatePosition(obj);
+});
+game.on('up', function (x, y, obj) {
+ isMouseDown = false;
+});
+game.on('move', function (x, y, obj) {
+ if (isMouseDown) {
+ updatePosition(obj);
+ }
+});
+LK.on('tick', function () {
+ var _player$update = player._update_migrated(targetPosition),
+ velocityX = _player$update.velocityX,
+ velocityY = _player$update.velocityY;
+ trail._update_migrated(velocityX, velocityY, !player.airborne);
+ __interface._update_migrated(player.distanceTravelled);
+ for (var i = landscapeTiles.length - 1; i >= 0; i--) {
+ var landscapeTile = landscapeTiles[i];
+ landscapeTile.x -= velocityX;
+ landscapeTile.y -= velocityY;
+ if (landscapeTile.y < -(TILE_SIZE / 2 + TILE_MARGIN)) {
+ landscapeTile.destroy();
+ landscapeTiles.splice(i, 1);
+ landscapeLookup[landscapeTile.key] = undefined;
+ } else if (!landscapeTile.active && landscapeTile.x > -TILE_MARGIN && landscapeTile.x < STAGE_WIDTH + TILE_MARGIN && landscapeTile.y < STAGE_HEIGHT + TILE_MARGIN) {
+ landscapeTile.activate();
+ } else if (landscapeTile.checkCollision(player)) {
+ if (__interface.changeScore(-1)) {
+ effects.push(new DropEffect(game, player.x, player.y));
}
- }
- for (var i = pickups.length - 1; i >= 0; i--) {
- var pickup = pickups[i];
- if (pickup.update(velocityX, velocityY, player)) {
- interface.changeScore(1);
- pickup.destroy();
- pickups.splice(i, 1);
- } else if (pickup.y < -(TILE_SIZE / 2 + TILE_MARGIN) || pickup.active && player.hitbox.intersects(pickup.hitbox)) {
- pickup.destroy();
- pickups.splice(i, 1);
+ if (!player.invulnerable) {
+ player.invulnerable = true;
+ player.invulnerableTimer = player.invulnerableTime;
}
}
- for (var i = effects.length - 1; i >= 0; i--) {
- var effect = effects[i];
- if (effect.update(velocityX, velocityY)) {
- effect.destroy();
- effects.splice(i, 1);
- }
+ }
+ for (var i = pickups.length - 1; i >= 0; i--) {
+ var pickup = pickups[i];
+ if (pickup._update_migrated(velocityX, velocityY, player)) {
+ __interface.changeScore(1);
+ pickup.destroy();
+ pickups.splice(i, 1);
+ } else if (pickup.y < -(TILE_SIZE / 2 + TILE_MARGIN) || pickup.active && player.hitbox.intersects(pickup.hitbox)) {
+ pickup.destroy();
+ pickups.splice(i, 1);
}
- for (var i = rampList.length - 1; i >= 0; i--) {
- var ramp = rampList[i];
- if (ramp.update(velocityX, velocityY, player)) {
- rampList.splice(i, 1);
- }
+ }
+ for (var i = effects.length - 1; i >= 0; i--) {
+ var effect = effects[i];
+ if (effect._update_migrated(velocityX, velocityY)) {
+ effect.destroy();
+ effects.splice(i, 1);
}
- for (var i = monsters.length - 1; i >= 0; i--) {
- var monster = monsters[i];
- if (monster.update(velocityX, velocityY, player)) {
- monster.destroy();
- monsters.splice(i, 1);
- } else if (!monster.jumping && !player.airborne && monster.hitbox.intersects(player.hitbox)) {
- effects.push(new BloodsplatterEffect(self, monster.x, monster.y));
- monster.destroy();
- monsters.splice(i, 1);
- if (interface.changeLives(-1)) {
- LK.showGameOver();
- }
+ }
+ for (var i = rampList.length - 1; i >= 0; i--) {
+ var ramp = rampList[i];
+ if (ramp._update_migrated(velocityX, velocityY, player)) {
+ rampList.splice(i, 1);
+ }
+ }
+ for (var i = monsters.length - 1; i >= 0; i--) {
+ var monster = monsters[i];
+ if (monster._update_migrated(velocityX, velocityY, player)) {
+ monster.destroy();
+ monsters.splice(i, 1);
+ } else if (!monster.jumping && !player.airborne && monster.hitbox.intersects(player.hitbox)) {
+ effects.push(new BloodsplatterEffect(game, monster.x, monster.y));
+ monster.destroy();
+ monsters.splice(i, 1);
+ if (__interface.changeLives(-1)) {
+ LK.showGameOver();
}
}
- });
- ;
- function updatePosition(event) {
- var pos = event.getLocalPosition(self);
- targetPosition.x = pos.x;
- targetPosition.y = pos.y;
}
});
+;
+function updatePosition(event) {
+ var pos = game.toLocal(event.global);
+ targetPosition.x = pos.x;
+ targetPosition.y = pos.y;
+}
\ No newline at end of file
Pixel art heart icon . Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
two vertical lines with a blank background.
single green firework explosion . Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Pixel art of a cute elf. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
tileable green grass texture..
arbre chene.
cerisier avec des fleur. Pixel art.
pixel art of a large rock.
pixel art of a tree stump.
pixel art of a 4 leaf clover.
pixel art of a wooden board.
pixel art of a bush.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a 4 leaf orange clover... Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a 4 leaf purple clover.... Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a 4 leaf indigo clover.... Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A start button for an elf game in a magic forest. Pixel art.