如何让玩家跳

时间:2020-08-10 13:39:53

标签: java

我试图用Java制作恐龙游戏,而我试图使我按下空格时的角色跳起来,我该如何去做呢?我想知道如何重绘玩家(圆圈)以使其Y值更改为降低它,使其看起来像玩家在跳跃。 ---免责声明这是我的第二篇文章,所以对我容易。 ---

package main;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

public class mainGame extends JPanel implements ActionListener, KeyListener {
    JFrame frame;
    Timer t = new Timer(5, this);
    double x = 750, y = 290, velX = 2, velY = 2, playerX = 10, playerY = 310;
    boolean gameOver = false;
    long jumpingTime = 200;

    public void actionPerformed(ActionEvent e) {
        if (x == 30) {
            gameOver = true;
        } else {
            x -= velX;
            if (x == 0) {
                x = 750;
            }
        }
    }
    @Override
    public void keyTyped(KeyEvent keyEvent) {
    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_SPACE) {
            repaint(playerY - 20);
            new Thread(new thread()).start();
        }
    }

    @Override
    public void keyReleased(KeyEvent keyEvent) {
        int keyCode = keyEvent.getKeyCode();
        if (keyCode == KeyEvent.VK_SPACE) {
            repaint((long) (playerY += 20));
            new Thread(new thread()).start();
        }

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Rectangle2D cact = new Rectangle2D.Double(x, y, 20, 40);
        g2.fill(cact);
        Ellipse2D player = new Ellipse2D.Double(playerX, playerY, 20, 20);
        g2.fill(player);
        g.drawLine(0, 330, 740, 330);
        t.start();
        if (gameOver) {
            g.setFont(new Font("TimesRoman", Font.PLAIN, 40));
            g.drawString("Game Over!", 280, 200);
        }

        repaint();
    }

    public class thread implements Runnable {

        @Override
        public void run() {
            try {
                Thread.sleep(jumpingTime);
            } catch (Exception e) {
                e.printStackTrace();
                new Thread(this).start();
                System.exit(0);
            }
        }

    }

    public static void main(String[] args) {
        mainGame mG = new mainGame();
        JFrame frame = new JFrame("Dino Game With AI");
        frame.getContentPane().add(new mainGame());
        frame.setSize(750, 400);
        frame.setBackground(Color.white);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.addKeyListener(mG);
    }
}

1 个答案:

答案 0 :(得分:0)

我能想到的最简单的事情是您正在使用的框架。首先,放弃您的“线程”课程。它什么也没做。

您执行的动作是您的“事件循环”,这意味着它被重复调用并执行游戏逻辑。

int jumpState = 0;

public void actionPerformed(ActionEvent e) {
    if (x == 30) {
        gameOver = true;
    } else {
        x -= velX;
        if (x == 0) {
            x = 750;
        }
    }

    //Jump logic.
    if(jumpState > 0){
        playerY = 20 - 20 * jumpState; 
        jumpState--;
    }
    repaint();
}

跳转状态是您从关键侦听器更新的字段。例如,在关键的发布代码中。

@Override
public void keyReleased(KeyEvent keyEvent) {
    int keyCode = keyEvent.getKeyCode();
    if (keyCode == KeyEvent.VK_SPACE) {
        //start a jump if not already jumping.
        if(jumpState==0){
            jumpState = 5;
        }
    }
}

想法是,释放空格键,并将jumpState设置为5。现在事件循环正在运行,看到jumpState的值为5,因此它相应地定位了玩家的身高,并降低jumpState,最终jumpState为0,玩家不再跳跃。该值可以根据您希望玩家跳多久而改变。

此外,从t.start()中删除paintComponent时,仅当您要开始玩游戏时才调用t.start()。 paintComponent经常被随机调用。