3

現在、私は自分のプログラムでダブルバッファリングを行っており(知っておく必要があります)、BufferedImagesとIntegersを格納する配列リストがあります。現在、配列リスト全体を画面上で移動するための私のコードは次のとおりです。

    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();
}

これで作業は完了しますが、スムーズに見えません。可変量に.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);
}

}

4

1 に答える 1

2

横スクロール ゲームを作成しようとしていると仮定しています。これを機能させる方法は、ゲーム内のすべてのオブジェクト、スプライトを作成することでした。

x、y、xvelocity、yvelocity 属性と getter および setter を含む Sprite クラスを作成しました。スクロールしたいときは、一時的に速度を反対方向に設定するか、x 値を移動します。

もう 1 つの方法は、元の x 値と y 値を各スプライトに格納しておくことでした。画面に描画するときに、「offSetX」という変数を用意しました。この変数は、スプライトの元の位置によって加算または減算され、すべてのスプライト間で統一された動きをします。画面。

これがあなたが探しているものではない場合、私はこれを削除します。:)

注: 最近、古い横スクロール ゲーム エンジンを変更したところ、スプライト リストのすべての x 位置を変更するのではなく、最後の方法が最適であることがわかりました。私の offSetX 変数は float 値で、画面に描画するときは Math.round(sprite.getX() + offSetX) を使用して最も正確な位置を取得します。

于 2012-08-05T22:50:19.303 に答える