Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 物体碰撞检测,强制玩家移动0_Java_Collision Detection - Fatal编程技术网

Java 物体碰撞检测,强制玩家移动0

Java 物体碰撞检测,强制玩家移动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

我不明白为什么当我撞到我的物体上时,我的角色会冻结。例如,如果我撞到碰撞()中,我可以向左和向右移动,但不能向上移动;如果我撞到碰撞()中,我在所有地方都会冻结;但是,如果我撞到我设定的边界中,我仍然可以毫无问题地向各个方向移动。xa和ya仍被设置为0

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;
}