Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按键vs墙对象_Java_Awt_Bounds - Fatal编程技术网

Java 按键vs墙对象

Java 按键vs墙对象,java,awt,bounds,Java,Awt,Bounds,我正在慢慢地变得疯狂,我正在尝试制作玩家级的物品 package hra.objects; import hra.Handler; import hra.abstracts.GameObject; import hra.enums.Direction; import hra.enums.ID; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; public class Player ext

我正在慢慢地变得疯狂,我正在尝试制作玩家级的物品

package hra.objects;

import hra.Handler;
import hra.abstracts.GameObject;
import hra.enums.Direction;
import hra.enums.ID;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;


public class Player extends GameObject{
    private final Handler handler;
    public boolean keyDown;

    private int HEALTH=100;private int MANA=100; private int STAMINA=100;

    public Player(int x, int y, ID id, Direction dir,Handler handler) {
        super(x, y, id , dir);
        this.handler=handler;
    }

    @Override
    public void tick() {
        x+=velX;
        y+=velY;
        Collision();
    }
    public void Collision(){
        for (GameObject tempObject : handler.object) {
            if(tempObject.getId()==ID.Enemy){
                if(getBounds().intersects(tempObject.getBounds())){
                    setHEALTH(getHEALTH() - 2);
                }   
            }
            if(this.wallCheck(dir)==true){
                keyDown=false;
            }
        }


    }

    @Override
    public void render(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(x, y, 32, 32);
        g.setColor(Color.red);
        g.drawRect(x, y-5, 32, 5);
        g.drawRect(x, y+32, 32, 5);
        g.drawRect(x-5, y, 5, 32);
        g.drawRect(x+32,y, 5, 32);
        g.drawRect(x, y, 31, 31);
    }

    @Override
    public Rectangle getBounds() {
        return new Rectangle(x,y,32,32);
    }
    @Override
    public boolean wallCheck(Direction dir) {
        for (GameObject tempObject : handler.object) {
            if(tempObject.getId()!=this.id){
                if (dir==Direction.UP){
                    return new Rectangle(x,y-5,32,5).intersects(tempObject.getBounds());
                }
                else if (dir==Direction.DOWN){
                    return new Rectangle(x,y+32,32,5).intersects(tempObject.getBounds());
                }
                else if (dir==Direction.LEFT){
                    return new Rectangle(x-5,32,5,32).intersects(tempObject.getBounds());
                }
                else if(dir==Direction.RIGHT){
                    return new Rectangle(x+32,32,5,32).intersects(tempObject.getBounds());
                }
            }
        }
        return false;
    }
    public int getHEALTH() {
        return HEALTH;
    }

    public void setHEALTH(int HEALTH) {
        this.HEALTH = HEALTH;
    }

    public int getMANA() {
        return MANA;
    }

    public void setMANA(int MANA) {
        this.MANA = MANA;
    }

    public int getSTAMINA() {
        return STAMINA;
    }

    public void setSTAMINA(int STAMINA) {
        this.STAMINA = STAMINA;
    }

}
在我的主要游戏机制中,我使用一个方法KeyInput作为一个keyListener

package hra;

import hra.abstracts.GameObject;
import hra.enums.Direction;
import hra.enums.ID;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class KeyInput extends KeyAdapter{
    private final Handler handler;
    private final boolean[] keyDown =new boolean[8];
    public KeyInput(Handler handler){
        this.handler=handler;


    }



    @Override
    public void keyPressed(KeyEvent e){
        int key= e.getKeyCode();

        for (GameObject tempObject : handler.object) {

            if(tempObject.getId()==ID.Player){

                if(key==KeyEvent.VK_UP){
                    tempObject.setDir(Direction.UP);
                    if(tempObject.wallCheck(Direction.UP)==true) return;
                    else tempObject.setVelY(-1);
                }
                if(key==KeyEvent.VK_DOWN){
                    tempObject.setDir(Direction.DOWN);
                    if(tempObject.wallCheck(Direction.DOWN)==true) return;
                    else tempObject.setVelY(1);
                }
                if(key==KeyEvent.VK_LEFT){
                    tempObject.setDir(Direction.LEFT);
                    if(tempObject.wallCheck(Direction.LEFT)==true) return;
                    else tempObject.setVelX(-1);
                }
                if(key==KeyEvent.VK_RIGHT){
                    tempObject.setDir(Direction.RIGHT);
                    if(tempObject.wallCheck(Direction.RIGHT)==true) return;
                    else tempObject.setVelX(1);       
                }
                keyReleased(e);
            }
    }

    @Override
    public void keyReleased(KeyEvent e){
        int key=e.getKeyCode();

        for (GameObject tempObject : handler.object) {
            if(tempObject.getId()==ID.Player){
                if(key==KeyEvent.VK_UP)   tempObject.setVelY(0);
                if(key==KeyEvent.VK_DOWN) tempObject.setVelY(0);
                if(key==KeyEvent.VK_LEFT) tempObject.setVelX(0);
                if(key==KeyEvent.VK_RIGHT)tempObject.setVelX(0);
            }

        }
    }
}
当我按住键时,对象播放器会直接穿过其他对象 而当我已经开始按键盘的时候,它就不会让我移动了。
这就像当播放器前面的矩形与另一个对象发生冲突时,键侦听器没有考虑返回语句一样

考虑使用over
KeyListener
,它将解决您可能遇到的难题之一。与其尝试更新按键事件中的状态,不如设置一个指示当前按键状态的标志,并使用单独的“游戏循环”来更新状态,这将解决交错按键事件的问题。您是否在每次更新玩家位置或按下按键时检查碰撞?尝试绘制碰撞框并查看它们是否相交。另外,试着在keyPressed方法中调试和设置一些断点,看看它在做什么。请看。@mouscellaneus是的,我试图在player render方法中画出它们,正如您所看到的,是的,这就是我试图实现的,每次更新检查,而不仅仅是当我按下键时。到目前为止还不错,但我还是没有做到:P@MadProgrammer谢谢你建议我马上去试试!谢谢大家提到这篇文章!在你的帮助下,我不知怎么搞明白了。它仍然是滞后的,但我在KeyInput类中实现了另一个线程,它有自己的循环,虽然它只是有点滞后,但它几乎无法工作。当按下或释放一个键时,最好只设置“dir”和“velx”/“vely”属性。在主游戏循环中,您应该检查碰撞并相应地移动玩家。按键时不需要检查碰撞。