2016-03-23 1 views
0

Я пытаюсь использовать треугольник для перемещения прямоугольника. Однако, когда я умножаю его на скорость и добавляю в положение прямоугольника x, прямоугольник не перемещается. Я думал, что проблема может быть в игровом цикле, но я не думаю, что это так. Вот код:Прямоугольник не перемещается при умножении на дельта-время

package Main; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferStrategy; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

//do double buffering 

public class Game extends Canvas { 
    int x, y; 
    private static final long serialVersionUID = 1L; 

    public static final int height = 400; 
    public static final int width = height * 16/9; 

    JPanel p; 
    Game game; 

    Image buffer; 

    KeyListener kl; 
    MouseListener ml; 

    public boolean running = true; 

    public Game(){ 
     kl = new KeyListener(){ 

      public void keyPressed(KeyEvent e) { 

      } 

      public void keyReleased(KeyEvent e) { 

      } 

      public void keyTyped(KeyEvent e) { 

      } 
     }; 

     ml = new MouseListener(){ 

      public void mousePressed(MouseEvent e) { 

      } 

      public void mouseReleased(MouseEvent e) { 

      } 
      public void mouseClicked(MouseEvent e) { 

      } 

      public void mouseEntered(MouseEvent e) { 

      } 

      public void mouseExited(MouseEvent e) { 

      } 
     }; 
    } 

    public void update(double delta){ 
     x += 10/1000 * delta; 
    } 

    public void render(){ 
     BufferStrategy bs = getBufferStrategy(); 
     if(bs==null){ 
      createBufferStrategy(2); 
      return; 
     } 
     Graphics g = bs.getDrawGraphics(); 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.BLACK); 
     g.fillRect(x, y, 100, 100); 

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

    public void run(){ 

     //initialize time loop variables 
     long lastLoopTime = System.nanoTime(); 
     final int TARGET_FPS = 60; 
     final long OPTIMAL_TIME = 1000000000/TARGET_FPS; 
     double lastFpsTime = 0; 

     //Main game loop 
     while(running) 
     { 
      //Calculate since last update 
      long now = System.nanoTime(); 
      long updateLength = now - lastLoopTime; 
      lastLoopTime = now; 
      double delta = updateLength/((double)OPTIMAL_TIME); 

      //update frame counter 
      lastFpsTime += updateLength; 

      //update FPS counter 
      if(lastFpsTime >= 1000000000) 
      { 
       lastFpsTime = 0; 
      } 

      //game updates 
      game.update(delta); 

      //graphics (gameState) 
      game.render(); 

      try{ 
       Thread.sleep((Math.abs(lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000)); 
      }catch(Exception e){ 
       System.out.println("Error in sleep"); 
      } 
     } 
    } 

    public void start(){ 
     JFrame frame = new JFrame("Game"); 

     game = new Game(); 

     frame.add(game); 
     frame.pack(); 

     frame.setSize(width, height); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     frame.addKeyListener(kl); 
     frame.addMouseListener(ml); 

     frame.setVisible(true); 

     run(); 
    } 

    public static void main(String[] args){ 
     new Game().start(); 
    } 
} 

ответ

0

x и y являются целыми числами и 10/1000 * delta является большой частью времени меньше 1. Incremeting x с таким значением не изменится x вообще.

Чтобы исправить это, попробуйте изменить тип x к float или double, и просто использовать Math.floor() или просто бросить его в int при рисовании его:

g.fillRect((int) x, (int) y, 100, 100); 
0

Чтобы продолжить предыдущий ответ: 10/1000 даст вам нуль, в то время как 10./1000 даст вам реальное число, которое оно представляет. Поэтому вы должны сменить свое заявление на

x + = (int) (10./1000 * delta);

и мы надеемся, дельта некоторое число больше, чем 1000/10 поднять это целое число больше 0.

0

Вам нужно изменить х и у переменных быть плавающей или двойной.

double x, y; 

И если вы хотите, чтобы увидеть движение, вам нужно изменить что-то вроде этого ...

x += 100d/1000d * delta; 

То, что вы делали раньше делил целое число 10 на целое число 1000 и получив 0 в результате.

Вам также необходимо привести результаты к Интс, когда вы рисуете прямоугольник ...

g.fillRect((int)x, (int)y, 100, 100); 
Смежные вопросы