Java tutorial
/** * */ 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; } }