add start of box2d physics
|
@ -14,7 +14,7 @@
|
|||
"author": "Markus Scully <markusscully@gmail.com>",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"box2dweb": "^2.1.0-b",
|
||||
"box2d-html5": "^0.1.230",
|
||||
"colors": "^1.1.2",
|
||||
"express": "^4.13.4",
|
||||
"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 {
|
||||
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';
|
||||
|
||||
const Physics = require('./physics.js');
|
||||
const Ship = require('./ship.js');
|
||||
|
||||
class World {
|
||||
constructor() {
|
||||
this.box2d = false;
|
||||
this.physics = new Physics();
|
||||
this.bodies = new Set();
|
||||
this.structures = new Set();
|
||||
this.asteroids = new Set();
|
||||
|
@ -14,7 +15,9 @@ class World {
|
|||
|
||||
addPlayer(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) {
|
||||
|
|
|
@ -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';
|
||||
|
||||
const defaults = require('./traits/defaults.json');
|
||||
const hulls = require('./traits/hulls.json');
|
||||
|
||||
const Body = require('./body.js');
|
||||
|
||||
class Ship extends Body {
|
||||
constructor(player) {
|
||||
constructor(player, build) {
|
||||
super();
|
||||
|
||||
|
||||
this.build = build || defaults.spawnShip.build;
|
||||
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]
|
||||
]
|
||||
]
|
||||
}
|