【问题标题】:Is my use of the Vector2d class in an Asteroids game redundant?我在 Asteroids 游戏中使用 Vector2d 类是多余的吗?
【发布时间】:2012-03-26 01:05:04
【问题描述】:

我正在尝试通过制作一个简单的小行星游戏来更多地了解 Java 中的矢量和旋转。我一直在尝试 Vector2d 类,但我觉得我可以只使用 Points 和 doubles 来完成它。我使用 Vector2d 是多余的吗?你会如何改变我的程序?

来源:

import java.awt.Color;
import java.awt.Cursor;  
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.vecmath.Vector2d;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Asteroids extends JPanel implements Runnable{
    BufferedImage img;
    boolean up, left, right;
    double angle = 0;
    int imgw = 0;
    int imgh = 0;
    int magnitude = 0;
    JFrame f;
    ArrayList<Projectile> bullets;
    Vector2d rocket = new Vector2d();
    Vector2d Magnitude = new Vector2d();
    AffineTransform at = new AffineTransform();

    public Asteroids(JFrame f){
        this.f = f;
        setSize(900, 800);

        try {
            img = ImageIO.read(new File("res/rocket.png"));
        } catch (IOException e) {}

        imgw = img.getWidth();
        imgh = img.getHeight();

        bullets = new ArrayList<Projectile>();

        f.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                switch (evt.getKeyCode()) {
                case KeyEvent.VK_UP:
                    up= true;
                    break;
                case KeyEvent.VK_LEFT:
                    left = true;
                    right = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    right = true;
                    left = false;
                    break;
                }
            }
            public void keyReleased(KeyEvent evt) {
                switch (evt.getKeyCode()) {
                case KeyEvent.VK_UP:
                    up= false;
                    break;
                case KeyEvent.VK_LEFT:
                    left = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    right = false;
                    break;
                case KeyEvent.VK_SPACE:
                    Vector2d dir = new Vector2d(Math.cos(angle-Math.toRadians(90)),Math.sin(angle-Math.toRadians(90)));
                    bullets.add(new Projectile(dir,rocket));
                    break;
                }
            }
        });         

        Thread t = new Thread(this);
        t.start();
    }

    public static void main(String[] Args){
        JFrame frame = new JFrame();
        BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor");

        frame.getContentPane().setCursor(blankCursor);

        frame.add(new Asteroids(frame));
        frame.setVisible(true);
        frame.setSize(900,500);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D)g;
        g2.fillRect(0,0,this.getWidth(),this.getHeight());
        g2.drawImage(img,at,this);
        g2.setColor(Color.red);
        for(Projectile p: bullets){
            p.draw(g2);
        }
    }

    public void run(){
        rocket = new Vector2d(100, 400);
        Magnitude = new Vector2d(Magnitude = new Vector2d(magnitude*Math.cos(angle-Math.toRadians(90)),magnitude*Math.sin(angle-Math.toRadians(90))));

        while(true){
            if(left){
                angle-=Math.toRadians(5);
            }
            if(right){
                angle+=Math.toRadians(5);
            }
            if(up){
                Vector2d m2 = new Vector2d(Math.cos(angle-Math.toRadians(90)),Math.sin(angle-Math.toRadians(90)));
                m2.normalize();
                m2.x/=5;
                m2.y/=5;
                Magnitude.add(m2);
            }

            if(angle>=Math.toRadians(360)){
                angle-=Math.toRadians(360);
            }else if(angle<=Math.toRadians(-360)){
                angle+=Math.toRadians(360);
            }

            Vector2d rocketN = new Vector2d(rocket);
            rocketN.normalize();

            rocket.add(Magnitude);

            System.out.println(Math.toDegrees(angle));

            at.setToTranslation(rocket.x-img.getWidth()/2, rocket.y-img.getHeight()/2); 
            at.rotate(angle, imgw/2, imgh/2); 

            Magnitude.x*=0.99;
            Magnitude.y*=0.99;

            for(Projectile p: bullets){
                p.update();
            }

            repaint();

            try {Thread.sleep(25);
            } catch (InterruptedException e) {}
        }
    }

    public class Projectile{

        int magnitude;
        private Vector2d Magnitude, position;

        public Projectile(Vector2d dir, Vector2d Position){
            this.position = new Vector2d(Position);
            magnitude = 10;
            Magnitude = new Vector2d(dir);
            position.x+=(5*Magnitude.x);
            position.y+=(5*Magnitude.y);
            Magnitude.x*=magnitude;
            Magnitude.y*=magnitude;
        }

        public void update(){
            position.add(Magnitude);
        }

        public void draw(Graphics2D g2){
            g2.drawOval((int)position.x, (int)position.y,4,4);
        }
    }
}

目前没有小行星可以射击,你可以四处走动射击。这是我使用的图片:http://findicons.com/files/icons/1495/space/32/rocket_ship.png

【问题讨论】:

    标签: java swing vector


    【解决方案1】:
    • 我认为不是(回答你的问题)

    • 但最重要的是 KeyListener 的使用错误,请改用 KeyBindings,例如 Keys UP, DOWN, LEFT, RIGHT

    • (我不擅长 Graphics2D)但是方法可能会导致另一个问题

      public void draw(Graphics2D g2){

    查看thread 如何使用 Graphics2D 移动,尤其是 @trashgod 的回答

    【讨论】:

    • 谢谢!我会考虑使用 KeyBindings。
    • 很高兴帮助您为好问题 +1
    • +1 用于键绑定;另请参阅example
    【解决方案2】:

    我从未听说过 KeyBindings,一直使用 VK_LETTER。在此之前,我使用了 getKeyChar。我认为它们都工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多