简体   繁体   中英

How can I show my spaceship in my asteroid program?

I am trying to finish an Asteroid project. I have four classes. Asteroid,Polygon, Game and Asteriod. I am making a new class ship which is a subclass of ship. I am new to java. I tried to make a new ship object but I could not make it appear on screen. https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html However ,In ship class I used fillPolygon now it is showing in the screen. But I know the write way. How can i make ship using ship object and make it appear. I am providing my classes below.

 package asteroids;

/*
CLASS: Asteroids
DESCRIPTION: Extending Game, Asteroids is all in the paint method.
NOTE: This class is the metaphorical "main method" of your program,
   it is your control center.
Original code by Dan Leyzberg and Art Simon
*/
import java.awt.*;
import java.awt.event.*;

class Asteroids extends Game {
   static int counter = 0;

public Asteroids() {
  super("Asteroids!",800,600);
  this.setFocusable(true);
  this.requestFocus();
 }

public void paint(Graphics brush) {
    brush.setColor(Color.black);
    brush.fillRect(0,0,width,height);

    // sample code for printing message for debugging
    // counter is incremented and this message printed
    // each time the canvas is repainted
    counter++;
    brush.setColor(Color.white);
    brush.drawString("Counter is " + counter,10,10);
    ship p = new ship(
            new Point[] {new Point(1,1),new Point(3,1),new Point(1.5,2)},
            new Point(3,3),
            0);


    brush.setColor(Color.red);
    p.paint(brush );

 }

public static void main (String[] args) {
    Asteroids a = new Asteroids();

    a.repaint();










   }
}  

polygon class

enter code herepackage asteroids;

/*

CLASS: Polygon DESCRIPTION: A polygon is a sequence of points in space defined by a set of such points, an offset, and a rotation. The offset is the distance between the origin and the center of the shape. The rotation is measured in degrees, 0-360. USAGE: You are intended to instantiate this class with a set of points that forever defines its shape, and then modify it by repositioning and rotating that shape. In defining the shape, the relative positions of the points you provide are used, in other words: {(0,1),(1,1),(1,0)} is the same shape as {(9,10),(10,10),(10,9)}.

class Polygon {
  private Point[] shape;   // An array of points.
  public Point position;   // The offset mentioned above.
  public double rotation; // Zero degrees is due east.

 public Polygon(Point[] inShape, Point inPosition, double inRotation) {
    shape = inShape;
    position = inPosition;
    rotation = inRotation;

   // First, we find the shape's top-most left-most boundary, its origin.
    Point origin = shape[0].clone();
    for (Point p : shape) {
  if (p.x < origin.x) origin.x = p.x;
  if (p.y < origin.y) origin.y = p.y;
 }

// Then, we orient all of its points relative to the real origin.
   for (Point p : shape) {
     p.x -= origin.x;
     p.y -= origin.y;
  }
}


  // "getPoints" applies the rotation and offset to the shape of the polygon.
   public Point[] getPoints() {
   Point center = findCenter();
   Point[] points = new Point[shape.length];
    for (int i = 0; i < shape.length; i++) {
    for (Point p : shape) {
      Point p = shape[i];
       double x = ((p.x-center.x) * Math.cos(Math.toRadians(rotation)))
           - ((p.y-center.y) * Math.sin(Math.toRadians(rotation)))
           + center.x/2 + position.x;
  double y = ((p.x-center.x) * Math.sin(Math.toRadians(rotation)))
           + ((p.y-center.y) * Math.cos(Math.toRadians(rotation)))
           + center.y/2 + position.y;
  points[i] = new Point(x,y);
  }
  return points;
 }

  // "contains" implements some magical math (i.e. the ray-casting algorithm).
 public boolean contains(Point point) {
  Point[] points = getPoints();
  double crossingNumber = 0;
   for (int i = 0, j = 1; i < shape.length; i++, j=(j+1)%shape.length) {
    if ((((points[i].x < point.x) && (point.x <= points[j].x)) ||
       ((points[j].x < point.x) && (point.x <= points[i].x))) &&
      (point.y > points[i].y + (points[j].y-points[i].y)/
       (points[j].x - points[i].x) * (point.x - points[i].x))) {
    crossingNumber++;
  }
 }
return crossingNumber%2 == 1;
}

 public void rotate(int degrees) {rotation = (rotation+degrees)%360;}

 /*
 The following methods are private access restricted because, as this access
 level always implies, they are intended for use only as helpers of the
 methods in this class that are not private. They can't be used anywhere else.
 */

 // "findArea" implements some more magic math.
 private double findArea() {
   double sum = 0;
    for (int i = 0, j = 1; i < shape.length; i++, j=(j+1)%shape.length) {
    sum += shape[i].x*shape[j].y-shape[j].x*shape[i].y;
  }
  return Math.abs(sum/2);
  }

 // "findCenter" implements another bit of math.
 private Point findCenter() {
  Point sum = new Point(0,0);
   for (int i = 0, j = 1; i < shape.length; i++, j=(j+1)%shape.length) {
     sum.x += (shape[i].x + shape[j].x)
           * (shape[i].x * shape[j].y - shape[j].x * shape[i].y);
    sum.y += (shape[i].y + shape[j].y)
           * (shape[i].x * shape[j].y - shape[j].x * shape[i].y);
   }
    double area = findArea();
   return new Point(Math.abs(sum.x/(6*area)),Math.abs(sum.y/(6*area)));
 }

} class ship package asteroids;

import java.awt.Color;
import java.awt.Graphics;

public class ship extends Polygon{
  static int counter=0;

   public ship(Point[] inShape, Point inPosition, double inRotation) {
       super(inShape, inPosition, inRotation);
        // TODO Auto-generated constructor stub
   }

   public void paint(Graphics brush) {
        brush.fillPolygon(new int []{400,380,380,420,420,400},new int[]    {300,320,360,360,320,300},6); 

 }


public void drawPolygon(Point[] points, Point point, int i) {
    // TODO Auto-generated method stub

}

}

 Any help will be appreciated ,thanks

Asteroids should extend JFrame directly or indirectly(through Game).

Once you instantiate your Asteroids class, which should be extending JFrame, do:

asteroid.setVisible(true);

A new jpanel will appear, and your paint method will paint on that jpanel's canvas.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM