首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向它所面对的方向移动一个对象: java

向它所面对的方向移动一个对象: java
EN

Stack Overflow用户
提问于 2015-10-28 14:10:42
回答 1查看 1.1K关注 0票数 0

因此,我试图使一个小型测试游戏的基础引擎,是一个自上而下的射手。我大部分时间都在旋转,但我不能让它朝着它所面对的方向正确地移动。套餐游戏;

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Rotation extends JPanel implements KeyListener{
    private static double i = 0, inc = 0.1, iBase, speed = 0;
    private static int xPos = 0, yPos = 0, width = 100, height = 50;

    static boolean pressedA = false, pressedD = false, slowdown = false;
    public static void main(String[] args) throws InterruptedException {
        System.out.println(i);
        JFrame f = new JFrame();
        Rotation r = new Rotation();
        f.add(new Rotation());
        f.setSize(600, 600);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.addKeyListener(r);


        while(true){
            move();
            accelerate();
            f.repaint();
            Thread.sleep(10);

        }

    }
public static void move(){
        xPos += speed * Math.cos(-1*Math.PI*i/180);
        yPos -= speed * Math.sin(-1*Math.PI*i/180);
        System.out.println(i);
    }

    public static void accelerate(){
        if(i>= 360)
            i=0;
        if(pressedA)
            i-=inc;

        if(pressedD)
            i+=inc;

        if(inc<2 && !slowdown && (pressedA || pressedD))
            inc+= 0.01;

        if(slowdown && inc>=0.02) {
            inc-=0.2;
            if(inc <= 0.02){
                slowdown = false;
                pressedA = false;
                pressedD = false;
            }
            if(pressedA)
                i-=inc;

            if(pressedD)
                i+=inc;
        }

        //i = Math.round10(i, -2);
        System.out.println(inc);
    }

    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D) g.create();

        g2d.setPaint(new Color(150, 150, 150));
        g2d.fillRect(20, 20, 80, 50);
        g2d.translate(180, -50);
        g2d.rotate(Math.toRadians(i), xPos+width/2, yPos+height/2);


        g2d.fillRect(xPos, yPos, width, height);

        g2d.dispose();

        //System.out.println("repainted");
    }


    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();

        if (keyCode == KeyEvent.VK_W) {
            System.out.println("W is pressed");
            speed = 2;
            //slowdown = false;
        }
        if (keyCode == KeyEvent.VK_S) {
            System.out.println("S is pressed");
            speed = -2;
            //slowdown = false;
        }
        if (keyCode == KeyEvent.VK_A) {
            System.out.println("A is pressed");
            slowdown = false;


            pressedA = true;
        }
        if (keyCode == KeyEvent.VK_D) {
            System.out.println("D is pressed");


            slowdown = false;
            pressedD = true;
        }
        this.i=i;
        }

    @Override
    public void keyTyped(KeyEvent e) {
     }

    @Override
    public void keyReleased(KeyEvent e) {
        speed = 0;
        slowdown = true;

    }

-编辑-所以我认为这可能与旋转发生的地点有关。

EN

回答 1

Stack Overflow用户

发布于 2015-10-28 14:36:02

sin和cos函数的角度值必须以弧度表示。做这样的事:

代码语言:javascript
复制
xPos += speed * Math.cos(-1*Math.PI*i/180);

这可能会解决你的问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33393333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档