2D游戏编程技巧:碰撞检测与2D相机实现
立即解锁
发布时间: 2025-08-24 00:51:21 阅读量: 2 订阅数: 16 


Android游戏开发入门与实践
### 2D游戏编程技巧:碰撞检测与2D相机实现
#### 1. 碰撞检测方法分析
在碰撞检测相关的方法中,会针对不同的情况进行特殊处理。具体如下:
- 第一个`if`语句检查单单元格的情况。
- 第二个`if`语句检查水平双单元格的情况。
- 第三个`if`语句检查垂直双单元格的情况。
- `else`块处理对象重叠四个网格单元格的情况。
在这四个代码块中,都会确保只有当相应的单元格坐标在世界范围内时才设置单元格ID。虽然这个方法看起来需要大量的计算能力,但实际上最常见的情况是第一种,处理起来成本较低。
#### 2. 碰撞检测示例实现
我们通过扩展之前的大炮示例来展示碰撞检测的具体实现。使用`Cannon`对象表示大炮,`DynamicGameObject`对象表示炮弹,多个`GameObject`对象表示目标。每个目标的大小为0.5×0.5米,并随机放置在世界中。
以下是`CollisionScreen`类的代码实现:
```java
class CollisionScreen extends Screen {
final int NUM_TARGETS = 20;
final float WORLD_WIDTH = 9.6f;
final float WORLD_HEIGHT = 4.8f;
GLGraphics glGraphics;
Cannon cannon;
DynamicGameObject ball;
List<GameObject> targets;
SpatialHashGrid grid;
Vertices cannonVertices;
Vertices ballVertices;
Vertices targetVertices;
Vector2 touchPos = new Vector2();
Vector2 gravity = new Vector2(0,-10);
public CollisionScreen(Game game) {
super(game);
glGraphics = ((GLGame)game).getGLGraphics();
cannon = new Cannon(0, 0, 1, 1);
ball = new DynamicGameObject(0, 0, 0.2f, 0.2f);
targets = new ArrayList<GameObject>(NUM_TARGETS);
grid = new SpatialHashGrid(WORLD_WIDTH, WORLD_HEIGHT, 2.5f);
for(int i = 0; i < NUM_TARGETS; i++) {
GameObject target = new GameObject((float)Math.random() * WORLD_WIDTH,
(float)Math.random() * WORLD_HEIGHT,
0.5f, 0.5f);
grid.insertStaticObject(target);
targets.add(target);
}
cannonVertices = new Vertices(glGraphics, 3, 0, false, false);
cannonVertices.setVertices(new float[] { -0.5f, -0.5f,
0.5f, 0.0f,
-0.5f, 0.5f }, 0, 6);
ballVertices = new Vertices(glGraphics, 4, 6, false, false);
ballVertices.setVertices(new float[] { -0.1f, -0.1f,
0.1f, -0.1f,
0.1f, 0.1f,
-0.1f, 0.1f }, 0, 8);
ballVertices.setIndices(new short[] {0, 1, 2, 2, 3, 0}, 0, 6);
targetVertices = new Vertices(glGraphics, 4, 6, false, false);
targetVertices.setVertices(new float[] { -0.25f, -0.25f,
0.25f, -0.25f,
0.25f, 0.25f,
-0.25f, 0.25f }, 0, 8);
targetVertices.setIndices(new short[] {0, 1, 2, 2, 3, 0}, 0, 6);
}
}
```
在构造函数中,我们实例化了世界对象和网格,并将目标作为静态对象添加到空间哈希网格中。
#### 3. 更新方法实现
`update`方法用于处理触摸事件、更新炮弹的位置和进行碰撞检测。具体步骤如下:
1. 获取触摸事件和按键事件。
2. 遍历触摸事件,根据触摸位置更新大炮的角度。
3. 当触摸事件为`TOUCH_UP`时,计算炮弹的速度和初始位置。
4. 更新炮弹的速度和位置,同时更新炮弹边界矩形的位置。
5. 使用`SpatialHashGrid`的`getPotentialColliders`方法获取可能发生碰撞的目标。
6. 遍历可能发生碰撞的目标,检查是否发生重叠,如果重叠则从网格和目标列表中移除该目标。
以下是`update`方法的代码实现:
```java
@Override
public void update(float deltaTime) {
List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
game.getInput().getKeyEvents();
int len = touchEvents.size();
for (int i = 0; i < len; i++) {
TouchEvent event = touchEvents.get(i);
touchPos.x = (event.x / (float) glGraphics.getWidth()) * WORLD_WIDTH;
touchPos.y = (1 - event.y / (float) glGraphics.getHeight()) * WORLD_HEIGHT;
cannon.angle = touchPos.sub(cannon.position).angle();
if(event.type == TouchEvent.TOUCH_UP) {
float radians = cannon.angle * Vector2.TO_RADIA
```
0
0
复制全文
相关推荐








