Математика в Java проблема с GTGE - PullRequest
1 голос
/ 07 апреля 2011

У меня есть игра GTGE, и у меня есть некоторые проблемы с математикой. Я не понимаю, почему это не движется так, как я хочу. Когда вы щелкаете где-то, спрайт перемещается прямо туда. Когда вы щелкаете правой кнопкой мыши, он вычисляет угол и перемещается туда, но не останавливается. Я фиксирую положение мыши и каждый раз, когда он обновляет экран, я проверяю, достиг ли спрайт этой позиции, но когда это происходит, он не останавливается. Вот мой код:

import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Toolkit;

import com.golden.gamedev.Game;
import com.golden.gamedev.GameLoader;
import com.golden.gamedev.object.Background;
import com.golden.gamedev.object.Sprite;
import com.golden.gamedev.object.background.ImageBackground;


public class SpriteTest extends Game {
    //Default Background
    Background  background;
    //Toolkit!
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    //Main Sprite
    Sprite pacman;
    Dimension stop;

    @Override
    public void initResources() {

        //Load the background
        background = new ImageBackground(getImage("nature-wallpapers.jpg"));
        //Load the Sprite
        pacman = new Sprite(getImage("pacman.png"));
        pacman.setActive(false);
        pacman.setBackground(background);


        playMusic("intro.mid");
        showCursor();



    }

    @Override
    public void render(Graphics2D g) {

        //Render background
        background.render(g);
        //Render sprites

        pacman.render(g);




    }

    @Override
    public void update(long elapsedTime) {  
        //Update the background
        background.update(elapsedTime);
        //Update sprites

        if(click()) {


            pacman.setActive(true);
            pacman.setLocation(getMouseX(), getMouseY());


        }



        if(rightClick()) {
            int spriteLocX = (int) pacman.getX();
            int spriteLocY = (int) pacman.getY();
            int mouseX = getMouseX();
            int mouseY = getMouseY();
            pacman.setMovement(1, -(Math.toDegrees(Math.atan2(mouseY - spriteLocY, mouseX - spriteLocX ))));
            stop = new Dimension(mouseX, mouseY);

        }

            if(stop != null) {
                if(pacman.getX() == stop.getWidth()) {
                    if(pacman.getY() == stop.getHeight()){
                        pacman.setMovement(0, 0);
                    }

                }
            }
            pacman.update(elapsedTime);






    }

    public static void main(String[] args) {
        GameLoader game = new GameLoader();
        game.setup(new SpriteTest(), new Dimension(800,600), true);
        game.start();
    }

}

1 Ответ

0 голосов
/ 07 апреля 2011

Может статься, что он слишком далеко заходит, поэтому он никогда точно не находится в положении «стоп».Если он двигается, скажем, 10 единиц за каждый временной шаг, вы можете предположить, что он будет когда-либо находиться в положении остановки в конце любого данного временного шага один раз в 10 попыток.

Я бы рассчитал расстояниеВы должны идти, когда вы нажимаете.Затем вы можете умножить количество временных шагов, которые произошли с того момента, как вам было приказано двигаться, на расстояние, на которое вы перемещаетесь на каждый тик.Когда это умножение больше пифагорейского расстояния между вашей исходной точкой и пунктом назначения, вы можете установить свое движение на 0 и свою позицию на место назначения.(Делайте это, прежде чем рендерить, очевидно)

...