SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_UP:
// 处理向上键按下事件,如角色向上移动
movePlayerUp();
break;
case SDLK_DOWN:
// 处理向下键按下事件
movePlayerDown();
break;
case SDLK_LEFT:
// 处理向左键按下事件
movePlayerLeft();
break;
case SDLK_RIGHT:
// 处理向右键按下事件
movePlayerRight();
break;
default:
break;
}
break;
case SDL_KEYUP:
// 处理按键松开事件
break;
default:
break;
}
}
(二)鼠标输入处理
除了键盘输入,鼠标输入在游戏中也经常被使用,如点击按钮、选择菜单选项等。同样,我们可以在游戏循环中检测鼠标事件,如鼠标移动、点击、松开等,并根据这些事件来执行相应的操作。例如:
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT) {
// 处理鼠标左键按下事件
handleLeftMouseButtonDown(event.button.x, event.button.y);
}
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button == SDL_BUTTON_LEFT) {
// 处理鼠标左键松开事件
handleLeftMouseButtonUp(event.button.x, event.button.y);
}
break;
case SDL_MOUSEMOTION:
// 处理鼠标移动事件
handleMouseMotion(event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
break;
default:
break;
}
}
四、游戏物理模拟
(一)简单物理效果的实现
在游戏中,一些简单的物理效果可以增加游戏的真实感和趣味性。例如,重力效果可以使角色或物体在下落时加速,碰撞检测可以判断两个物体是否发生碰撞并做出相应的反应。以重力效果为例,我们可以在每次游戏循环中更新物体的垂直速度,并根据速度来更新物体的位置:
// 重力加速度
const float GRAVITY = 0.5f;
// 物体的垂直速度
float velocityY = 0.0f;
while (gameRunning) {
// 处理游戏逻辑等
// 更新重力效果
velocityY += GRAVITY;
object.y += velocityY;
// 绘制游戏画面等
}
(二)使用物理引擎
对于更复杂的物理模拟,如真实的物体碰撞、力学效果等,我们可以使用物理引擎,如 Box2D。物理引擎可以大大简化物理模拟的开发过程,它提供了丰富的功能和算法来处理各种物理现象。使用 Box2D 时,我们首先需要创建一个物理世界,然后在物理世界中创建物体、关节等,并设置它们的属性和物理参数。例如:
// 创建物理世界
b2World world(b2Vec2(0.0f, -9.8f)); // 重力向量
// 创建一个地面物体
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0.0f, -10.0f);
b2Body* groundBody = world.CreateBody(&groundBodyDef);
b2PolygonShape groundBox;
groundBox.SetAsBox(50.0f, 10.0f);
groundBody->CreateFixture(&groundBox, 0.0f);
// 创建一个动态物体
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(0.0f, 4.0f);
b2Body* body = world.CreateBody(&bodyDef);
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(1.0f, 1.0f);
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
body->CreateFixture(&fixtureDef);
// 模拟物理世界
float timeStep = 1.0f / 60.0f;
int32 velocityIterations = 6;
int32 positionIterations = 2;
for (int i = 0; i < 60; ++i) {
world.Step(timeStep, velocityIterations, positionIterations);
// 获取物体的位置并更新游戏中的显示位置
b2Vec2 position = body->GetPosition();
// 更新游戏中物体的坐标
}
在上述代码中,我们创建了一个包含重力的物理世界,然后创建了一个地面物体和一个动态物体,并设置了它们的形状、属性等。最后,通过循环调用 world.Step
来模拟物理世界的运动,并获取动态物体的位置来更新游戏中的显示。