gpt4 book ai didi

java - 玩家控制的 JPanel 对象卡在 JFrame 的某些角落

转载 作者:行者123 更新时间:2023-12-01 19:39:53 26 4
gpt4 key购买 nike

我目前正在尝试制作一个基于 Java 的平台游戏,作为自学 Java Swing 的尝试方法。我目前在 JFrame 中有一个 JPanel,它由 w-a-s-d 控制。我目前正在记事本中进行编码,并使用命令行来运行并监视脚本。 (我知道,没有哪个 IDE 是愚蠢的,只是现在无法打扰)

import java.awt.*; 
import java.awt.event.*;
import javax.swing.*;
public class PanelExample {
private int dx;
private int dy;
private static javax.swing.Timer t;
boolean x1 = false;
boolean x2 = false;
boolean y1 = false;
boolean y2 = false;
PanelExample() {
JFrame f= new JFrame("Panel Example");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p= new JPanel();
p.setBounds(50,50,20,20);;
p.setBackground(Color.red);
f.add(p);
f.setSize(700,400);
f.setLocationRelativeTo(null);
f.setLayout(null);
f.setVisible(true);
new Timer(20, new ActionListener(){
public void actionPerformed(ActionEvent arg0){
int bx = p.getLocation().x;
int by = p.getLocation().y;
if (x1 == true) {
p.setLocation(p.getLocation().x + 5, p.getLocation().y);
}
else {
p.setLocation(p.getLocation().x, p.getLocation().y);
}
if (x2 == true) {
p.setLocation(p.getLocation().x - 5, p.getLocation().y);
}
else {
p.setLocation(p.getLocation().x, p.getLocation().y);
}
if (y1 == true) {
p.setLocation(p.getLocation().x, p.getLocation().y + 5);
}
else {
p.setLocation(p.getLocation().x, p.getLocation().y);
}
if (y2 == true) {
p.setLocation(p.getLocation().x, p.getLocation().y - 5);
}
else {
p.setLocation(p.getLocation().x, p.getLocation().y);
}
if (bx < 0) {
p.setLocation(p.getLocation().x = 0, p.getLocation().y);
}
if (bx > 665) {
p.setLocation(p.getLocation().x = 665, p.getLocation().y);
}
if (by < 0) {
p.setLocation(p.getLocation().x, p.getLocation().y = 0);
}
if (by > 340) {
p.setLocation(p.getLocation().x, p.getLocation().y = 340);
}
System.out.println("X value: " + bx + " | Y value: " + by);
}
}).start();
f.addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
int ax = e.getKeyCode();
int bx = p.getLocation().x;
int by = p.getLocation().y;
switch(ax)
{
//the numbers on the cases corresond with w-a-s-d
//this is for the key s to go down
case 83:
if (by < 340){
y1 = true;
break;
}
//this is for the key d or right
case 68:
if (bx < 665){
x1 = true;
break;
//this is for the key w or up
}
case 87:
if (by > 0){
y2 = true;
break;
}
//this is for the key a or left
case 65:
if (bx > 0){
x2 = true;
break;
}
}
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("Key released code=" + e.getKeyCode());
int ax = e.getKeyCode();
switch(ax)
{
case 83:
y1 = false;
break;
case 68:
x1 = false;
break;
case 87:
y2 = false;
break;
case 65:
x2 = false;
break;
}
}
});
}
public static void main(String args[]) {
new PanelExample();
}
}

我的问题是,当我的对象接触顶墙或右墙时,有一半的时间分别进入左上角或右上角。发生这种情况时,对于顶墙, key d 停止工作,对于右墙, key s 停止工作。我尝试设置 if 语句以在超出边界时停止所有移动,但这没有帮助。我做错了什么?

最佳答案

首先,您不应该使用“魔数(Magic Number)”。例如:

case 83:

API 提供的变量使您的代码更易于阅读:

case KeyEvent.VK_S:

My issue is that when my object touches the top or right walls

不确定发生了什么,但我怀疑您有几个问题:

  1. 您将 KeyListener 添加到了错误的组件。当您应该将其添加到框架的内容 Pane 时,您正在将其添加到框架,因为您将红色面板添加到了内容 Pane 。也就是说,您的红色面板永远不会到达框架的顶部,因为标题栏是框架的一部分。因此,当您对 0 进行测试时,它需要与框架的内容 Pane 相关。

  2. 我看到硬编码值对我来说毫无意义。 665是什么?这就是宽度的意思吗?不要对值进行硬编码。如果用户调整框架大小怎么办?

您可以在 KeyListener 中使用如下代码动态获取大小:

Component c = (Component)e.getSource();
int width = c.getWidth();

但是,如果您进行上述更改,您的代码将停止工作,因为仅为具有焦点的组件生成 KeyEvent,而您的面板将不会获得焦点,因为默认情况下面板不可聚焦。论坛中的一般建议是使用键绑定(bind),而不是 KeyListener。

查看Motion Using the Keyboard包含上述所有建议的工作示例。

关于java - 玩家控制的 JPanel 对象卡在 JFrame 的某些角落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182932/

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