ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – AffineTransform鼠标瞄准旋转口吃90度

2019-09-03 10:03:50  阅读:275  来源: 互联网

标签:affinetransform java rotation bufferedimage


编辑:
哦!!!!!
有用!!!
似乎有一点它被修复但是错误的HTML文件被打开,所以错误的代码正在运行.我觉得很愚蠢,这应该是显而易见的.

但是谢谢!

实际上对这些东西有所帮助真是太棒了.无论何时我在其他任何地方寻求帮助,甚至问我的老师,我通常会被忽视或得到无用的建议.
(编辑结束)

我正在为java课程中的最终项目制作游戏.我只是让鼠标瞄准使用AffineTransform工作,但是当玩家对象旋转到90度(或它的倍数)时,它会做出这种奇怪的口吃.
下面是我特别关注的代码.

    g2.drawImage(img, x_pos,y_pos,this);
    AffineTransform oldTransform = g2.getTransform();

g2.setTransform(AffineTransform.getRotateInstance(radAngle,x_pos +   (img.getWidth() / 2),y_pos+(img.getHeight() / 2)));

有人可以帮我弄清楚如何解决这个问题吗?我的项目明天到期,所以我的时间很短.
这是我使用的图像

继承人的代码.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.lang.Math.*;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.imageio.ImageIO;
import java.io.*;
import java.net.URL;

public class Game extends Applet implements Runnable, KeyListener, MouseMotionListener
{

    int x_pos = 250;
    int y_pos = 250;
    float x_speed = 0;
    float y_speed = 0;
    int radius = 20;
    int appletsize_x = 800;
    int appletsize_y = 600;

    int x = 0;
    int y = 0;
    int up = 0;
    int down= 0;
    int left = 0;
    int right= 0;

    int mouse_x;
    int mouse_y;
    int tracking_angle;

    private BufferedImage dbImage;
    private Graphics dbg;
    private  Image curser;
    BufferedImage img = null;
    BufferedImage round = null;

    AffineTransform at = new AffineTransform();
    double radAngle;
    public void init()
    {
            try {
               URL url = new URL(getCodeBase(), "Player.png");
               img = ImageIO.read(url);
            } catch (IOException e) {System.out.println("Cant find player image");
        }
                        try {
                           URL url = new URL(getCodeBase(), "round.png");
                           round = ImageIO.read(url);}
             catch (IOException e) {}

        setBackground (Color.blue);
        setFocusable(true);
        addKeyListener( this );
        curser = getImage(getDocumentBase(), "mouse.png");
        addMouseMotionListener(this);
        try
                {
                    Toolkit tk = Toolkit.getDefaultToolkit();
                    Cursor c = tk.createCustomCursor( curser,new Point( 5, 5 ), "Inodrop" );
                    setCursor( c );
                }
                catch( IndexOutOfBoundsException x )
                {}
    }

    public class Shot {

        int x_loc = -50;
        int y_loc = -50;
        public Shot(){
            if(x_loc < 0){
                x_loc = x_pos;}
            if(y_loc < 0){
                y_loc = y_pos;}

                paint(dbg);}
        public void paint(Graphics g){
            System.out.println("hi");

             Graphics2D g2d = (Graphics2D)g;

            Graphics g2D = round.getGraphics();
            g2d.drawImage(round, x_loc,y_loc,null);}}

    public void start ()
    {

        Thread th = new Thread (this);

        th.start ();

    }

    public void stop()
    {

    }

    public void destroy()
    {

    }
    public void mouseMoved(MouseEvent e){
        //get position of mouse
        mouse_x = e.getX();
        mouse_y = e.getY();
        double x_dist = mouse_x - x_pos;
        double y_dist = mouse_y - y_pos;


        if (x_dist == 0) {
          radAngle = 90;
        } else if ((x_dist == 0) && (y_dist == 0)) {
          radAngle = 0;
        } else {
          radAngle = Math.atan(y_dist / x_dist);
        }


        tracking_angle = (int)(Math.sin(radAngle) * 100);
        //System.out.println(Math.toRadians(tracking_angle));
        }
    public void mouseDragged(MouseEvent e){}


    public void keyReleased(KeyEvent r)
    {
        //Left
        if (r.getKeyCode()  == 39 ){
            x = 0;
            left = 0;
            Shot shoot = new Shot();
            }
        //Right
        if (r.getKeyCode() == 37){
            x = 0;
            right = 0;
            }
        //Down
        if (r.getKeyCode() == 38 ) {
            //y_speed = 0;
            down = 0;}
        //Up
        if (r.getKeyCode() == 40 ) {
            //y_speed = 0;
            up = 0;}
            //move();
}
    public void keyTyped(KeyEvent t){}
    public void keyPressed(KeyEvent r){


        //Left
        if (r.getKeyCode()  == 39 ){
            left = 1;}
        //Right
        if (r.getKeyCode() == 37){
            right = 1;}
        //Down
        if (r.getKeyCode() == 38 ) {
            down = 1;}
        //Up
        if (r.getKeyCode() == 40 ) {
            up = 1;}
            //move();
}


