我很高兴建立一个2D平铺游戏(没有libgdx的Slick2D),而且我正在进行超过15个小时的碰撞。我觉得是时候提问了。我搜索了很多,但没有人真正回应我搜索的内容。
所以,这就是它的样子:2D game capture(黑暗的牌是玩家无法进入的)和Another 2D game capture
矩形是碰撞可能发生的。在那里,当它们碰撞时,它仍然移动到足以锁定在瓷砖中。 (不能再做任何事了)
因此,我的类由输入处理程序,更新和绘图调用。论文三由“游戏”类。谁只是更新东西。 (Player.MoveUp(),Player.draw,...)
“WorldManager”是管理图块的位置(其中只有4个,如果被阻止,则查找getType()<0有效且1个被阻止
“LevelGeneration”是图块的级别,位置及其ID 映射(使用int [] [])(他没关系'它创建带ID的地图,当我用 然后表明他们都很好。
AssetManager是我剪切精灵表以进行变换然后在BufferedImage中的地方
tileize为50,玩家为41x36。
我有一个问题,因为我想拥有自由的权利(4个方面可以制作8个方面)并且锚点似乎位于左上方
所以这是我的班级(没有导入和包):
public class Player {
public static double SPEED;
public static int WIDTH, HEIGHT;
public static float XPos, YPos;
public static float destXPos, destYPos;
public static BufferedImage presentImage;
public static int[] position;
public static boolean moving;
public static boolean movementlock;
public static int side; // 0 up 1 right 2 down 3 left
public static Rectangle p = null;
public static Rectangle e = null;
private static boolean mouvementlock;
private static boolean collision;
public static void CreateHero(){
// Valeurs de test
position = new int[2];
SPEED = 1;
XPos = destXPos = 100;
YPos = destYPos = 100;
presentImage = AssetManager.Player[0][0];
moving = false;
movementlock = false;
collision = false;
position[0] = (int) (XPos/WorldManager.TileSize);
position[1] = (int) (YPos/WorldManager.TileSize);
}
public static void MoveUp(){
side = 0;
destYPos -= SPEED;
moving = ValidateNextPosition();
}
public static void MoveRight(){
side = 1;
destXPos += SPEED;
moving = ValidateNextPosition();
}
public static void MoveDown(){
side = 2;
destYPos += SPEED;
moving = ValidateNextPosition();
}
public static void MoveLeft(){
side = 3;
destXPos -= SPEED;
moving = ValidateNextPosition();
}
static void updateMovement(){
if(moving == true && mouvementlock == false){
mouvementlock = true;
System.out.println("Mouvement");
System.out.println("X : " + XPos);
System.out.println("Y : " + YPos);
XPos = destXPos;
YPos = destYPos;
System.out.println("Xdest : " + destXPos);
System.out.println("Ydest : " + destYPos);
System.out.println("" + moving);
moving = false;
mouvementlock = false;}
else{
destXPos = XPos;
destYPos = YPos;
}
}
public static boolean ValidateNextPosition(){
if(moving) return false;
if(collision) return false;
p = new Rectangle((int) XPos, (int) YPos, presentImage.getWidth(null),presentImage.getHeight(null));
int tileid = 0;
boolean validate = true;
int destpos[] = new int[2];
double TileCollision[] = new double[2];
destpos[0] = (int) destXPos/WorldManager.TileSize;
destpos[1] = (int) destYPos/WorldManager.TileSize;
TileCollision[0] = 0;
TileCollision[1] = 0;
if(side == 0 && collision != true){
if(destpos[1] - 1 > 0){
tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1] - 1];
if(destYPos + 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1 ){
destpos[1] -= 1;collision = true;}}
}
if(side == 1 && collision != true){
tileid = LevelGenerator.getIdmap()[destpos[0] + 1][destpos[1]];
if(destXPos + 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1 ){
destpos[0] += 1;collision = true;}
}
if(side == 2 && collision != true){
tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1] + 1];
if(destYPos - 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1 ){
destpos[1] += 1;collision = true;}
}
if(side == 3 && collision != true){
tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1]];
if(destXPos - 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1 ){
/*destpos[0] -= 1*/;collision = true;}
}
if (collision == true){
TileCollision[0] = LevelGenerator.getPosmap()[destpos[0]][destpos[1]][0];
TileCollision[1] = LevelGenerator.getPosmap()[destpos[0]][destpos[1]][1];
e = new Rectangle((int) TileCollision[0], (int) TileCollision[1],WorldManager.TileSize,WorldManager.TileSize);}
if(e != null && p.intersects(e)){
validate = false;
System.out.println("collision");}
return validate;
}
public static void update() {
updateMovement();
}
public static void draw(Graphics2D g) {
g.drawImage(presentImage,(int) XPos,(int) YPos,presentImage.getWidth(null),presentImage.getWidth(null),null);
if(p != null){
g.setColor(Color.BLACK);
g.drawRect(p.x, p.y, p.width, p.height);}
if(e != null){
g.setColor(Color.BLACK);
g.drawRect(e.x, e.y, e.width, e.height);}
}
}
要恢复,
非常感谢你,祝你有个美好的一天
Hell'no
(P.S。:英语是我的第三语言,所以请问我是否完全不懂)
答案 0 :(得分:0)
当collision
设置为true且您的ValidateNextPosition
方法返回false时,collision
(以及扩展名为moving
变量)永远不能再次切换,因为{ {1}}声明在顶部。