com.google.gwt.maeglin89273.shared.test.volcanogame.component.FireBall.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.maeglin89273.shared.test.volcanogame.component.FireBall.java

Source

/**
 * 
 */
package com.google.gwt.maeglin89273.shared.test.volcanogame.component;

import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.dynamics.FixtureDef;
import org.jbox2d.dynamics.World;

import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.CssColor;
import com.google.gwt.maeglin89273.game.mengine.component.GeneralComponent;
import com.google.gwt.maeglin89273.game.mengine.component.Physical;
import com.google.gwt.maeglin89273.game.mengine.component.Spacial;
import com.google.gwt.maeglin89273.game.mengine.physics.PixelAABB;
import com.google.gwt.maeglin89273.game.mengine.physics.Point;
import com.google.gwt.maeglin89273.game.mengine.physics.Vector;
import com.google.gwt.maeglin89273.game.mengine.utility.CoordinateConverter;
import com.google.gwt.user.client.Random;

/**
 * @author Maeglin Liao
 *
 */
public class FireBall extends GeneralComponent implements Physical {

    /* (non-Javadoc)
     * @see com.google.gwt.maeglin89273.game.mengine.utility.component.Physical#getBody()
     */
    private int radius;
    private final PixelAABB aabb;
    private Body body;
    private CssColor ballColor;
    private CssColor ballShadowColor;
    private Spacial space;

    public FireBall(Spacial space, Point p, int radius) {
        super(new Point(p.getX(), p.getY() - radius), radius * 2, radius * 2);

        this.radius = radius;
        double h = 5 + Random.nextInt(21);
        double s = 80 + Random.nextInt(21);
        double l = 35 + Random.nextInt(16);
        ballColor = CssColor.make("hsl(" + h + "," + s + "%," + l + "%)");
        ballShadowColor = CssColor.make("hsl(" + h + "," + s + "%," + (l + 15) + "%)");
        this.space = space;

        aabb = new PixelAABB(this.position, width, height);

        BodyDef bodyDef = new BodyDef();
        CircleShape shape = new CircleShape();
        FixtureDef fixtureDef = new FixtureDef();
        Vec2 impulse = CoordinateConverter
                .vectorPixelsToWorld(new Vector(-30 + 60 * Random.nextDouble(), -(175 + 50 * Random.nextDouble())));

        bodyDef.type = BodyType.DYNAMIC;
        bodyDef.position.set(CoordinateConverter.coordPixelsToWorld(position));

        body = space.getWorld().createBody(bodyDef);
        body.setLinearVelocity(impulse);
        body.applyLinearImpulse(impulse, body.getPosition());
        shape.m_radius = CoordinateConverter.scalerPixelsToWorld(radius);
        fixtureDef.shape = shape;
        fixtureDef.density = 4.3f;
        fixtureDef.restitution = 0.2f;
        fixtureDef.friction = 0.8f;
        body.createFixture(fixtureDef);

    }

    @Override
    public Body getBody() {

        return body;
    }

    /* (non-Javadoc)
     * @see com.google.gwt.maeglin89273.game.mengine.utility.component.GeneralComponent#update()
     */
    @Override
    public void update() {
        position.setPosition(CoordinateConverter.coordWorldToPixels(body.getPosition()));
        aabb.setPosition(position);
        if (space.isOutOfBounds(aabb)) {
            destory();
        }
    }

    /* (non-Javadoc)
     * @see com.google.gwt.maeglin89273.game.mengine.utility.component.GeneralComponent#draw(com.google.gwt.canvas.dom.client.Context2d)
     */
    @Override
    public void draw(Context2d context) {

        context.setFillStyle(ballColor);

        //context.setShadowColor(ballShadowColor.toString());
        context.beginPath();
        context.arc(position.getX(), position.getY(), radius, 0, 2 * Math.PI);
        context.closePath();
        context.fill();

    }

    @Override
    public Spacial getSpace() {

        return space;
    }

    @Override
    public void destory() {
        space.remove(this);
        body = null;
        space = null;
    }

    @Override
    public PixelAABB getAABB() {
        // TODO Auto-generated method stub
        return aabb;
    }

}