我在写作的游戏中显示了两个角色,即玩家和敌人.定义如下:
public void player(Graphics g) { g.drawImage(plimg, x, y, this); } public void enemy(Graphics g) { g.drawImage(enemy, 200, 200, this); }
然后叫:
player(g); enemy(g);
我可以用键盘移动播放器(),但在尝试检测两者之间的碰撞时我感到很茫然.很多人都说使用矩形,但作为一个初学者,我看不出如何将它链接到我现有的代码中.谁能为我提供一些建议?
我认为你的问题是你没有为你的玩家和敌人使用优秀的OO设计.创建两个类:
public class Player { int X; int Y; int Width; int Height; // Getters and Setters } public class Enemy { int X; int Y; int Width; int Height; // Getters and Setters }
您的播放器应具有X,Y,Width和Height变量.
你的敌人也应该如此.
在你的游戏循环中,做这样的事情(C#):
foreach (Enemy e in EnemyCollection) { Rectangle r = new Rectangle(e.X,e.Y,e.Width,e.Height); Rectangle p = new Rectangle(player.X,player.Y,player.Width,player.Height); // Assuming there is an intersect method, otherwise just handcompare the values if (r.Intersects(p)) { // A Collision! // we know which enemy (e), so we can call e.DoCollision(); e.DoCollision(); } }
为了加快速度,不要费心检查敌人的坐标是否在屏幕外.
首先,使用Jonathan Holland所描述的边界框来查找是否有碰撞.
从(多色)精灵,创建黑色和白色版本.如果你的精灵是透明的,你可能已经有了这些(即有些地方在边界框内,但你仍然可以看到背景).这些是"面具".
使用Image.getRGB()
蒙版来获取像素.对于每个不透明的像素,在整数数组(playerArray
及enemyArray
以下)中设置一个位.该数组的大小是height
如果width <= 32
像素,(width+31)/32*height
否则.以下代码适用于width <= 32
.
如果边界框发生碰撞,请执行以下操作:
// Find the first line where the two sprites might overlap int linePlayer, lineEnemy; if (player.y <= enemy.y) { linePlayer = enemy.y - player.y; lineEnemy = 0; } else { linePlayer = 0; lineEnemy = player.y - enemy.y; } int line = Math.max(linePlayer, lineEnemy); // Get the shift between the two x = player.x - enemy.x; int maxLines = Math.max(player.height, enemy.height); for ( line < maxLines; line ++) { // if width > 32, then you need a second loop here long playerMask = playerArray[linePlayer]; long enemyMask = enemyArray[lineEnemy]; // Reproduce the shift between the two sprites if (x < 0) playerMask << (-x); else enemyMask << x; // If the two masks have common bits, binary AND will return != 0 if ((playerMask & enemyMask) != 0) { // Contact! } }
链接:JGame,小型Java游戏框架