littlejsengine 1.9.2 → 1.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,12 +34,12 @@ const persistentParticleDestroyCallback = (particle)=>
34
34
  tileLayers[foregroundLayerIndex].drawTile(particle.pos, particle.size, particle.tileInfo, particle.color, particle.angle, particle.mirror);
35
35
  }
36
36
 
37
- function makeBlood(pos, amount) { makeDebris(pos, hsl(0,1,.5), 50, .1, 0); }
38
- function makeDebris(pos, color = hsl(), amount = 100, size=.2, elasticity = .3)
37
+ function makeBlood(pos, amount) { makeDebris(pos, hsl(0,1,.5), amount, .1, 0); }
38
+ function makeDebris(pos, color = hsl(), amount = 50, size=.2, elasticity = .3)
39
39
  {
40
40
  const color2 = color.lerp(hsl(), .5);
41
41
  const emitter = new ParticleEmitter(
42
- pos, 0, 1, .1, 100, PI, // pos, angle, emitSize, emitTime, emitRate, emiteCone
42
+ pos, 0, 1, .1, amount/.1, PI, // pos, angle, emitSize, emitTime, emitRate, emiteCone
43
43
  0, // tileInfo
44
44
  color, color2, // colorStartA, colorStartB
45
45
  color, color2, // colorEndA, colorEndB
@@ -163,87 +163,96 @@ function destroyTile(pos, makeSound = 1, cleanNeighbors = 1)
163
163
  ///////////////////////////////////////////////////////////////////////////////
164
164
  // sky with background gradient, stars, and planets
165
165
 
166
- let skySeed, skyColor, horizonColor;
167
-
168
- function initSky()
166
+ class Sky extends EngineObject
169
167
  {
170
- skySeed = rand(1e9);
171
- skyColor = randColor(hsl(0,0,.5), hsl(0,0,.9));
172
- horizonColor = skyColor.subtract(hsl(0,0,.05)).mutate(.3).clamp();
173
- }
168
+ constructor()
169
+ {
170
+ super();
174
171
 
175
- function drawSky()
176
- {
177
- // fill background with a gradient
178
- const gradient = mainContext.fillStyle = mainContext.createLinearGradient(0, 0, 0, mainCanvas.height);
179
- gradient.addColorStop(0, skyColor);
180
- gradient.addColorStop(1, horizonColor);
181
- mainContext.fillRect(0, 0, mainCanvas.width, mainCanvas.height);
182
- }
172
+ this.renderOrder = -1e4;
173
+ this.seed = randInt(1e9);
174
+ this.skyColor = randColor(hsl(0,0,.5), hsl(0,0,.9));
175
+ this.horizonColor = this.skyColor.subtract(hsl(0,0,.05,0)).mutate(.3);
176
+ }
183
177
 
184
- function drawStars()
185
- {
186
- // draw stars and planets
187
- const random = new RandomGenerator(skySeed);
188
- for (let i = 1e3; i--;)
178
+ render()
189
179
  {
190
- const size = random.float(1, 6);
191
- const speed = random.float() < .9 ? random.float(5) : random.float(9,99);
192
- const color = hsl(random.float(-.3,.2), random.float()**9, random.float(.5,1), random.float(.3,.9));
193
- const extraSpace = 200;
194
- const w = mainCanvas.width+2*extraSpace, h = mainCanvas.height+2*extraSpace;
195
- const screenPos = vec2(
196
- (random.float(w)+time*speed)%w-extraSpace,
197
- (random.float(h)+time*speed*random.float())%h-extraSpace);
198
-
199
- mainContext.fillStyle = color;
200
- mainContext.fillRect(screenPos.x, screenPos.y, size, size);
180
+ // fill background with a gradient
181
+ const gradient = mainContext.createLinearGradient(0, 0, 0, mainCanvas.height);
182
+ gradient.addColorStop(0, this.skyColor);
183
+ gradient.addColorStop(1, this.horizonColor);
184
+ mainContext.save();
185
+ mainContext.fillStyle = gradient;
186
+ mainContext.fillRect(0, 0, mainCanvas.width, mainCanvas.height);
187
+ mainContext.globalCompositeOperation = 'lighter';
188
+
189
+ // draw stars
190
+ const random = new RandomGenerator(this.seed);
191
+ for (let i=1e3; i--;)
192
+ {
193
+ const size = random.float(.5,2)**2;
194
+ const speed = random.float() < .9 ? random.float(5) : random.float(9,99);
195
+ const color = hsl(random.float(-.3,.2), random.float(), random.float());
196
+ const extraSpace = 50;
197
+ const w = mainCanvas.width+2*extraSpace, h = mainCanvas.height+2*extraSpace;
198
+ const screenPos = vec2(
199
+ (random.float(w)+time*speed)%w-extraSpace,
200
+ (random.float(h)+time*speed*random.float())%h-extraSpace);
201
+ mainContext.fillStyle = color;
202
+ mainContext.fillRect(screenPos.x, screenPos.y, size, size);
203
+ }
204
+ mainContext.restore();
201
205
  }
202
206
  }
203
207
 
204
208
  ///////////////////////////////////////////////////////////////////////////////
205
209
  // parallax background mountain ranges
206
210
 
207
- let tileParallaxLayers;
208
-
209
- function initParallaxLayers()
211
+ class ParallaxLayer extends EngineObject
210
212
  {
211
- tileParallaxLayers = [];
212
- for (let i=3; i--;)
213
+ constructor(index)
213
214
  {
214
- // setup the layer
215
- const parallaxSize = vec2(600,300), startGroundLevel = 99+i*30;
216
- const tileParallaxLayer = tileParallaxLayers[i] = new TileLayer(vec2(), parallaxSize);
217
- tileParallaxLayer.renderOrder = -3e3+i;
218
- tileParallaxLayer.canvas.width = parallaxSize.x;
215
+ super();
216
+
217
+ const size = vec2(1024,512);
218
+ this.size = size;
219
+ this.index = index;
220
+ this.renderOrder = -3e3 + index;
221
+ this.canvas = document.createElement('canvas');
222
+ this.context = this.canvas.getContext('2d');
223
+ this.canvas.width = size.x;
224
+ this.canvas.height = size.y;
219
225
 
220
226
  // create a gradient
221
- const layerColor = levelColor.mutate(.2).lerp(skyColor,.95-i*.15);
222
- const gradient = tileParallaxLayer.context.fillStyle =
223
- tileParallaxLayer.context.createLinearGradient(0,0,0,tileParallaxLayer.canvas.height = parallaxSize.y);
227
+ const o1 = 40-20*index;
228
+ const o2 = 100-30*index;
229
+ const gradient = this.context.createLinearGradient(0,size.y/2-o1,0,size.y/2+o2);
230
+ const layerColor = levelColor.mutate(.1).lerp(sky.skyColor,1-index*.15);
224
231
  gradient.addColorStop(0,layerColor);
225
- gradient.addColorStop(1,layerColor.subtract(hsl(0,0,1,0)).mutate(.1).clamp());
226
-
227
- // draw mountains ranges
228
- let groundLevel = startGroundLevel, groundSlope = rand(-1,1);
229
- for (let x=parallaxSize.x;x--;)
230
- tileParallaxLayer.context.fillRect(x,groundLevel += groundSlope = rand() < .05 ? rand(1, -1) :
231
- groundSlope + (startGroundLevel - groundLevel)/2e3, 1, parallaxSize.y)
232
+ gradient.addColorStop(1,layerColor.mutate(.5).scale(.1,1));
233
+ this.context.fillStyle = gradient;
234
+
235
+ // draw procedural mountains ranges
236
+ let groundLevel = size.y/2, groundSlope = rand(-1,1);
237
+ for (let i=size.x; i--;)
238
+ this.context.fillRect(i, groundLevel += groundSlope = rand() < .3 ? rand(1,-1) :
239
+ groundSlope + (size.y/2 - groundLevel)/300, 1, size.y);
232
240
  }
233
- }
234
241
 
235
- function updateParallaxLayers()
236
- {
237
- tileParallaxLayers.forEach((tileParallaxLayer, i)=>
242
+ render()
238
243
  {
239
- // position layer depending on camera position
240
- const distance = 4+i;
241
- const parallax = vec2(150,30).scale((i*i+1));
242
- const cameraDeltaFromCenter = cameraPos.subtract(levelSize.scale(.5)).divide(levelSize.scale(-.5).divide(parallax));
243
- tileParallaxLayer.scale = vec2(distance/cameraScale);
244
- tileParallaxLayer.pos = cameraPos
245
- .subtract(tileParallaxLayer.size.multiply(tileParallaxLayer.scale).scale(.5))
246
- .add(cameraDeltaFromCenter.scale(1/cameraScale))
247
- .subtract(vec2(0,150/cameraScale))
248
- });
244
+ // position layer based on camera distance from center of level
245
+ const parallax = vec2(1e3,-100).scale(this.index**2);
246
+ const cameraDeltaFromCenter = cameraPos
247
+ .subtract(levelSize.scale(.5))
248
+ .divide(levelSize.divide(parallax));
249
+ const scale = this.size.scale(2+2*this.index);
250
+ const pos = mainCanvasSize.scale(.5) // center screen
251
+ .add(vec2(-scale.x/2,-scale.y/2)) // center layer
252
+ .add(cameraDeltaFromCenter.scale(-.5)) // apply parallax
253
+ .add(vec2(0,(this.index*.1)*this.size.y)); // separate layers
254
+
255
+ // draw the parallax layer onto the main canvas
256
+ mainContext.drawImage(this.canvas, pos.x, pos.y, scale.x, scale.y);
257
+ }
249
258
  }
@@ -8,12 +8,12 @@
8
8
 
9
9
  'use strict';
10
10
 
11
- const tileType_ladder = -1;
12
- const tileType_empty = 0;
13
- const tileType_solid = 1;
14
- const tileType_breakable = 2;
11
+ const tileType_ladder = -1;
12
+ const tileType_empty = 0;
13
+ const tileType_solid = 1;
14
+ const tileType_breakable = 2;
15
15
 
16
- let player, playerStartPos, tileData, tileLayers, foregroundLayerIndex;
16
+ let player, playerStartPos, tileData, tileLayers, foregroundLayerIndex, sky;
17
17
  let levelSize, levelColor, levelBackgroundColor, levelOutlineColor, warmup;
18
18
 
19
19
  const setTileData = (pos, layer, data)=>
@@ -27,10 +27,14 @@ function buildLevel()
27
27
  levelColor = randColor(hsl(0,0,.2), hsl(0,0,.8));
28
28
  levelBackgroundColor = levelColor.mutate().scale(.4,1);
29
29
  levelOutlineColor = levelColor.mutate().add(hsl(0,0,.4)).clamp();
30
-
31
30
  loadLevel();
32
- initSky();
33
- initParallaxLayers();
31
+
32
+ // create sky object with gradient and stars
33
+ sky = new Sky;
34
+
35
+ // create parallax layers
36
+ for (let i=3; i--;)
37
+ new ParallaxLayer(i);
34
38
 
35
39
  // apply decoration to all level tiles
36
40
  const pos = vec2();
@@ -47,7 +51,7 @@ function buildLevel()
47
51
  warmup = 0;
48
52
 
49
53
  // spawn player
50
- player = new Player(cameraPos = playerStartPos);
54
+ player = new Player(playerStartPos);
51
55
  }
