add start of box2d physics
|
@ -14,7 +14,7 @@
|
||||||
"author": "Markus Scully <markusscully@gmail.com>",
|
"author": "Markus Scully <markusscully@gmail.com>",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"box2dweb": "^2.1.0-b",
|
"box2d-html5": "^0.1.230",
|
||||||
"colors": "^1.1.2",
|
"colors": "^1.1.2",
|
||||||
"express": "^4.13.4",
|
"express": "^4.13.4",
|
||||||
"recursive-readdir": "^1.3.0",
|
"recursive-readdir": "^1.3.0",
|
||||||
|
|
BIN
public/img/ships/01/hull.png
Normal file
After Width: | Height: | Size: 390 B |
BIN
public/img/ships/01/teama.png
Normal file
After Width: | Height: | Size: 148 B |
BIN
public/img/ships/01/teamb.png
Normal file
After Width: | Height: | Size: 151 B |
BIN
public/img/ships/01/thrust0.png
Normal file
After Width: | Height: | Size: 133 B |
BIN
public/img/ships/01/thrust1.png
Normal file
After Width: | Height: | Size: 124 B |
BIN
public/img/ships/01/thrust2.png
Normal file
After Width: | Height: | Size: 125 B |
BIN
public/img/ships/01/thrust3.png
Normal file
After Width: | Height: | Size: 123 B |
BIN
public/img/ships/01/thrust4.png
Normal file
After Width: | Height: | Size: 141 B |
BIN
public/img/ships/01/thrust5.png
Normal file
After Width: | Height: | Size: 151 B |
BIN
public/img/ships/01/thrust6.png
Normal file
After Width: | Height: | Size: 181 B |
BIN
public/img/ships/01/thrust7.png
Normal file
After Width: | Height: | Size: 197 B |
BIN
public/img/ships/01/thrust8.png
Normal file
After Width: | Height: | Size: 212 B |
BIN
public/img/ships/01/thrust9.png
Normal file
After Width: | Height: | Size: 208 B |
BIN
public/img/turrets/01large.png
Normal file
After Width: | Height: | Size: 229 B |
BIN
public/img/turrets/01medium.png
Normal file
After Width: | Height: | Size: 194 B |
BIN
public/img/turrets/01small.png
Normal file
After Width: | Height: | Size: 148 B |
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
class Body {
|
class Body {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
this.b2body = false;
|
||||||
|
this.type = 'dynamic';
|
||||||
|
this.health = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
server/game/room/world/fixture.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const Body = require('./body.js');
|
||||||
|
|
||||||
|
class Fixture extends Body {
|
||||||
|
constructor(player) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.type = 'static';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Ship;
|
|
@ -1,10 +1,11 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const Physics = require('./physics.js');
|
||||||
const Ship = require('./ship.js');
|
const Ship = require('./ship.js');
|
||||||
|
|
||||||
class World {
|
class World {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.box2d = false;
|
this.physics = new Physics();
|
||||||
this.bodies = new Set();
|
this.bodies = new Set();
|
||||||
this.structures = new Set();
|
this.structures = new Set();
|
||||||
this.asteroids = new Set();
|
this.asteroids = new Set();
|
||||||
|
@ -14,7 +15,9 @@ class World {
|
||||||
|
|
||||||
addPlayer(player) {
|
addPlayer(player) {
|
||||||
this.players.add(player);
|
this.players.add(player);
|
||||||
this.ships.set(player, new Ship(player));
|
let ship = new Ship(player);
|
||||||
|
this.ships.set(player, ship);
|
||||||
|
this.physics.createBody(ship);
|
||||||
}
|
}
|
||||||
|
|
||||||
removePlayer(player) {
|
removePlayer(player) {
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// This file is very similar, but not identical to its client counterpart
|
||||||
|
// so most changes done to it should be mirrored there to keep consistent
|
||||||
|
// physics between client and server.
|
||||||
|
|
||||||
|
const Box2D = require('box2d-html5');
|
||||||
|
|
||||||
|
const b2Vec2 = Box2D.b2Vec2;
|
||||||
|
|
||||||
|
class Physics {
|
||||||
|
constructor() {
|
||||||
|
this.world = new Box2D.b2World(new b2Vec2(0, 0), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
createBody(body) {
|
||||||
|
let bodyDef = new Box2D.b2BodyDef();
|
||||||
|
bodyDef.userData = body;
|
||||||
|
bodyDef.position = new b2Vec2(body.x || 0, body.y || 0);
|
||||||
|
bodyDef.fixedRotation = false;
|
||||||
|
bodyDef.active = true;
|
||||||
|
bodyDef.linearVelocity = new b2Vec2(body.xvel || 0, body.yvel || 0);
|
||||||
|
bodyDef.angularVelocity = body.rvel || 0;
|
||||||
|
bodyDef.type = body.type == 'static' ?
|
||||||
|
Box2D.b2Body.b2_staticBody : Box2D.b2Body.b2_dynamicBody;
|
||||||
|
let b2body = this.world.CreateBody(bodyDef);
|
||||||
|
|
||||||
|
let fixtureDef = new Box2D.b2FixtureDef();
|
||||||
|
fixtureDef.density = 10;
|
||||||
|
fixtureDef.friction = 1;
|
||||||
|
fixtureDef.restitution = 0;
|
||||||
|
|
||||||
|
for (var poly of body.structure) {
|
||||||
|
poly.map(vertex => new b2Vec2(vertex[0], vertex[1]));
|
||||||
|
fixtureDef.shape = new Box2D.b2PolygonShape();
|
||||||
|
fixtureDef.shape.SetAsArray(poly, poly.length);
|
||||||
|
b2body.CreateFixture(fixtureDef);
|
||||||
|
}
|
||||||
|
|
||||||
|
body.b2body = b2body;
|
||||||
|
}
|
||||||
|
|
||||||
|
step() {
|
||||||
|
this.world.Step(1, 5, 1 / 60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Physics;
|
|
@ -1,12 +1,17 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const defaults = require('./traits/defaults.json');
|
||||||
|
const hulls = require('./traits/hulls.json');
|
||||||
|
|
||||||
const Body = require('./body.js');
|
const Body = require('./body.js');
|
||||||
|
|
||||||
class Ship extends Body {
|
class Ship extends Body {
|
||||||
constructor(player) {
|
constructor(player, build) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
this.build = build || defaults.spawnShip.build;
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
this.structure = hulls[this.build.hull];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
server/game/room/world/traits/defaults.json
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"spawnShip": {
|
||||||
|
"build": {
|
||||||
|
"hull": "01",
|
||||||
|
"turrets": [0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
server/game/room/world/traits/hulls.json
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"01": [
|
||||||
|
[
|
||||||
|
[1, 28],
|
||||||
|
[30, 28],
|
||||||
|
[30, 19],
|
||||||
|
[18, 2],
|
||||||
|
[13, 2],
|
||||||
|
[1, 19]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|