有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的跳跃算法

我在一个2D 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中的代码。爪哇:

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轴上的某个点,然后向下移动。感谢您的帮助


共 (3) 个答案

  1. # 1 楼答案

    可以使用变量表示垂直速度。跳跃时,将垂直速度设置为负值。在每个帧上,将垂直速度添加到垂直位置,并将一个常数添加到速度以模拟重力。当下面有东西时,将速度设置回0。使用常量值进行实验,以获得适当的跳跃高度

  2. # 2 楼答案

    我不完全确定你所说的“在波浪中上下移动”是什么意思

    但无论如何,在现实物理学中,物体自由下落时的高度(忽略空气阻力)遵循抛物线;i、 e.它遵循如下公式:

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

    (制定运动定律还有其他方法,但这种方法可能正是简单游戏所需要的。)


    1/2正弦波看起来很像截短的抛物线,可以在游戏中使用。但是,您需要认识到,它不是真实世界物理的精确模拟,特别是对于跳高

  3. # 3 楼答案

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

    enter image description here

    因此,对于跳跃运动,您可能需要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