Java 2D游戏“;“跳跃”;

Java 2D游戏“;“跳跃”;,java,swing,jframe,Java,Swing,Jframe,我一直在用java开发一个非常简单的2d游戏,完成后可能会将其用作flash游戏或其他东西,我很早就意识到我无法“跳跃”按键移动的“角色”(也称为本代码中的绿色框): import javax.swing.*; 导入java.awt.Graphics; 导入javax.swing.AbstractAction; 导入javax.swing.Action; 导入java.awt.event.ActionEvent; 导入java.awt.Color; 公共类SquareGame扩展了JPanel{

我一直在用java开发一个非常简单的2d游戏,完成后可能会将其用作flash游戏或其他东西,我很早就意识到我无法“跳跃”按键移动的“角色”(也称为本代码中的绿色框):

import javax.swing.*;
导入java.awt.Graphics;
导入javax.swing.AbstractAction;
导入javax.swing.Action;
导入java.awt.event.ActionEvent;
导入java.awt.Color;
公共类SquareGame扩展了JPanel{
静态最终整数大小=400;
静态整数x=SIZE/2,宽度=25,y=(SIZE/2)-宽度,高度=25;
公共静态SquareGame m=新SquareGame();
公共静态void main(字符串[]args){
最终JFrame=新JFrame();
帧。添加(m);
帧。设置标题(“方形游戏”);
框架.设置尺寸(尺寸,尺寸);
frame.setresizeable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Action actionRight=新的AbstractAction(){
已执行的公共作废操作(ActionEvent actionRightEvent){
如果(x<(尺寸-宽度)){
x+=(宽度/5);
}
}
};
Action actionLeft=新的AbstractAction(){
已执行的公共无效操作(ActionEvent actionLeftEvent){
如果(x>0){
x-=(宽度/5);
}
}
};
Action actionUp=新的AbstractAction(){
已执行的公共无效操作(ActionEvent actionUpEvent){
如果(y>((尺寸/2)-(高度*2))){
y-=(高度/5);
}
}
};
Action actionRelUp=新的AbstractAction(){
已执行的公共无效操作(ActionEvent actionUpEvent){
如果(y<(尺寸/2)-高度{
y+=(高度/5);
}
}
};
KeyStroke keyRight=KeyStroke.getKeyStroke(“右”);
KeyStroke keyLeft=击键。getKeyStroke(“左”);
KeyStroke keyUp=KeyStroke.getKeyStroke(“空格”);
KeyStroke relUp=KeyStroke.getKeyStroke(“释放的空间”);
InputMap InputMap=m.getInputMap(JComponent.WHEN_IN_FOCUSED_窗口);
inputMap.put(keyRight,“RIGHT”);
inputMap.put(keyLeft,“LEFT”);
inputMap.put(keyUp,“SPACE”);
inputMap.put(relUp,“释放的空间”);
m、 getActionMap().put(“RIGHT”,actionRight);
m、 getActionMap().put(“左”,actionLeft);
m、 getActionMap().put(“空格”,actionUp);
m、 getActionMap().put(“释放的空间”,actionRelUp);
}
@凌驾
公共空间涂料(图g){
g、 抽绳(0,尺寸/2,尺寸/2);
g、 setColor(Color.green);
g、 fillRect(x,y,宽度,高度);
m、 重新油漆();
}
}

我认为为跳转键添加“key released”(释放键)会起作用,但是这显然只在按下键然后释放时注册,而不是在释放键时注册。那么,我如何正确地添加跳跃的数学?此外,我确实意识到这个程序可能还有一些其他的小问题,我计划在我了解了更多关于角色跳跃和移动的知识后,将其全部清理干净。

我认为您需要一个按键和按键释放处理程序。按键可翻转指示“跳跃”的开关/标志,按键释放可将开关/标志设置回false。对于“jumpPressed”时的某些迭代,您可以执行逻辑以类似跳跃的方式适当地移动精灵。我认为某种计时器可能会很好地实现这一点。@CodeChimp很明显,你建议我为
jumpPressed
添加一个布尔值,并在按键时将其更改为true,在按键释放时将其更改为false?是的。我是在思考大多数支持跳跃的游戏是如何工作的时候得出这个结论的。在大多数游戏中,我相信跳跃的高度/速度是由你按住跳跃键的时间来控制的,最多可以达到一个最大值。为了模拟这种情况,我认为您需要知道按键何时发生(开始跳跃)以及何时结束(停止跳跃,开始下降)。因为这是一个游戏,我想你会想要控制上升/下降的速度。由于游戏将以不同的帧速率来运行,这取决于CPU速度,我想你会想在某个定时循环上控制它。哦,我也认为你需要在中间跳跃时标记,这样你就可以防止在跳跃的中间按压跳转,使跳跃逻辑不再发生。除非你想支持经典的“双跳”,甚至是在双压下的metroid风格的“旋转攻击”。
import javax.swing.*;
import java.awt.Graphics;
import javax.swing.AbstractAction;
import javax.swing.Action;
import java.awt.event.ActionEvent;
import java.awt.Color;

public class SquareGame extends JPanel{
    static final int SIZE = 400;
    static int x = SIZE / 2, width = 25, y = (SIZE / 2) - width, height = 25;
    public static SquareGame m = new SquareGame();
    public static void main(String[] args){
        final JFrame frame = new JFrame();
        frame.add(m);
        frame.setTitle("Square Game");
        frame.setSize(SIZE, SIZE);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        Action actionRight = new AbstractAction(){
            public void actionPerformed(ActionEvent actionRightEvent){
                if(x < (SIZE - width)){
                    x += (width / 5);
                }
            }
        };

        Action actionLeft = new AbstractAction(){
            public void actionPerformed(ActionEvent actionLeftEvent){
                if(x > 0){
                    x -= (width / 5);
                }
            }
        };

        Action actionUp = new AbstractAction(){
            public void actionPerformed(ActionEvent actionUpEvent){
                if(y > ((SIZE / 2) - (height * 2))){
                    y -= (height / 5);
                }
            }
        };

        Action actionRelUp = new AbstractAction(){
            public void actionPerformed(ActionEvent actionUpEvent){
                if(y < (SIZE / 2) - height){
                    y += (height / 5);
                }
            }
        };

        KeyStroke keyRight = KeyStroke.getKeyStroke("RIGHT");
        KeyStroke keyLeft = KeyStroke.getKeyStroke("LEFT");
        KeyStroke keyUp = KeyStroke.getKeyStroke("SPACE");
        KeyStroke relUp = KeyStroke.getKeyStroke("released SPACE");

        InputMap inputMap = m.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(keyRight, "RIGHT");
        inputMap.put(keyLeft, "LEFT");
        inputMap.put(keyUp, "SPACE");
        inputMap.put(relUp, "released SPACE");

        m.getActionMap().put("RIGHT", actionRight);
        m.getActionMap().put("LEFT", actionLeft);
        m.getActionMap().put("SPACE", actionUp);
        m.getActionMap().put("released SPACE", actionRelUp);
    }

    @Override
    public void paint(Graphics g){
        g.drawLine(0, SIZE / 2, SIZE, SIZE / 2);
        g.setColor(Color.green);
        g.fillRect(x, y, width, height);
        m.repaint();
    }
}