52
56
 
53
57
  function loadLevel()
@@ -59,6 +63,19 @@ function loadLevel()
59
63
  initTileCollision(levelSize);
60
64
  engineObjectsDestroy();
61
65
 
66
+ // create table for tiles in the level tilemap
67
+ const tileLookup =
68
+ {
69
+ circle: 1,
70
+ ground: 2,
71
+ ladder: 4,
72
+ metal: 5,
73
+ player: 17,
74
+ crate: 18,
75
+ enemy: 19,
76
+ coin: 20,
77
+ }
78
+
62
79
  // set all level data tiles
63
80
  tileData = [];
64
81
  tileLayers = [];
@@ -79,17 +96,17 @@ function loadLevel()
79
96
  const pos = vec2(x,levelSize.y-1-y);
80
97
  const tile = layerData[y*levelSize.x+x];
81
98
 
82
- if (tile >= 17 && tile <= 20)
99
+ if (tile >= tileLookup.player)
83
100
  {
84
101
  // create object instead of tile
85
102
  const objectPos = pos.add(vec2(.5));
86
- if (tile == 17)
103
+ if (tile == tileLookup.player)
87
104
  playerStartPos = objectPos;
88
- if (tile == 18)
105
+ if (tile == tileLookup.crate)
89
106
  new Crate(objectPos);
90
- if (tile == 19)
107
+ if (tile == tileLookup.enemy)
91
108
  new Enemy(objectPos);
92
- if (tile == 20)
109
+ if (tile == tileLookup.coin)
93
110
  new Coin(objectPos);
94
111
  setTileData(pos, layer, 0);
95
112
  continue;
@@ -102,9 +119,9 @@ function loadLevel()
102
119
  let tileType = tileType_empty;
103
120
  if (tile > 0)
104
121
  tileType = tileType_breakable;
105
- if (tile == 4)
122
+ if (tile == tileLookup.ladder)
106
123
  tileType = tileType_ladder;
107
- if (tile == 5)
124
+ if (tile == tileLookup.metal)
108
125
  tileType = tileType_solid;
109
126
  if (tileType)
110
127
  {
@@ -7,7 +7,7 @@
7
7
  }
8
8
  if(typeof module === 'object' && module && module.exports) {
9
9
  module.exports = data;
10
- }})("gameTileData",
10
+ }})("gameLevelData",
11
11
  { "compressionlevel":-1,
12
12
  "height":64,
13
13
  "infinite":false,
@@ -118,7 +118,7 @@
118
118
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 5, 2, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
119
119
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
120
120
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 18, 0, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 18, 0, 0, 0, 0, 0, 0, 5, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
121
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 18, 18, 0, 5, 5, 0, 0, 19, 0, 0, 0, 5, 5, 0, 18, 18, 18, 0, 19, 19, 0, 0, 5, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 19, 0, 0, 0, 0, 0, 4, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 19, 0, 0, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 19, 0, 0, 0, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
121
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 18, 18, 0, 5, 5, 0, 0, 19, 0, 0, 0, 5, 5, 0, 18, 18, 18, 0, 19, 0, 0, 0, 5, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 4, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 19, 0, 0, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 19, 0, 0, 0, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
122
122
  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
123
123
  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 2, 3, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2,
124
124
  2, 2, 3, 2, 2, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -172,7 +172,7 @@
172
172
  "tilesets":[
173
173
  {
174
174
  "firstgid":1,
175
- "source":"data\/gameTileData.tsx"
175
+ "source":"data\/gameLevelData.tsx"
176
176
  }],
177
177
  "tilewidth":16,
178
178
  "type":"map",
@@ -66,7 +66,7 @@ class Crate extends GameObject
66
66
  {
67
67
  constructor(pos)
68
68
  {
69
- super(pos, vec2(1), tile(2), (randInt(4))*PI/2);
69
+ super(pos, vec2(1), spriteAtlas.crate, (randInt(4))*PI/2);
70
70
 
71
71
  this.color = hsl(rand(),1,.8);
72
72
  this.health = 5;
@@ -81,7 +81,7 @@ class Crate extends GameObject
81
81
  return;
82
82
 
83
83
  sound_destroyObject.play(this.pos);
84
- makeDebris(this.pos, this.color, 200);
84
+ makeDebris(this.pos, this.color, 30);
85
85
  this.destroy();
86
86
  }
87
87
  }
@@ -92,7 +92,7 @@ class Coin extends EngineObject
92
92
  {
93
93
  constructor(pos)
94
94
  {
95
- super(pos, vec2(1), tile(6));
95
+ super(pos, vec2(1), spriteAtlas.coin);
96
96
  this.color = hsl(.15,1,.5);
97
97
  }
98
98
 
@@ -127,7 +127,7 @@ class Enemy extends GameObject
127
127
  {
128
128
  constructor(pos)
129
129
  {
130
- super(pos, vec2(.9,.9), tile(5));
130
+ super(pos, vec2(.9,.9), spriteAtlas.enemy);
131
131
 
132
132
  this.drawSize = vec2(1);
133
133
  this.color = hsl(rand(), 1, .7);
@@ -147,7 +147,7 @@ class Enemy extends GameObject
147
147
  if (this.groundObject && rand() < .01 && this.pos.distance(player.pos) < 20)
148
148
  {
149
149
  this.velocity = vec2(rand(.1,-.1), rand(.4,.2));
150
- sound_jump.play(this.pos);
150
+ sound_jump.play(this.pos, .4, 2);
151
151
  }
152
152
 
153
153
  // damage player if touching
@@ -162,7 +162,7 @@ class Enemy extends GameObject
162
162
 
163
163
  ++score;
164
164
  sound_score.play(this.pos);
165
- makeDebris(this.pos, this.color, 300);
165
+ makeDebris(this.pos, this.color);
166
166
  this.destroy();
167
167
  }
168
168
 
@@ -185,7 +185,7 @@ class Grenade extends GameObject
185
185
  {
186
186
  constructor(pos)
187
187
  {
188
- super(pos, vec2(.2), tile(3,8));
188
+ super(pos, vec2(.2), spriteAtlas.grenade);
189
189
 
190
190
  this.beepTimer = new Timer(1);
191
191
  this.elasticity = .3;
@@ -218,7 +218,7 @@ class Grenade extends GameObject
218
218
  // draw additive flash exploding
219
219
  setBlendMode(true);
220
220
  const flash = Math.cos(this.getAliveTime()*2*PI);
221
- drawTile(this.pos, vec2(2), tile(0, 16), hsl(0,1,.5,.2-.2*flash));
221
+ drawTile(this.pos, vec2(2), spriteAtlas.circle, hsl(0,1,.5,.2-.2*flash));
222
222
  setBlendMode(false);
223
223
  }
224
224
  }
@@ -229,7 +229,7 @@ class Weapon extends EngineObject
229
229
  {
230
230
  constructor(pos, parent)
231
231
  {
232
- super(pos, vec2(.6), tile(2,8));
232
+ super(pos, vec2(.6), spriteAtlas.gun);
233
233
 
234
234
  // weapon settings
235
235
  this.fireRate = 8;
@@ -263,7 +263,7 @@ class Weapon extends EngineObject
263
263
 
264
264
  // update recoil
265
265
  if (this.recoilTimer.active())
266
- this.localAngle = lerp(this.recoilTimer.getPercent(), 0, this.localAngle);
266
+ this.localAngle = lerp(this.recoilTimer.getPercent(), this.localAngle, 0);
267
267
 
268
268
  this.mirror = this.parent.mirror;
269
269
  this.fireTimeBuffer += timeDelta;
@@ -274,8 +274,8 @@ class Weapon extends EngineObject
274
274
  {
275
275
  // create bullet
276
276
  sound_shoot.play(this.pos);
277
- this.localAngle = -rand(.2,.15);
278
- this.recoilTimer.set(.4);
277
+ this.localAngle = -rand(.2,.25);
278
+ this.recoilTimer.set(.1);
279
279
  const direction = vec2(this.bulletSpeed*this.getMirrorSign(), 0);
280
280
  const velocity = direction.rotate(rand(-1,1)*this.bulletSpread);
281
281
  new Bullet(this.pos, this.parent, velocity, this.damage);
@@ -323,8 +323,8 @@ class Bullet extends EngineObject
323
323
  this.range -= this.velocity.length();
324
324
  if (this.range < 0)
325
325
  {
326
- const emitter = new ParticleEmitter(
327
- this.pos, 0, .2, .1, 50, PI, tile(0), // pos, angle, emit info, tileInfo
326
+ new ParticleEmitter(
327
+ this.pos, 0, .2, .1, 50, PI, spriteAtlas.circle, // pos, emit info, tileInfo
328
328
  rgb(1,1,.1), rgb(1,1,1), // colorStartA, colorStartB
329
329
  rgb(1,1,.1,0), rgb(1,1,1,0),// colorEndA, colorEndB
330
330
  .1, .5, .1, .05, 0, // particleTime, sizeStart, sizeEnd, speed, angleSpeed
@@ -12,5 +12,5 @@
12
12
  <script src=gamePlayer.js?192></script>
13
13
  <script src=gameEffects.js?192></script>
14
14
  <script src=gameLevel.js?192></script>
15
- <script src=gameTileData.js?192></script>
15
+ <script src=gameLevelData.js?192></script>
16
16
  <script src=game.js?192></script>
Binary file
Binary file
@@ -11,7 +11,7 @@
11
11
 
12
12
  /*
13
13
  LittleJS Stress Test
14
- - Render over 50,000 sprites at 60 fps in Chrome
14
+ - Render over 100,000 sprites at 60 fps in Chrome
15
15
  - Also plays music in the background with zzfxm
16
16
  - All code and the image is contained in this html file
17
17
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "littlejsengine",
3
- "version": "1.9.2",
3
+ "version": "1.9.3",
4
4
  "description": "LittleJS - Tiny and Fast HTML5 Game Engine",
5
5
  "main": "dist/littlejs.esm.js",
6
6
  "types": "dist/littlejs.d.ts",