3

我在 2D Java 游戏中制作了一种重力,我正在尝试创建一个跳跃算法。我环顾四周,找不到任何关于在波浪中上下移动的算法的帮助。

以下是 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) {
    }
}

我想我需要一个 counter ,counter3作为一个 double ,但我不确定一个算法会上升到 y 轴上的某个点,然后向下移动。任何帮助表示赞赏。

4

3 回答 3

5

最简单的波函数之一是我们的老朋友sine

在此处输入图像描述

所以对于一个跳跃动作,你可能会喜欢一个sine周期的前半部分。您可以使用,从tojava.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 回答