gpt4 book ai didi

java - 按下 UP 键时乒乓 Racket 底部不向上移动

转载 作者:行者123 更新时间:2023-12-01 15:17:44 24 4
gpt4 key购买 nike

我正在尝试制作乒乓球游戏,但由于某种原因我的乒乓 Racket 无法正常向上移动。

当我按下向下箭头键时,它向下移动得很好。但是,当我按下向上箭头键时,整个桨会向上变长...如果我调整窗口大小,桨会恢复到该位置的正常长度。如果我再次按向上键,它会继续向上延伸。

我不认为这是我的代码逻辑,而是关于清除之前绘制的桨的内容...这是我的代码,

桨代码:

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;

import javax.swing.JPanel;

public class Paddle extends JPanel {

int x;
int y;
int width;
int height;

Paddle(){
this.x = 0;
this.y = 0;
this.height = 40;
this.width = 10;
}

Paddle(int x, int y, int width, int height){
this.x = x;
this.y = y;
this.height = height;
this.width = width;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(x, y, width, height);
}

public void moveDown(){
this.y += 3;
repaint();
System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight());
}

public void moveUp(){
this.y -= 3;
repaint();
System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight());
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

}

整个游戏的代码:

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Pong extends JFrame {

Pong() {
final Paddle p1Paddle = new Paddle();

Paddle p2Paddle = new Paddle();
p1Paddle.addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//super.keyPressed(arg0);

switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
p1Paddle.moveDown();
break;
case KeyEvent.VK_UP:
p1Paddle.moveUp();
break;
default:
System.out.println("please press up or down");
}

}
});

setLayout(new BorderLayout());
add(p1Paddle, BorderLayout.CENTER);

//only focused components can recieve key events...
p1Paddle.setFocusable(true);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new Pong();
frame.setTitle("Pong");
frame.setSize(650, 300);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

}

任何有关此问题的帮助或一般代码建议将不胜感激。

最佳答案

从代码片段中很难看出,但是 KeyListener 不是很可靠。如果击键被消耗(由 UI 和底层实现),您可能不会收到通知。

尝试查看 InputMap 和 ActionMap。

InputMap im = getInputMap(JTable.WHEN_FOCUSED_COMPONENT);
ActionMap am = getActionMap();

KeyStroke downKey = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
KeyStroke upKey = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);

im.put(downKey, "Action.down");
im.put(upKey, "Action.up");

am.put("Action.down", new DownAction());
am.put("Action.up", new UpAction());

看看它会带你去哪里......

更新:啊,现在很明显了,您已经重写了面板的 x/y 宽度/高度方法,期望布局管理器使用它们来布局组件,但并没有真正提供知道如何处理它的布局管理器。

BorderLayout 不关心您的“大小”或“位置”要求,它会用它认为您的组件应该的内容覆盖它们。

您想要做的是使用绝对布局管理器(null)。另外,您不想实现 X/Y、宽度/高度管理,因为这已经为您处理好了。

所以。

在 Pong 课上。将布局管理器从 BorderLayout 更改为 null(同时更新 add(paddle) 方法以删除 BorderLayout 引用,这不是必需的,但可以消除困惑)。

在 Paddle 类中,删除所有对 x/y、宽度/高度的引用,您不需要它们。而是使用 setBounds/setLocation。

public class Paddle extends JPanel {

Paddle(){

this(0, 0, 20, 40);

}

Paddle(int x, int y, int width, int height){

setBounds(x, y, width, height);

}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
// The graphics context has already been translated to x/y for use,
// so we don't need to care about it
g.fillRect(0, 0, getWidth(), getHeight());
}

public void moveDown(){

setLocation(getX(), getY() + 3);

}

public void moveUp(){

setLocation(getX(), getY() - 3);

}

}

还有中提琴,它有效。

关于java - 按下 UP 键时乒乓 Racket 底部不向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401053/

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