[英]java - KeyListener fails to detect collision (platformer game)
我正在制作Java游戏,完全没有任何外部库或引擎。 一切都很好,但是我遇到了KeyListener问题。 我不明白为什么会这样。
每当我动画Character
,其延伸Object
与(另一个定制I类编码) velX
,并用自定义碰撞检测它工作得很好,并且Character
停止移动每当Character
Object
与碰撞Block
Object
; 即
对象控制器
Character c = new Character();
字符( extends Object
)
public void checkCollision(LinkedList<Object> objects){
for (int i = 0; i < objects.size(); i++) {
if(this.bounds.getRCol().intersects(objects.get(i).bounds.getLCol())){
setVelX(0);
}
}
}
宾语
public void tick(LinkedList<Object> objects){
x += velX;
y += velY;
checkCollision(objects)
}
KeyListener(工作版本,但我希望动画在释放键后停止播放)
public void keyPressed(KeyEvent e){
c.setVelX(1);
}
public void keyReleased(KeyEvent e){
// nothing
}
KeyListener(此版本有效,按下键时动画开始,释放键时动画停止,但碰撞检测无效)
public void keyPressed(KeyEvent e){
c.setVelX(1);
}
public void keyReleased(KeyEvent e){
c.setVelX(0);
}
我已经正确地编程了每个班级,或者至少我是这样。 左右碰撞矩形已正确放置在所有Object
。
那为什么不起作用呢? 我做错了吗? 还是Swing的KeyListener的错?
任何帮助将不胜感激。 如果您需要更多信息,请在下面评论,我很乐意提供更多信息!
谢谢,ProgrammersDude。
编辑-更新1
有一个名为JPanel
的类Panel.class
,它是所有面板的主容器。
然后是Subpanel.class
,它也扩展了JPanel
。 它是一个抽象类,在该类内部调用tick()
。
package com.platformer.main;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public abstract class Subpanel extends JPanel implements Runnable{
private static final long serialVersionUID = 1L;
public boolean loaded = false;
public Thread loop = null;
public Subpanel(){
this.setFocusable(true);
this.requestFocusInWindow();
init();
loop = new Thread(this);
loop.start();
}
public void init(){
load();
loaded = true;
}
public abstract void load();
public void run(){
while(loaded){
tick();
repaint();
try{
Thread.sleep(17);
}catch(InterruptedException e){
}
}
}
public abstract void tick();
BufferedImage buffer;
Graphics bg;
public void paint(Graphics g){
buffer = (BufferedImage) this.createImage(Start.WIDTH, Start.HEIGHT);
bg = buffer.getGraphics();
paintComponent(bg);
g.drawImage(buffer, 0, 0, null);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if(loaded){
render(g2);
}
}
public abstract void render(Graphics2D g);
}
}
在Gamepanel.class
内部看起来像这样:
package com.platformer.subpanels;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import com.platformer.input.GameKeys;
import com.platformer.main.Start;
import com.platformer.main.Subpanel;
import com.platformer.objects.ObjectController;
public class Gamepanel extends Subpanel{
private static final long serialVersionUID = 1L;
ObjectController objectController;
GameKeys key;
public void load(){
objectController = new ObjectController();
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
objectController.character.setVelX(1);
}
public void keyReleased(KeyEvent e) {
objectController.character.setVelX(0);
}
});
}
public void tick(){
objectController.tick();
}
public void render(Graphics2D g){
g.setColor(Color.black);
g.fillRect(0, 0, Start.WIDTH, Start.HEIGHT);
objectController.render(g);
}
}
GameKeys
是我以前使用的KeyListener。 现在,如您所见,在代码中,我正在使用自定义KeyAdapter对其进行测试。 它仍然不起作用。
GameKeys.class
看起来像这样:
package com.platformer.input;
import java.awt.event.KeyEvent;
import com.platformer.objects.ObjectController;
import com.platformer.subpanels.Gamepanel;
public class GameKeys extends KeyInput{
private ObjectController objectController;
private com.platformer.objects.Character character;
public GameKeys(Gamepanel panel, ObjectController objectController){
super(panel);
this.objectController = objectController;
this.character = this.objectController.character;
}
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_ESCAPE:
System.exit(0);
case KeyEvent.VK_RIGHT:
character.setVelX(1);
}
}
public void keyReleased(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_RIGHT:
character.setVelX(0);
}
}
public void keyTyped(KeyEvent e) {
}
}
它基于KeyInput.class
:
package com.platformer.input;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
public abstract class KeyInput implements KeyListener{
public KeyInput(JPanel panel){
panel.addKeyListener(this);
}
}
我找到了一种解决方法。 我添加了一个简单的布尔值,
public void isCollision(){
return collision;
}
和一个符合以下条件的collision
对象:
for (int i = 0; i < objects.size(); i++) {
if(this.bounds.getRCol().intersects(objects.get(i).bounds.getLCol())){
collision = true;
setVelX(0);
}else{collision = false;}
}
然后从GameKeys.class进行了修改:
public void keyPressed(KeyEvent e){
if(!objectController.character.isCollision()){
objectController.character.setVelX(1);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.