Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
attach a rangeIndicator asset to the frog class, tinted red and with 0.2 opacity
Code edit (12 edits merged)
Please save this source code
User prompt
rename `highlightRange` asset to `rangeIndicator`
Code edit (1 edits merged)
Please save this source code
User prompt
Create a new, empty class called ShiftContainer that inherits from the ConfigContainer. All `new Container()`s that were added to the camera should call `new ShiftContainer()` instead
Code edit (1 edits merged)
Please save this source code
===================================================================
--- original.js
+++ change.js
@@ -46,20 +46,24 @@
});
var Pickup = ConfigContainer.expand(function (config) {
var self = ConfigContainer.call(this, config);
config = config || {};
+ var collected = false;
var collectable = self.attachAsset('collectable', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.random() * Math.PI * 2
});
self.collect = function () {
- LK.getSound('pickupCaught').play();
- gameInterface.increaseMultiplier();
- self.destroy();
+ if (!collected) {
+ collected = true;
+ LK.getSound('pickupCaught').play();
+ gameInterface.increaseMultiplier();
+ self.destroy();
+ }
};
self.update = function () {
- if (collectable.intersects(frog.collision)) {
+ if (!collected && checkVacinity(self, frog) && collectable.intersects(frog.collision)) {
self.collect();
} else if (self.x < firewall.x) {
self.destroy();
}
@@ -101,18 +105,17 @@
pickup.collect();
}
};
self.update = function () {
- if (active && lilypad.intersects(frog.collision)) {
- frog.bounce();
- self.launch();
- }
if (destroying) {
if (self.alpha <= 0) {
self.destroy();
}
self.alpha -= 0.1;
self.y += 10;
+ } else if (active && checkVacinity(self, frog) && lilypad.intersects(frog.collision)) {
+ frog.bounce();
+ self.launch();
}
if (self.x < firewall.x) {
self.destroy();
}
@@ -194,9 +197,9 @@
return self;
});
var Highlight = ConfigContainer.expand(function (config) {
var self = ConfigContainer.call(this, config);
- self.addChild(new BorderedSymbol('highlight', {
+ self.addChild(new BorderedSymbol('rangeIndicator', {
anchorX: 0.5,
anchorY: 0.5,
weight: 4
}));
@@ -215,9 +218,9 @@
scaleY: config.scale,
tint: 0x1a1a3f,
// Slight hue added to the dark tint
// 90% black
- alpha: 0.9
+ alpha: 0.75
});
self.update = function () {
if (self.x < firewall.x) {
self.destroy();
@@ -279,9 +282,9 @@
self.sitting = false;
self.hookedObj = hook;
var dx = self.x - self.hookedObj.x;
var dy = self.y - self.hookedObj.y;
- hookLength = Math.sqrt(dx * dx + dy * dy);
+ hookLength = Math.max(PLAYER_TONGUE_RANGE_MIN, Math.sqrt(dx * dx + dy * dy));
velocityAngle = Math.atan2(dy, dx);
var direction = Math.atan2(velocityY, velocityX);
var magnitude = Math.sin(direction - velocityAngle) * PLAYER_ATTACH_MULTIPLIER;
angularVelocity = magnitude * Math.sqrt(velocityX * velocityX + velocityY * velocityY) / hookLength;
@@ -432,10 +435,8 @@
var childInstance = shiftContainer.children[j];
childInstance.x -= shiftX;
}
}
- foreground.x -= x / FOREGROUND_MOVEMENT;
- shadowground.x += x / SHADOWGROUND_MOVEMENT;
// Manually adjust the frog's position
frog.x += x;
frog.y += y;
// Keep track of the scoring
@@ -613,8 +614,9 @@
// Game Constants
var GAME_TICKS = 60;
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
+var GAME_VACINITY_DIST = 200;
;
// Math Constants / Pre-calculations
var MATH_4_PI = Math.PI * 4;
var MATH_2_PI = Math.PI * 2;
@@ -682,17 +684,21 @@
var FOREGROUND_COVERAGE = 6 * GAME_WIDTH;
var FOREGROUND_OFFSET_X = 200;
var FOREGROUND_SCALE = 1.0;
var FOREGROUND_MOVEMENT = 25;
+var FOREGROUND_SHIFT_FACTOR = 1.0;
var SHADOWGROUND_OFFSET_X = -50;
var SHADOWGROUND_OFFSET_Y = -200;
var SHADOWGROUND_SCALE = 0.65;
-var SHADOWGROUND_MOVEMENT = 3;
-var GRASS_ASSETS = ['grassTall', 'grassShort', 'grassAngled'];
+var SHADOWGROUND_SHIFT_FACTOR = 0.7;
+var GRASS_ASSETS = ['grassTall', 'grassShort', 'grassAngled', 'grassShort', 'grassAngled'];
var GRASS_SPAWN_MARGIN = 2 * GAME_WIDTH;
var GRASS_SCALE_VAR = 0.15;
-var GRASS_SPAWN_X_MIN = 50;
-var GRASS_SPAWN_X_VAR = 450;
+var GRASS_SPAWN_X_MIN = 10;
+var GRASS_SPAWN_X_VAR = 990;
+var GRASS_SPAWN_Y = 200;
+var GRASS_SHIFT_FACTOR_1 = 1.25;
+var GRASS_SHIFT_FACTOR_2 = 1.35;
;
// Scoring Settings
var SCORE_PER_DISTANCE = 0.01;
var SCORE_PICKUP_MULTIPLER = 0.1;
@@ -723,28 +729,36 @@
x: GAME_WIDTH / 2,
y: GAME_HEIGHT
}));
// Camera containers
-var foregroundContainer = camera.addChild(new ShiftContainer());
-var hookContainer = camera.addChild(new ShiftContainer());
-var lilypadContainer = camera.addChild(new ShiftContainer());
-var pickupContainer = camera.addChild(new ShiftContainer());
-var forefrontContainer = camera.addChild(new ShiftContainer());
-var grassContainer = camera.addChild(new ShiftContainer());
-// Foreground instances
-var shadowground = foregroundContainer.addChild(new Foreground({
+camera.addChild(new ShiftContainer({
+ shift: SHADOWGROUND_SHIFT_FACTOR
+})).addChild(new Foreground({
x: PLAYER_START_X + SHADOWGROUND_OFFSET_X,
y: SHADOWGROUND_OFFSET_Y,
tint: 0x111111,
coverage: FOREGROUND_COVERAGE,
scale: SHADOWGROUND_SCALE
}));
-var foreground = foregroundContainer.addChild(new Foreground({
+camera.addChild(new ShiftContainer({
+ shift: FOREGROUND_SHIFT_FACTOR
+})).addChild(new Foreground({
x: PLAYER_START_X + FOREGROUND_OFFSET_X,
tint: 0x808080,
coverage: FOREGROUND_COVERAGE,
scale: FOREGROUND_SCALE
}));
+var foregroundContainer = camera.addChild(new ShiftContainer());
+var hookContainer = camera.addChild(new ShiftContainer());
+var lilypadContainer = camera.addChild(new ShiftContainer());
+var pickupContainer = camera.addChild(new ShiftContainer());
+var forefrontContainer = camera.addChild(new ShiftContainer());
+var grassContainer1 = camera.addChild(new ShiftContainer({
+ shift: GRASS_SHIFT_FACTOR_1
+}));
+var grassContainer2 = camera.addChild(new ShiftContainer({
+ shift: GRASS_SHIFT_FACTOR_2
+}));
// Camera instances
var defaultPad = lilypadContainer.addChild(new Lilypad({
x: PLAYER_START_X,
y: PLAYER_START_Y,
@@ -768,9 +782,10 @@
var highlight = targetHook.addChild(new Highlight());
// Decor lilypads
lilypadContainer.addChild(new Lilypad({
x: PLAYER_START_X - 50,
- y: -500
+ y: -500,
+ inert: true
}));
lilypadContainer.addChild(new Lilypad({
x: PLAYER_START_X + 100,
y: -300,
@@ -788,14 +803,20 @@
spawnFunction: spawnHook,
positionFunction: positionHook,
margin: HOOK_SPAWN_MARGIN
}));
-forefrontContainer.addChild(new Spawner({
+grassContainer1.addChild(new Spawner({
x: firewall.x,
spawnFunction: spawnGrass,
positionFunction: positionGrass,
margin: GRASS_SPAWN_MARGIN
}));
+grassContainer2.addChild(new Spawner({
+ x: firewall.x,
+ spawnFunction: spawnGrass,
+ positionFunction: positionGrass,
+ margin: GRASS_SPAWN_MARGIN
+}));
;
//==============================================================================
// Spawner functions
//==============================================================================
@@ -831,20 +852,33 @@
}
function spawnGrass(self, x) {
var assetId = Math.floor(Math.random() * GRASS_ASSETS.length);
var scale = 1 + GRASS_SCALE_VAR * (1 - 2 * Math.random());
- grassContainer.addChild(new Grass({
+ self.parent.addChild(new Grass({
asset: GRASS_ASSETS[assetId],
scale: scale,
x: x,
- y: 0
+ y: GRASS_SPAWN_Y
}));
}
function positionGrass(self) {
return GRASS_SPAWN_X_MIN + GRASS_SPAWN_X_VAR * Math.random();
}
;
//==============================================================================
+// Global helper functions
+//==============================================================================
+;
+/**
+* Quick-check to see if objects are in the same vacinity; compares x-values
+* against the GAME_VACINITY_DIST.
+**/
+function checkVacinity(obj1, obj2) {
+ var dx = Math.abs(obj1.x - obj2.x);
+ return dx < GAME_VACINITY_DIST;
+}
+;
+//==============================================================================
// Global events
//==============================================================================
;
game.up = frog.release;
@@ -872,9 +906,8 @@
}
}
// Find the targetHook
var closestHook = undefined;
- var minDistanceSq = PLAYER_TONGUE_RANGE_MIN * PLAYER_TONGUE_RANGE_MIN;
var maxDistanceSq = PLAYER_TONGUE_RANGE_MAX * PLAYER_TONGUE_RANGE_MAX;
// Forward checking
for (var i = 0; i < hookContainer.children.length; i++) {
var hook = hookContainer.children[i];
@@ -882,9 +915,9 @@
var dx = hook.x - frog.x;
if (dx > 0) {
var dy = hook.y - frog.y;
var distanceSq = dx * dx + dy * dy;
- if (distanceSq < maxDistanceSq && distanceSq > minDistanceSq) {
+ if (distanceSq < maxDistanceSq) {
maxDistanceSq = distanceSq;
closestHook = hook;
}
}
@@ -898,9 +931,9 @@
var dx = hook.x - frog.x;
if (dx > PLAYER_START_X - hook.width) {
var dy = hook.y - frog.y;
var distanceSq = dx * dx + dy * dy;
- if (distanceSq < maxDistanceSq && distanceSq > minDistanceSq) {
+ if (distanceSq < maxDistanceSq) {
maxDistanceSq = distanceSq;
closestHook = hook;
}
}
fireCrackle
Sound effect
frogTongue
Sound effect
frogDeath
Sound effect
lilypadBounce
Sound effect
noTarget
Sound effect
backgroundAmbient
Sound effect
fireCrackling1
Sound effect
fireCrackling2
Sound effect
fireCrackling3
Sound effect
fireCrackling4
Sound effect
frogBounce
Sound effect
pickupCaught
Sound effect