Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法实现面向鼠标JAVA的对象旋转_Java_Swing_Rotation_Mouselistener - Fatal编程技术网

无法实现面向鼠标JAVA的对象旋转

无法实现面向鼠标JAVA的对象旋转,java,swing,rotation,mouselistener,Java,Swing,Rotation,Mouselistener,正如标题所说,就是做不到。尝试了很长时间,但仍然失败。我是java新手 “我的图像”或“fillRect”会稍微旋转一点,但不会像它应该旋转的那样旋转 全码+imgs 仅将代码添加到此类 它现在是如何工作的,我是如何想要它的。白色-原色/绿色-我想要那样的 我查阅了以下资料来源: 问题是MouseInfo.getPointerInfo.getLocation;返回鼠标的绝对位置。您需要鼠标相对于游戏画布的位置。您可以在游戏类中修改渲染方法,如下所示: Point mouseLocatio

正如标题所说,就是做不到。尝试了很长时间,但仍然失败。我是java新手 “我的图像”或“fillRect”会稍微旋转一点,但不会像它应该旋转的那样旋转 全码+imgs

仅将代码添加到此类

它现在是如何工作的,我是如何想要它的。白色-原色/绿色-我想要那样的 我查阅了以下资料来源: 问题是MouseInfo.getPointerInfo.getLocation;返回鼠标的绝对位置。您需要鼠标相对于游戏画布的位置。您可以在游戏类中修改渲染方法,如下所示:

 Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
 SwingUtilities.convertPointFromScreen(mouseLocation, this);
 handler.render(g, mouseLocation);
这要求您相应地修改渲染方法的方法签名。这是将鼠标位置从游戏画布传递到玩家渲染方法的唯一方法。 使用鼠标位置而不是MouseInfo.getPointerInfo.getLocation;在玩家的渲染方法中

要将玩家放置在画布的中心,并使其围绕中心旋转,您还需要进行一些更改:

您应该设置游戏画布的大小,而不是windowJFrame的大小。通过调用setPreferredSizeNewDimensionWidth,height来实现这一点;在游戏画布上,在frame.setVisibletrue之前调用frame.pack。这将确保游戏画布的大小与宽度和高度完全一致。 您可以将两个字段refx和refy添加到游戏对象类中,用于描述游戏对象的参考点,例如其中心。然后,您可以通过调用new PlayerWIDTH/2-16,HEIGHT/2-16,16,16,ID.Player,handler来构造一个新的播放器,其中播放器的初始位置为WIDTH/2-16,HEIGHT/2-16,其参考点为16,16——当播放器由32x32矩形表示时,播放器的中心。 在播放器的渲染方法中,使用int centerX=Math.roundx+refx初始化要旋转的中心;int centerY=Math.roundy+refy;其中,x,y是要旋转的对象的位置,refx,refy是要相对于对象位置旋转的点,例如x=宽度/2-16,y=高度/2-16,refx=16,refy=16。
我不能代表所有人说话,但我可以说,对我来说,你能做的帮助我理解你的问题的最好的事情就是创建并发布一个像样的请看链接。我剪掉了大部分代码并在将来发布了整个代码,请不要这样做。请宽恕我们,记住我们都是志愿者。相反,创造一个诚实善良的真实世界。仍然是idk。我无法在游戏中实现MouseMotionListener,因为我已经让它运行了。你能编辑它并把更多的细节放在那里吗?@Ejsoater我刚刚编辑了我的答案。我改用SwingUtilities.convertPointFromScreen删除了MouseMotionListener。请看我发布的最后的图片。它应该如何工作?如果是,那么我必须改变什么,使之成为img上的样子。顺便说一句,我非常高兴much@EJskater现在轮换似乎起作用了。是否要绘制图像/矩形,使画布中心==图像中心/rect,并围绕该中心旋转它?正是这样。我想知道物体可以移动,但仍然在画布的中心,物体移动的方式不同,它不会在中心
*GameObject class*
package game.main;

import java.awt.Graphics;

public abstract class GameObject {

    protected float x, y;
    protected ID id;
    protected float velX, velY;

    public GameObject(float x, float y, ID id){
            this.x = x;
            this.y = y;
            this.id = id;
    }

    public abstract void tick();
    public abstract void render(Graphics g);

    public void setX(int x){
        this.x = x;
    }
    public void setY(int y){
        this.y = y;
    }   
    public float getX(){
        return x;
    }
    public float getY(){
        return y;
    }
    public void setId(ID id){
        this.id = id;
    }
    public ID getId(){
        return id;
    }
    public void setVelX(int velX){
        this.velX = velX;
    }
    public void setVelY(int velY){
        this.velY = velY;
    }
    public float getVelX(){
        return velX;
    }
    public float getVelY(){
        return velY;
    }
}
*Handler class*
package game.main;

import java.awt.Graphics;
import java.util.LinkedList;

// render all objects
public class Handler {

    LinkedList<GameObject> object = new LinkedList<GameObject>();

    public void tick(){
        for(int i = 0; i < object.size(); i++){
            GameObject tempObject = object.get(i);

            tempObject.tick();      
        }
    }
    public void render(Graphics g){
        for(int i = 0; i <object.size();i++){
            GameObject tempObject = object.get(i);

            tempObject.render(g);
        }
    }// handling adding objects
    public void addObject(GameObject object){
        this.object.add(object);
    }   
}
*window class*
package game.main;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

public class window extends Canvas{

    private static final long serialVersionUID = 3010486623466540351L;

    public window(int width, int height, String title, game game){
        JFrame frame = new JFrame(title);

        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));

        // X button
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // ¤ button maximize
        frame.setResizable(false);
        // window appear in middle of screen instead of top left corner
        frame.setLocationRelativeTo(null);
        // add game to window
        frame.add(game);
        frame.setVisible(true);
        game.start();
    }       
}
* ID class*
package game.main;

public enum ID {

    Player();
}
*Player class*
package game.main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;

public class Player extends GameObject{

    Handler handler;

    public Player(int x, int y, ID id, Handler handler) {
        super(x, y, id);
        this.handler = handler;
    }

    public void tick() {
    }
    public void render(Graphics g) {
        ///////////ADDED//////////////////
        PointerInfo a = MouseInfo.getPointerInfo();
        Point b = a.getLocation();
        int mouseX = (int) b.getX();
        int mouseY = (int) b.getY();
        int centerX = game.WIDTH / 2;
        int centerY = game.HEIGHT / 2;
        double angle = Math.atan2(centerY - mouseY, centerX - mouseX) - Math.PI / 2;
        ((Graphics2D)g).rotate(angle, centerX, centerY);
        //////////////////////////////
        g.setColor(Color.white);
        g.fillRect((int)x, (int)y, 32, 32);

    }
}
 Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
 SwingUtilities.convertPointFromScreen(mouseLocation, this);
 handler.render(g, mouseLocation);