java太空飞船游戏

时间:2013-11-16 06:47:16

标签: java awt

这里是Ship,Asteroids,BaseShapeClass类的完整代码。 Ship Class继承BaseShapeClass的形状。 Asteroid类是声明Graphics2D对象的主要源代码,AffineTransform(用于标识创建),声明双图像缓冲区... BaseShapeClass的代码..

package baseshapeclass;
import java.awt.Shape;


public class BaseShapeClass {
    private Shape shape;
    private double x, y;
    private double velX, velY;
    private double moveAngle, faceAngle;
    private boolean alive;

    //accessors and mutators
    public Shape getShape(){return shape;}
    public void setShape(Shape shape){ this.shape = shape; }

    public double getX() { return x; }
    public void setX(double x) { this.x = x; }
    public void incX(double ix) { this.x += ix; }

    public double getY() { return y; }
    public void setY(double y) { this.y = y; }
    public void incY(double iy) { this.y += iy; }

    public double getVelX() { return velX; }
    public void setVelX(double velX) { this.velX = velX; }
    public void incVelX(double ivX) { this.velX += ivX; }

    public double getVelY() { return velY; }
    public void setVelY(double velY) { this.velY = velY; }
    public void incVelY(double ivY) { this.velY += ivY; }
    //MoveAngle refers to the objects angular movement
    public double getMoveAngle() { return moveAngle; }
    public void setMoveAngle(double mAngle) { this.moveAngle = mAngle; }
    public void incMoveAngle(double imAngle) { this.moveAngle += imAngle; }
    //FaceAngle refers to the objects face/heads angular movement
    public double getFaceAngle() { return faceAngle; }
    public void setFaceAngle(double fAngle) { this.faceAngle = fAngle; }
    public void incFaceAngle(double ifAngle) { this.faceAngle += ifAngle; }

    public boolean isAlive() { return alive; }
    public void setAlive(boolean alive) { this.alive = alive; }

    //default constructor everything will be set to original state
    //when update is called everything will start to move
    BaseShapeClass(){
        setShape(null);
        setAlive(false);
        //all of them are set to '0' representing their initial position,
        //which will be called during the update() Event of the graphics objects
        setX(0.0);
        setY(0.0);
        setVelX(0.0);
        setVelY(0.0);
        setMoveAngle(0.0);
        setFaceAngle(0.0);
    }
}

船级代码......

package baseshapeclass;
import java.awt.Rectangle;
import java.awt.Polygon;
public class Ship extends BaseShapeClass {
    //ships shape along the x and y cordinates
    private final int[] shipx = {-6,3,0,3,6,0};
    private final int[] shipy = {6,7,7,7,6,-7};

    public Rectangle getBounds(){
        Rectangle r = new Rectangle((int)getX()-6, (int)getY()-6, 12, 12);
        return r;
    }
    Ship(){
        setShape(new Polygon(shipx, shipy, shipx.length));
        setAlive(true);
    }
}

小行星代码(主要源代码)......

package baseshapeclass;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
public abstract class Asteroid extends Applet implements Runnable, KeyListener {
    BufferedImage backbuffer;
    Graphics2D g2d;
    Ship ship = new Ship();
    boolean showBounds= true;
    AffineTransform identity = new AffineTransform();

    @Override public void init(){
        backbuffer = new BufferedImage(640,480,BufferedImage.TYPE_INT_RGB);
        g2d = backbuffer.createGraphics();

        ship.setX(320);
        ship.setY(240);

        addKeyListener(this);
    }
    @Override public void update(Graphics g){
        g2d.setTransform(identity);
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0, 0, getSize().width, getSize().height);
        g2d.setColor(Color.WHITE);
        g2d.drawString("Ship: "+Math.round(ship.getX())+" , "+Math.round(ship.getY()),2, 150);
        g2d.drawString("Face Angle: "+Math.toRadians(ship.getFaceAngle()),5, 30);
        g2d.drawString("Move Angle: "+Math.toRadians(ship.getMoveAngle())+90,5,50);

        drawShip();
        paint(g);
    }
    public void drawShip(){
        g2d.setTransform(identity);
        g2d.translate(ship.getX(),ship.getY());
        g2d.rotate(Math.toRadians(ship.getFaceAngle()));
        g2d.setColor(Color.ORANGE);
        g2d.fill(ship.getShape());
    }
}

我希望你们能够更好地了解所有代码。只是想知道Ship类的部分为什么船只x和y坐标如下:

public class ship extends BaseShapeClass{
private int[] shipx = {-6,3,0,3,6,0};
private int[] shipy = {6,7,7,7,6,-7};
}

我无法理解这些值如何构成多边形?

2 个答案:

答案 0 :(得分:1)

Ship(){
  setShape(new Polygon(shipx,shipy,shipx.length));
  setAlive(true);
}

你可以看到你困惑的两个数组进入Polygon.的初始化。这两个数组作为一对,给出了多边形中每个点的x和y坐标。

答案 1 :(得分:0)

这篇文章回答了你在Kronion答案中的评论;我打算将其作为评论发布,但有太多要说的,我想向您展示一些代码,这在评论中并不清晰。

正如Kronion所说,Polygon类确实接受了一个X坐标数组和一个Y坐标数组。原因是X和Y坐标存储在两个阵列中的相同位置。因此,如果int index = 0,那么X,Y坐标对将是xArray[index]yArray[index]

如果这没有任何意义,请检查Polygon class source code。例如,您会在contains方法中看到这种情况,例如:

for (int i = 0; i < npoints; lastx = curx, lasty = cury, i++) {

    curx = xpoints[i];
    cury = ypoints[i];

    // remainder of loop
}

简而言之,它们是以这种方式分配的,因为X和Y是由它们的索引位置配对。

希望有所帮助。