Java tutorial
package com.google.gwt.maeglin89273.game.mengine.component; import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.maeglin89273.game.mengine.component.GameComponent.PositionType; import com.google.gwt.maeglin89273.game.mengine.physics.Point; public abstract class GeneralComponent implements GameComponent { protected double width; protected double height; protected double angle; protected final Point position = new Point(0, 0); protected GeneralComponent(Point p, double angle, double w, double h) { this.position.setPosition(p == null ? new Point(0, 0) : p); this.angle = angle; this.setWidth(w); this.setHeight(h); } protected GeneralComponent(Point p, double w, double h) { this(p, 0, w, h); } @Override public double getX() { return position.getX(); } @Override public void setX(double x) { position.setX(x); } @Override public double getY() { return position.getY(); } @Override public void setY(double y) { position.setY(y); } @Override public Point getPosition() { return position.clone(); } @Override public Point getPositionAt(PositionType type) { switch (type) { case NORTHWEST: return new Point(position.getX() - width / 2, position.getY() - height / 2); case NORTH: return new Point(position.getX(), position.getY() - height / 2); case NORTHEAST: return new Point(position.getX() + width / 2, position.getY() - height / 2); case WEST: return new Point(position.getX() - width / 2, position.getY()); case CENTER: return position.clone(); case EAST: return new Point(position.getX() + width / 2, position.getY()); case SOUTHWEST: return new Point(position.getX() - width / 2, position.getY() + height / 2); case SOUTH: return new Point(position.getX(), position.getY() + height / 2); case SOUTHEAST: return new Point(position.getX() + width / 2, position.getY() + height / 2); default: throw new IllegalArgumentException("Wrong dirction argument."); } } @Override public void setPosition(Point p) { position.setPosition(p); } @Override public void setPositionAt(PositionType type, Point p) { switch (type) { case NORTHWEST: p.translate(width / 2, height / 2); this.position.setPosition(p); break; case NORTH: p.translate(0, height / 2); this.position.setPosition(p); break; case NORTHEAST: p.translate(-width / 2, height / 2); this.position.setPosition(p); break; case WEST: p.translate(width / 2, 0); this.position.setPosition(p); break; case CENTER: this.position.setPosition(p); break; case EAST: p.translate(-width / 2, 0); this.position.setPosition(p); break; case SOUTHWEST: p.translate(width / 2, -height / 2); this.position.setPosition(p); break; case SOUTH: p.translate(0, -height / 2); this.position.setPosition(p); break; case SOUTHEAST: p.translate(-width / 2, -height / 2); this.position.setPosition(p); break; default: throw new IllegalArgumentException("Wrong dirction argument."); } } @Override public double getTopY() { return getY() - height / 2; } @Override public double getLeftX() { return getX() - width / 2; } @Override public double getBottomY() { return getY() + height / 2; } @Override public double getRightX() { return getX() + width / 2; } @Override public void setWidth(double width) { this.width = width; } @Override public double getWidth() { return width; } @Override public void setHeight(double height) { this.height = height; } @Override public double getHeight() { return height; } @Override public void setSize(double w, double h) { this.width = w; this.height = h; } @Override public double getAngle() { return angle; } @Override public void setAngle(double angle) { this.angle = angle; } @Override public abstract void update(); @Override public abstract void draw(Context2d context); }