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”属性。在主游戏循环中,您应该检查碰撞并相应地移动玩家。按键时不需要检查碰撞。