192 lines
5.7 KiB
Dart
192 lines
5.7 KiB
Dart
part of game;
|
|
|
|
class GameWorld extends TransformNode {
|
|
|
|
World world;
|
|
List<Body> bodies = [];
|
|
Body _bodyShip;
|
|
|
|
Image _imgBg;
|
|
Image _imgAsteroid;
|
|
Image _imgShip;
|
|
|
|
double _steeringInput;
|
|
double _thrustInput;
|
|
double _lastSteeringSpeed = 0.0;
|
|
|
|
GameWorld(ImageMap images) {
|
|
this.width = 1024.0;
|
|
this.height = 1024.0;
|
|
|
|
// Fetch images
|
|
_imgBg = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/resources-auto/BurnTexture.png"];
|
|
_imgAsteroid = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources-auto/asteroid_big_002.png"];
|
|
_imgShip = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources-auto/GG_blueship_Lv3.png"];
|
|
|
|
// Create the physics world
|
|
world = new World.withGravity(new Vector2(0.0, 0.0));
|
|
|
|
// Add a background
|
|
addBackground();
|
|
|
|
// Add some asteroids to the game world
|
|
for (int i = 0; i < 5; i++) {
|
|
addAsteroid(10.0);
|
|
}
|
|
for (int i = 0; i < 5; i++) {
|
|
addAsteroid(20.0);
|
|
}
|
|
|
|
// Add ship
|
|
addShip();
|
|
}
|
|
|
|
void addBackground() {
|
|
SpriteNode sprtBg = new SpriteNode.withImage(_imgBg);
|
|
sprtBg.width = width;
|
|
sprtBg.height = height;
|
|
sprtBg.pivot = new Vector2(0.0, 0.0);
|
|
this.children.add(sprtBg);
|
|
}
|
|
|
|
void addAsteroid([double radius=20.0]) {
|
|
|
|
// Create shape
|
|
final CircleShape shape = new CircleShape();
|
|
shape.radius = radius;
|
|
|
|
// Define fixture (links body and shape)
|
|
final FixtureDef activeFixtureDef = new FixtureDef();
|
|
activeFixtureDef.restitution = 1.0;
|
|
activeFixtureDef.density = 0.05;
|
|
activeFixtureDef.shape = shape;
|
|
|
|
// Define body
|
|
final BodyDef bodyDef = new BodyDef();
|
|
bodyDef.type = BodyType.DYNAMIC;
|
|
bodyDef.position = new Vector2(0.0, 30.0);
|
|
bodyDef.linearDamping = 0.0;
|
|
bodyDef.angularDamping = 0.0;
|
|
|
|
// Create body and fixture from definitions
|
|
final Body body = world.createBody(bodyDef);
|
|
body.createFixtureFromFixtureDef(activeFixtureDef);
|
|
|
|
// Set position of object
|
|
Math.Random rand = new Math.Random();
|
|
body.setTransform(new Vector2(rand.nextDouble() * this.width, rand.nextDouble() * this.height), 0.0);
|
|
body.applyLinearImpulse(new Vector2(rand.nextDouble()*10000.0-5000.0, rand.nextDouble()*10000.0-5000.0), new Vector2(0.0, 0.0), true);
|
|
|
|
// Add to list
|
|
bodies.add(body);
|
|
|
|
// Create sprite
|
|
SpriteNode sprt = new SpriteNode.withImage(_imgAsteroid);
|
|
sprt.width = radius*2;
|
|
sprt.height = radius*2;
|
|
// sprt.colorOverlay = new Color(0x33ff0000);
|
|
// sprt.transferMode = TransferMode.plusMode;
|
|
body.userData = sprt;
|
|
this.children.add(sprt);
|
|
}
|
|
|
|
void addShip() {
|
|
double radius = 30.0;
|
|
|
|
// Create shape
|
|
final CircleShape shape = new CircleShape();
|
|
shape.radius = radius;
|
|
|
|
// Define fixture (links body and shape)
|
|
final FixtureDef activeFixtureDef = new FixtureDef();
|
|
activeFixtureDef.restitution = 1.0;
|
|
activeFixtureDef.density = 0.05;
|
|
activeFixtureDef.shape = shape;
|
|
|
|
// Define body
|
|
final BodyDef bodyDef = new BodyDef();
|
|
bodyDef.type = BodyType.DYNAMIC;
|
|
bodyDef.position = new Vector2(0.0, 30.0);
|
|
bodyDef.linearDamping = 0.0;
|
|
bodyDef.angularDamping = 0.95;
|
|
|
|
// Create body and fixture from definitions
|
|
final Body body = world.createBody(bodyDef);
|
|
body.createFixtureFromFixtureDef(activeFixtureDef);
|
|
|
|
// Center on screen
|
|
body.setTransform(new Vector2(width/2.0, height/2.0), 90.0);
|
|
|
|
// Add to list
|
|
bodies.add(body);
|
|
_bodyShip = body;
|
|
|
|
// Create sprite
|
|
SpriteNode sprt = new SpriteNode.withImage(_imgShip);
|
|
sprt.width = radius*2;
|
|
sprt.height = radius*2;
|
|
sprt.position = new Vector2(width/2.0, height/2.0);
|
|
body.userData = sprt;
|
|
this.children.add(sprt);
|
|
}
|
|
|
|
void update(double dt) {
|
|
// Apply thrust
|
|
if (_thrustInput != null) {
|
|
double force = _thrustInput*10000.0;
|
|
double rad = degrees2radians(_bodyShip.getAngle());
|
|
_bodyShip.applyLinearImpulse(new Vector2(Math.cos(rad)*force, Math.sin(rad)*force), new Vector2(0.0, 0.0), true);
|
|
}
|
|
|
|
// Simulate world
|
|
world.stepDt(1.0/60.0, 10, 10); // Pass in dt
|
|
|
|
// Apply stearing
|
|
if (_steeringInput != null) {
|
|
_lastSteeringSpeed = _steeringInput * 4.0;
|
|
}
|
|
else {
|
|
_lastSteeringSpeed *= 0.75;
|
|
}
|
|
_bodyShip.setTransform(_bodyShip.position, _bodyShip.getAngle() + _lastSteeringSpeed);
|
|
|
|
// Update all sprites
|
|
bodies.forEach(updateBody);
|
|
}
|
|
|
|
void updateBody(Body body) {
|
|
SpriteNode sprt = body.userData;
|
|
double rot = 0.0; //body.getRotation();
|
|
|
|
// Check bounds and warp objects
|
|
if (body.position[0] < -sprt.width/2) {
|
|
body.setTransform(new Vector2(body.position[0] + this.width + sprt.width, body.position[1]), rot);
|
|
}
|
|
if (body.position[0] > this.width + sprt.width/2) {
|
|
body.setTransform(new Vector2(body.position[0] - (this.width + sprt.width), body.position[1]), rot);
|
|
}
|
|
if (body.position[1] < -sprt.height/2) {
|
|
body.setTransform(new Vector2(body.position[0], body.position[1] + this.height + sprt.height), rot);
|
|
}
|
|
if (body.position[1] > this.height + sprt.height/2) {
|
|
body.setTransform(new Vector2(body.position[0], body.position[1] - (this.height + sprt.height)), rot);
|
|
}
|
|
|
|
// Update sprite
|
|
sprt.position = body.position;
|
|
sprt.rotation = body.getAngle();
|
|
}
|
|
|
|
void controlSteering(double input) {
|
|
_steeringInput = input;
|
|
}
|
|
|
|
void controlThrust(double input) {
|
|
_thrustInput = input;
|
|
}
|
|
|
|
void controlFire() {
|
|
|
|
}
|
|
}
|