Java 物体碰撞检测,强制玩家移动0
我不明白为什么当我撞到我的物体上时,我的角色会冻结。例如,如果我撞到碰撞()中,我可以向左和向右移动,但不能向上移动;如果我撞到碰撞()中,我在所有地方都会冻结;但是,如果我撞到我设定的边界中,我仍然可以毫无问题地向各个方向移动。xa和ya仍被设置为0Java 物体碰撞检测,强制玩家移动0,java,collision-detection,Java,Collision Detection,我不明白为什么当我撞到我的物体上时,我的角色会冻结。例如,如果我撞到碰撞()中,我可以向左和向右移动,但不能向上移动;如果我撞到碰撞()中,我在所有地方都会冻结;但是,如果我撞到我设定的边界中,我仍然可以毫无问题地向各个方向移动。xa和ya仍被设置为0 package com.questkings.game; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt
package com.questkings.game;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class Player{
int x = 1; // Location of player
int y = 314; // location of player
int xa = 0; // Representation of where the player goes
int ya = 0; // Representation of where the player goes
private int speed = 2;
int[] playerPos = {x, y};
private static final int WIDTH = 30;
private static final int HEIGHT = 30;
private Game game;
public Player(Game game){
this.game=game;
}
public void move(){
if(x + xa < 0) // Left Bounds
xa = 0;
else if (x + xa > game.getWidth() - WIDTH) // Right Bounds
xa = 0;
else if (y + ya < 0) // Top Bounds
ya = 0;
else if(y + ya > game.getHeight() - WIDTH)
ya = 0;
else if (collision()) // Tile bounds
ya = 0;
else if (collision2()){
ya = 0;
xa = 0;
}
x = x + xa;
y = y + ya;
}
// Method to find where player is located
public int[] Playerposition(){
return playerPos;
}
public void Gravity(){
}
public void paint(Graphics2D g2d){
//Draws player to screen
g2d.drawImage(getPlayerImg(), x, y, null);
}
public Image getPlayerImg(){
ImageIcon ic = new ImageIcon("C:/Users/AncientPandas/Desktop/KingsQuest/Misc/Images/Sprites/player.png");
return ic.getImage();
}
public void keyReleased(KeyEvent e){
xa = 0;
ya = 0;
}
public void keyPressed(KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_S)
xa = -speed;
if (e.getKeyCode() == KeyEvent.VK_F)
xa = speed;
if (e.getKeyCode() == KeyEvent.VK_E)
ya = -speed;
if (e.getKeyCode() == KeyEvent.VK_D)
ya = speed;
}
public Rectangle getBoundsPlayer(){
return new Rectangle(x, y, WIDTH, HEIGHT);
}
private boolean collision(){
return game.maplayout.getBoundsBlock().intersects(getBoundsPlayer());
}
private boolean collision2(){
return game.maplayout.getBoundsBlock2().intersects(getBoundsPlayer());
}
}
package com.questkings.game;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.Rectangle;
导入java.awt.event.KeyEvent;
导入javax.swing.ImageIcon;
公开课选手{
int x=1;//播放器的位置
int y=314;//播放器的位置
int xa=0;//表示播放器的去向
int ya=0;//表示玩家的去向
私人内部速度=2;
int[]playerPos={x,y};
专用静态最终整数宽度=30;
专用静态最终内部高度=30;
私人游戏;
公共玩家(游戏){
这个。游戏=游戏;
}
公开作废动议(){
if(x+xa<0)//左边界
xa=0;
else if(x+xa>game.getWidth()-WIDTH)//右边界
xa=0;
else如果(y+ya<0)//上界
ya=0;
else if(y+ya>game.getHeight()-WIDTH)
ya=0;
else if(collision())//平铺边界
ya=0;
else if(collision2()){
ya=0;
xa=0;
}
x=x+xa;
y=y+ya;
}
//方法来查找播放机所在的位置
public int[]播放位置(){
返回playerPos;
}
公共空间重力(){
}
公共空隙涂料(Graphics2D g2d){
//将玩家吸引到屏幕上
g2d.drawImage(getPlayerImg(),x,y,null);
}
公共映像getPlayerImg(){
ImageIcon ic=新的ImageIcon(“C:/Users/AncientPandas/Desktop/KingsQuest/Misc/Images/Sprites/player.png”);
返回ic.getImage();
}
公共无效密钥已释放(密钥事件e){
xa=0;
ya=0;
}
按下公共无效键(按键事件e){
如果(例如getKeyCode()==KeyEvent.VK_S)
xa=速度;
if(e.getKeyCode()==KeyEvent.VK\u F)
xa=速度;
if(e.getKeyCode()==KeyEvent.VK_e)
ya=速度;
如果(例如getKeyCode()==KeyEvent.VK_D)
ya=速度;
}
公共矩形getBoundsPlayer(){
返回新矩形(x、y、宽度、高度);
}
私有布尔冲突(){
return game.maplayout.getBoundsBlock().intersects(getBoundsPlayer());
}
私有布尔冲突2(){
return game.maplayout.getBoundsBlock2().intersects(getBoundsPlayer());
}
}
在我看来,如果collision()
返回true,您的播放器将无法移动,因为ya
和xa
设置为零。这意味着一旦你击中了什么东西,你就会被困在那里直到你没有击中它,这完全是你无法控制的。如果你正在碰撞的物体静止不动,你将永远无法逃脱
我要做的是在移动后检查碰撞:
这样,你就可以回到你以前的位置,这应该是安全的,因为你之前不知怎么地到达那里而没有发生碰撞
我不确定你的碰撞逻辑是否能处理这个问题,所以我唯一能说的是,如果你在碰撞,试着将
ya
和xa
乘以-1,这将使你朝相反的方向前进,希望不会受到伤害。这个想法是朝着你想要的方向移动会让你陷入麻烦,所以朝相反的方向移动应该可以解决问题。问题是,如果向后移动并不能阻止你碰撞,那么你会再次反转方向,很可能就在你开始的地方结束,仍然在碰撞。这形成了一个无限循环,玩家看起来很可能是癫痫发作,但我见过很多游戏出现类似的物理错误。将方向乘以-1有效。现在来增加重力,让我的球员自己倒下,这会很好。我感谢你的帮助。很抱歉迟了答复。我从编程中休息了大约两周。我得到了口吃的效果,但是,我应该能够解决这个问题。我找到了一个解决口吃的简单方法。碰撞时更改我的y位置y=y-4;
// handle hitting sides like normal
x = x + xa;
y = y + ya;
// now that you've moved, check if you're colliding
if (collision()){
// if you have, go back to where you were
x = x - xa;
y = y - ya;
}