3

私は2DJavaゲームで一種の重力を作り、ジャンプアルゴリズムを作成しようとしています。私は周りを見回しましたが、波のように上下に動くアルゴリズムの助けを見つけることができませんでした。

Game.javaのコードは次のとおりです。

package game;

import java.awt.*;

public class Game extends GameLoop{

    public void init(){
        setSize(864,480);
        Thread th = new Thread(this);
        th.start();
        offscreen = createImage(864,480);
        d = offscreen.getGraphics();
        addKeyListener(this);
    }

    public void paint(Graphics g){
        d.clearRect(0, 0, 864, 480);
        d.drawImage(background, 0, 0, this);
        d.drawImage(person, x, y, this);
        g.drawImage(offscreen, 0, 0, this);
    }

    public void update(Graphics g){
        paint(g);
    }
}

そして、これがGameLoop.javaのコードです。

package game;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.*;

public class GameLoop extends Applet implements Runnable, KeyListener{

    public int x, y;
    public Image offscreen;
    public Graphics d;
    public boolean up, down, left, right;
    public BufferedImage background, w1, w2, w3, w4, w5, w6, w7, w8, person, s1, s2;
    public int counter, counter2;

    public void run(){
        x = 100;
        y = 100;
        try {
            background = ImageIO.read(new File("background.png"));
            w1 = ImageIO.read(new File("walk1.png"));
            w2 = ImageIO.read(new File("walk2.png"));
            w3 = ImageIO.read(new File("walk3.png"));
            w4 = ImageIO.read(new File("walk4.png"));
            w5 = ImageIO.read(new File("walk5.png"));
            w6 = ImageIO.read(new File("walk6.png"));
            w7 = ImageIO.read(new File("walk7.png"));
            w8 = ImageIO.read(new File("walk8.png"));
            s1 = ImageIO.read(new File("stancel.png"));
            s2 = ImageIO.read(new File("stancer.png"));
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        person = s1;
        while(true){
            x = 100;
            y = 100;
            while(true){
                if (y <= 304 && up != true){
                    y+=10;
                }
                counter++;
                counter2++;
                if (counter >= 20){
                    counter = 0;
                }
                if (counter >= 0 && counter <= 5 && right == true){
                    person = w1;
                }
                if (counter > 5 && counter < 10 && right == true){
                    person = w2;
                }
                if (counter >= 10 && counter <= 15 && right == true){
                    person = w3;
                }
                if (counter > 15 && right == true){
                    person = w4;
                }
                if (counter2 >= 20){
                    counter2 = 0;
                }
                if (counter2 >= 0 && counter2 <= 5 && left == true){
                    person = w5;
                }
                if (counter2 > 5 && counter2 < 10 && left == true){
                    person = w6;
                }
                if (counter2 >= 10 && counter2 <= 15 && left == true){
                    person = w7;
                }
                if (counter2 > 15 && left == true){
                    person = w8;
                }
                if (left == true){
                    x-=4;
                }
                if (right == true){
                    x+=4;
                }
                if (up == true){
                    y-=4;
                }
                if (down == true){
                    y+=4;
                }
                if ( x <= -10 ){
                    x = -10;
                }
                if ( y <= 0 ){
                    y = 0;
                }
                if ( x >= 824 ){
                    x = 824;
                }
                if ( y >= 304 ){
                    y = 304;
                }
                repaint();
            try{
                Thread.sleep(20);
            } catch(InterruptedException e){
                e.printStackTrace();
            }
            }
        }
    }

    //@Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == 37){
            left = true;
        }
        if(e.getKeyCode() == 38){
            up = true;
        }
        if(e.getKeyCode() == 39){
            right = true;
        }
        if(e.getKeyCode() == 40){
            down = true;
        }
    }

    //@Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == 37){
            left = false;
            person = s2;
        }
        if(e.getKeyCode() == 38){
            up = false;
        }
        if(e.getKeyCode() == 39){
            right = false;
            person = s1;
        }
        if(e.getKeyCode() == 40){
            down = false;
        }
    }

    //@Override
    public void keyTyped(KeyEvent e) {
    }
}

ダブルとしてカウンターが必要だと思いますがcounter3、y軸の特定のポイントまで上がってから下に移動するアルゴリズムがわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

5

最も単純な波動関数の1つは、私たちの旧友sineです。

ここに画像の説明を入力してください

したがって、ジャンプモーションの場合は、おそらく期間の前半が必要ですsine。を使用して、からjava.util.Mathの数列を渡すことができます(数は、ジャンプを継続するフレームの数によって異なります)。 0180

Math.sin(0.0);   // = 0.0 
Math.sin(30.0);  // = 0.5
Math.sin(60.0);  // = 0.9
Math.sin(90.0);  // = 1.0
Math.sin(120.0); // = 0.9
Math.sin(150.0); // = 0.5
Math.sin(180.0); // = 0.0
于 2012-11-11T03:06:11.080 に答える
2

「波のように上下に動く」とはどういう意味かよくわかりません。

しかし、とにかく、現実世界の物理学では、自由落下(空気抵抗を無視)しているオブジェクトの高度は放物線に従います。つまり、次のような式に従います。

altitude =  maxAltitude - (acceleration * (t - timeOfMaxAltitude))^2  

(運動の法則を定式化する方法は他にもありますが、このアプローチはおそらく単純なゲームに必要なものです。)


1/2正弦波は、切り捨てられた放物線のように見え、代わりにゲームで使用できます。ただし、特に走り高跳びの場合は、実際の物理の正確なシミュレーションではないことを理解する必要があります。

于 2012-11-11T03:03:36.977 に答える
1

変数を使用して、垂直速度を表すことができます。ジャンプするときは、垂直速度を負の値に設定します。各フレームで、垂直位置に垂直速度を追加し、重力をシミュレートするために速度に定数を追加します。下に何かがある場合は、速度を0に戻します。定数値を試して、適切なジャンプの高さを取得します。

于 2012-11-11T03:02:59.537 に答える