    public void run ()
    {

        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);


        while (true)
        {
            if (left  == 1 && x_speed < 11){
                x = 0;
                x_speed += 1;
                }
            //Right
            if (right == 1 && x_speed > -11){
                x = 0;
                 x_speed -= 1;
                }
            //Down
            if (down == 1  && y_speed > -11) {
                y_speed -= 1;}
            //Up
            if (up == 1  && y_speed < 11) {
            y_speed += 1;}
        if( x == 0 && x_speed > 0){
            x_speed -=.2;}
        if( x == 0 && x_speed < 0){
            x_speed +=.2;}
        if( y == 0 && y_speed > 0){
            y_speed -=.2;}
        if( y == 0 && y_speed < 0){
            y_speed +=.2;}



            if (x_pos > appletsize_x - radius && x_speed > 0)
            {

                x_pos = radius;
            }

            else if (x_pos < radius && x_speed < 0)
            {

                x_pos = appletsize_x + radius ;
            }
            //System.out.println(y_pos);
            if (y_pos > appletsize_y - radius && y_speed > 0){
                y_speed = 0;}
            else if ( y_pos < radius && y_speed < 0  ){
                    y_speed = 0;}

            x_pos += (int)x_speed;
            y_pos += (int)y_speed;



            repaint();

            try
            {


                Thread.sleep (15);


            }
            catch (InterruptedException ex)
            {

            }


            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        }
    }


    public void update (Graphics g)
    {

        if (dbImage == null)
        {
            dbImage = new BufferedImage(this.getSize().width, this.getSize().height, BufferedImage.TYPE_INT_RGB);
            dbg = dbImage.getGraphics ();
        }


        dbg.setColor (getBackground ());
        dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);


        dbg.setColor (getForeground());
        paint (dbg);

        g.drawImage (dbImage, 0, 0, this);


    }

    public void paint (Graphics g)
    {
        //g = img.getGraphics();
        Graphics2D g2 = (Graphics2D)g;


        g2.drawImage(img, x_pos,y_pos,this);
        AffineTransform oldTransform = g2.getTransform();

        g2.setTransform(AffineTransform.getRotateInstance(radAngle,x_pos + (img.getWidth() / 2),y_pos+(img.getHeight() / 2)));



        System.out.println(img.getWidth());




    }
}

解决方法:

    double x_dist = mouse_x - x_pos;
    double y_dist = mouse_y - y_pos;
    double radAngle = Math.atan(y_dist / x_dist);
    tracking_angle = (int) (Math.sin(radAngle) * 100);

我认为错误在这部分的某个地方.如果x_dist为0,你肯定在这里除以0.更好的做这样的事情:

if (x_dist == 0) {
    radAngle = 90;
} else {
    radAngle = Math.atan(y_dist / x_dist);
}

编辑:另外,我认为你应该完全抛弃tracking_angle线,稍后再做:

g2.setTransform(AffineTransform.getRotateInstance(rad_angle,
  x_pos + (img.getWidth() / 2),y_pos+(img.getHeight() / 2)));

您还应该更改在评论中发布的新代码:

double radAngle;
if (x_dist == 0) {
  radAngle = 90;
} else if (y_dist == 0) {
  radAngle = 90;
} else {
  radAngle = Math.atan(y_dist / x_dist);
}

你正在为x_dist == 0或y_dist == 0(这不是边缘情况)解决这个问题,但不是因为两者都是0,你根本无法计算角度,我认为你应该用0所以请改用:

double radAngle;
if (x_dist == 0) {
  radAngle = 90;
} else if ((x_dist == 0) && (y_dist == 0)) {
  radAngle = 0;
} else {
  radAngle = Math.atan(y_dist / x_dist);
}

另外,正如trashgod指出的那样,你忽略了异常,例如:

    try {
        URL url = new URL(getCodeBase(), "Player.png");
        img = ImageIO.read(url);
    } catch (IOException e) {
    }

你不应该只是继续这样的情况,但f.e.显示一个有用的错误消息并退出程序,在任何情况下做一些事情,而不是只是捕获异常并继续,好像什么也没发生.

标签:affinetransform,java,rotation,bufferedimage
来源: https://codeday.me/bug/20190903/1797486.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有