繁体   English   中英

java-KeyListener无法检测到冲突(平台游戏)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM