gpt4 book ai didi

java - 带 Swing 的 keyListener 和带 Swing/keyListener 和 Thread 的游戏关卡系统

转载 作者:行者123 更新时间:2023-12-01 11:53:04 25 4
gpt4 key购买 nike

我是一名编码新手,大约 10 年前有一点 C++ 经验,现在正在学习 java(大约 4-5 个月)。我正在进行一个小型协作项目,并且我有一些事情需要解决。

代码如下:

import java.awt.event.*;
import java.awt.*;

import javax.swing.JFrame;

import java.util.Scanner;
import java.util.Random;

public class Game extends JFrame {


GamePanel panel;
int[][] grid;
int size;

//...and some other variables

public Game(String title) {

super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

panel = new GamePanel(grid,size);
this.add(panel);

Button button = new Button("WHAT");
button.setBounds(-100, -100, 70, 70);
this.add(button);
button.addKeyListener(new KeyHandler());

}

class KeyHandler extends KeyAdapter {

public void keyPressed(KeyEvent e) {

int keycode = e.getKeyCode();

switch(keycode) {

//arrow keys input and stuff

}

if(checkForWin()) //checkForWin() returns a boolean value for win/loss
//won the game, thus end the thread here

if(checkForLoss()) // similar stuff as checkForLoss()
//lost the game, thus end the thread here

//...update the panel
panel.repaint();

}

}

public static void main(String [] args) {

Game me = new Game("GAME");

me.setVisible(true);

}

}

这就是整个游戏的样子。

我有疑问:

  1. 我正在使用一个按钮,并将其放在负位置以使其不可见,并将其用作 KeyListener 的手段。还有其他方法可以添加关键监听器吗?例如)到面板或其他什么?

  2. 我想更改它,使每个“级别”都是一个线程,并使其像

    public static void main(String [] args) {

    int level = 1;

    do {

    GameThread gt = new GameThread("Game");

    // run() will have the game constructor inside

    gt.setLevel(level);
    gt.start();
    gt.join(); //wait until the game "level" is finished

    if(won)
    level++;

    if(lost)
    level = 1;

    } while(!checkIfDonePlaying())

    }

有点像这样。我无法让线程继续运行,直到游戏关卡真正完成。我该怎么做?

  • 我想添加一个 JLabel 以在框架上显示分数。但是当我这样做时,当我 repaint() 时分数不会更新。我该怎么做?
  • 提前致谢!

    最佳答案

    一些事情:

    1. 是的,有一种方法可以将 KeyListener 添加到面板,那就是使用 key bindings 。例如:

      javax.swing.InputMap im = panel.getInputMap(panel.WHEN_IN_FOCUSED_WINDOW);
      javax.swing.ActionMap am = panel.getActionMap();

      im.put(javax.swing.KeyStroke.getKeyStroke("pressed UP"), "up");
      am.put("up", new javax.swing.AbstractAction() {
      @Override
      public void actionPerformed(ActionEvent ev) {
      // handle up arrow key action here
      }
      });
    2. Swing 是一个事件驱动的环境,因此不应使用 do-while 循环。相反,请使用 Swing 计时器定期检查您的关卡是否已完成。

    3. 由于您没有在 JLabel 上进行任何自定义绘制,因此不应使用 repaint。相反,请使用其 setText 方法。

    关于java - 带 Swing 的 keyListener 和带 Swing/keyListener 和 Thread 的游戏关卡系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639387/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com