2016-12-31 14 views
-2

Как говорится, просто не может этого сделать. Попытался надолго и все еще терпел неудачу. (Я новичок в Java)
Мое изображение или FillRect повернуть немного, но не так, как следует повернуть
весь код + ГИМ
Не удалось реализовать вращение объекта по направлению к мыши JAVA


*MAIN game class* 
    package game.main; 

    import java.awt.Canvas; 
    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.image.BufferStrategy; 

    public class game extends Canvas implements Runnable{ 

     private static final long serialVersionUID = -392333887196083915L; 

     public static final int WIDTH = 640, HEIGHT = WIDTH/12 * 9; 
     private Thread thread; 
     private boolean running = false; 

     private Handler handler; 

     public game(){ 

      handler = new Handler(); 

      new window(WIDTH, HEIGHT,"Game",this); 

      handler.addObject(new Player(WIDTH/2-32, HEIGHT/2-32, ID.Player, handler)); 
     } 

     public synchronized void start(){ 
      thread = new Thread(this); 
      thread.start(); 
      running = true; 
     } 
     public synchronized void stop(){ 
      try{ 
       thread.join(); 
       running = false; 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     // ↓ game loop for update 
     public void run(){ 
      this.requestFocus(); 
      long lastTime = System.nanoTime(); 
      double amountOfTicks = 60.0; 
      double ns = 1000000000/amountOfTicks; 
      double delta = 0; 
      long timer = System.currentTimeMillis(); 
      int frames = 0; 
      while(running){ 
       long now = System.nanoTime(); 
       delta += (now - lastTime)/ns; 
       lastTime = now; 
       while(delta >= 1){ 
        tick(); 
        delta--; 
       } 
       if(running) 
        render(); 
       frames++; 

       if(System.currentTimeMillis() - timer > 1000){ 
        timer += 1000; 
        System.out.print("FPS:" + frames); 
        frames = 0; 
       } 
      } 
      stop(); 
     } 

     private void tick(){ 
        handler.tick();    
       } 

     private void render(){ 
      BufferStrategy bs = this.getBufferStrategy(); 
      if(bs == null){ 
       this.createBufferStrategy(3); 
       return; 
      } 

      Graphics g = bs.getDrawGraphics(); 

      g.setColor(Color.black); 
      g.fillRect(0, 0, WIDTH, HEIGHT); 

      handler.render(g); 

      g.dispose(); 
      bs.show(); 
     } 



     public static void main(String args[]) { 
      new game(); 
     } 


    } 
<br> 
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; 
    } 
} 


*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); 

    } 
} 


Как это работает и как я хочу. БЕЛЫЙ ЦВЕТ - оригинал/GREEN - Я хочу, чтобы это как то
Example 1
Example 2
я смотрел в этом источники:
Get mouse possition (stackoverflow)
Java 2d rotation in direction mouse point (stackoverflow)
Rotating an object to point towards the mouse

+2

Я не могу говорить для всех, но я могу сказать, что для меня единственное, что вы можете сделать, чтобы помочь мне понять вашу проблему, - это создать и опубликовать достойный [mcve] (см. Ссылку) , –

+0

Я выслал большую часть кода и разместил весь код – EJskater

+0

В будущем, пожалуйста, не делайте этого. Пожалуйста, помилуй нас и помни, что мы все добровольцы. Вместо этого создайте честный до совершенства настоящий [mcve]. –

ответ

0

Проблема заключается в том, что MouseInfo.getPointerInfo().getLocation(); возвращает абсолютное расположение мыши , Вам нужно местоположение мыши относительно вашего холста игры. Вы можете изменить метод render в своем классе game следующим образом:

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

Для этого необходимо изменить сигнатуры методов ваших методов визуализации соответственно. Это только один из способов передать mouseLocation из вашего игрового холста в метод рендеринга вашего игрока. Используйте mouseLocation вместо MouseInfo.getPointerInfo().getLocation(); в методе визуализации вашего игрока.

Есть еще несколько вещей, которые вы должны изменить, чтобы поместить игрока в центре холста и заставить его вращаться вокруг своего центра:

  • Вы должны установить размер игрового холста вместо размер окна (JFrame). Сделайте это, позвонив setPreferredSize(new Dimension(width, height)); на холст игры и позвонив frame.pack() до frame.setVisible(true). Это гарантирует, что ваш холст игры имеет точно размер, указанный WIDTH и HEIGHT.
  • Вы можете добавить два поля refx и refy в ваш класс GameObject, который описывает опорную точку вашего GameObject (например, ее центр).Затем вы можете построить новый Player, позвонив new Player(WIDTH/2-16, HEIGHT/2-16, 16, 16, ID.Player, handler), где исходное положение игрока находится в (WIDTH/2-16, HEIGHT/2-16), а его контрольная точка (16,16) - центр игрока, когда игрок представленный прямоугольником 32x32.
  • В способе рендеринга Player инициализируйте центр, который вы хотите повернуть с помощью int centerX = Math.round(x + refx); int centerY = Math.round(y + refy);, где (x, y) - позиция объекта, который вы хотите повернуть, и (refx, refy) точку, которую вы хотите вращать вокруг относительно позиция объекта (например, x = WIDTH/2-16, y = HEIGTH/2-16, refx = 16, refy = 16).
+0

Все еще idk. Я не могу реализовать MouseMotionListener для игры, потому что у меня там работает. Можете ли вы отредактировать его и добавить туда более подробную информацию? – EJskater

+0

@EJskater Я только что отредактировал свой ответ. Я избавился от 'MouseMotionListener', используя' SwingUtilities.convertPointFromScreen() 'вместо этого. – Calculator

+0

Посмотрите на изображения в конце, которые я разместил. Так оно должно работать? Если да, то что я должен изменить, чтобы быть как на img. Btw ty очень – EJskater