Движение Java Smooth ArrayList

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

    public static void MoveMap(final double ammount){
    Thread t = new Thread(){
        public void run(){
            for(int i = 0; i < TileHelper.MAIN_LIST.size();i++){
                    TileHelper.MAIN_LIST.get(i).changeX(ammount*DATA.speed);
            }
        }
    };
    t.start();
}

Это делает работу, но она не выглядит гладкой. Даже если я использую число вроде 0,25 для переменной суммы (я только что заметил, что написал это неправильно в своем коде: O). Как мне сделать красивое плавное движение, если у меня есть все мои изображения в этом массиве? Кстати, если вы хотите знать, что с этим не так, то это тот факт, что это отстает, и между каждым изображением вы видите большое белое пространство. Любая помощь приветствуется... Спасибо!

Код рендеринга:

public class Main extends JFrame {
public static int worldsize = 1080;
private static final long serialVersionUID = 6149918602875295087L;
public static void main(String args[]){
    new Main();
}
TileHelper tiles = new TileHelper(TileHelper.MAIN_LIST);
public Main(){

    DATA_IMAGES.initImages();

    addDefaultBlocks();
    setSize(640,480);
    setResizable(false);
    setTitle("Stranded");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);

    setVisible(true);

    createBufferStrategy(2);
    GameLoop();
    addKeyListener(new KeyListener() {
        public void keyTyped(KeyEvent e) {

        }

        public void keyReleased(KeyEvent e) {

        }

        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();


            switch(key){
            case KeyEvent.VK_LEFT:
                Movement.MoveMap(3.25);
                break;
            case KeyEvent.VK_RIGHT:
                Movement.MoveMap(-3.25);
                break;
            case KeyEvent.VK_UP:
                DATA.speed++;
                break;
            case KeyEvent.VK_DOWN:
                DATA.speed--;
                break;
            case KeyEvent.VK_SPACE:
                System.out.println(DATA.speed);
                break;
            }
        }
    });
}
private void addDefaultBlocks() {   
    for(int x = -1000/32; x < worldsize/32; x++){
        for (int y = -1000/32; y < worldsize/32; y++){
            TileHelper.addBlock(DATA_IMAGES.GRASS, x*32, y*32);
        }
    }
}
public void GameLoop(){
    Thread gameloop = new Thread(){
        public void run(){
            while(true){
                RenderInit();
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    gameloop.start();
}
public void RenderInit(){
    BufferStrategy buff = getBufferStrategy();
    Graphics g = buff.getDrawGraphics();

    g.clearRect(0, 0, getWidth(), getHeight());

    Render(g);

    g.dispose();
    buff.show();
    Toolkit.getDefaultToolkit().sync();
}
public void Render(Graphics g){
    tiles.RenderAll(g);
}

}


person 36redsoxfan    schedule 05.08.2012    source источник
comment
Используйте двойную буферизацию. Если вы не можете заставить это работать на вас, опубликуйте SSCCE вашей лучшей попытки.   -  person Andrew Thompson    schedule 06.08.2012
comment
Проблема, похоже, в маршрутизации вашего чертежа, которая не является частью кода, который вы зафиксировали. И чем вы рисуете? OpenGL, Swing, AWT?   -  person Mene    schedule 06.08.2012
comment
Зачем тройная буферизация? вам нужно только 2 кадра для плавной анимации, больше просто вызовет отставание в отображении кадров, которые синхронизируются с элементами управления   -  person DMor    schedule 06.08.2012
comment
Кстати, Эндрю, я сказал в первом предложении, что использую двойную буферизацию   -  person 36redsoxfan    schedule 06.08.2012
comment
создатьBufferStrategy(3); (3 означает 3 буфера, если вы измените это на 2, это будет двойная буферизация)   -  person DMor    schedule 06.08.2012
comment
К сожалению, я, должно быть, отправил свой старый код. Вот когда я тестировал вокруг, чтобы увидеть, будет ли это иметь значение...   -  person 36redsoxfan    schedule 06.08.2012
comment
Я советую вам использовать для рендеринга такие библиотеки, как LWJGL, JOGL или Slick2D. Мало того, что работа с окнами будет намного проще, вы сможете использовать быстрое и оптимизированное графическое оборудование, что также приведет к более высокой частоте кадров.   -  person Oskar    schedule 06.08.2012


Ответы (1)


Я предполагаю, что вы пытаетесь создать игру с боковой прокруткой, и способ, которым я заставил это работать, заключался в том, чтобы сделать все объекты в играх спрайтом.

Я создал класс Sprite, который содержит атрибуты x, y, xvelocity, yvelocity, а также геттеры и сеттеры. Когда я хотел прокрутить, я либо временно устанавливал скорость в противоположном направлении, либо перемещал значение x.

Другой метод заключался в том, чтобы сохранить исходные значения x и y в каждом спрайте, и при рисовании на экране у меня была переменная с именем: «offSetX», которая добавлялась или вычиталась из исходной позиции спрайта, чтобы иметь единое движение между всеми спрайтами на экран.

Если это не то, что вы ищете, я удалю это. :)

Примечание. Недавно я модифицировал свой старый игровой движок с боковой прокруткой и нашел последний метод лучшим, вместо того, чтобы изменять все позиции x в списке спрайтов. Моя переменная offSetX является значением с плавающей запятой, и при рисовании на экране я использую Math.round(sprite.getX() + offSetX), чтобы получить наиболее точную позицию.

person DMor    schedule 05.08.2012