21xrx.com
2025-03-31 01:10:21 Monday
文章检索 我的文章 写文章
C++游戏编程: 小游戏代码
2023-06-25 05:31:59 深夜i     13     0
C++编程 游戏开发 小游戏 代码实现 游戏引擎

C++游戏编程是一门非常有趣和有挑战性的技能,不仅可以让你创造出自己喜欢的游戏,还可以帮助你进一步提升你的编程能力。今天,我们将分享一段简单的C++小游戏代码,帮助各位初学者了解一些基本的概念和技术。

在这个小游戏中,我们将使用C++和SDL库来创造一个简单的“打飞机”游戏。让我们来看看游戏中的一些基本元素:

1. 玩家:玩家是游戏中的控制者,通过键盘控制飞机来躲避敌人的攻击。

2. 敌人:敌人是游戏中的挑战,它们会从屏幕上方不断向下移动,并向玩家的飞机发射导弹。

3. 子弹:玩家可以向敌人发射子弹。

那么,让我们来看一下C++的代码:

首先,我们需要包含SDL的头文件:

#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"

然后,我们需要定义一些常量来控制游戏中的元素:

// 屏幕相关
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_FPS = 60;
const int SCREEN_TICKS_PER_FRAME = 1000 / SCREEN_FPS;
// 玩家相关
const int PLAYER_WIDTH = 60;
const int PLAYER_HEIGHT = 52;
const float PLAYER_SPEED = 300.0f;
const int PLAYER_BULLET_SPEED = 600;
// 子弹相关
const int PLAYER_BULLET_WIDTH = 9;
const int PLAYER_BULLET_HEIGHT = 25;
// 敌人相关
const int ENEMY_WIDTH = 35;
const int ENEMY_HEIGHT = 30;
const float ENEMY_SPEED = 250.0f;
const int ENEMY_BULLET_SPEED = 300;

接下来,我们需要创建一些类来表示游戏中的元素。这里我们需要创建一个“精灵”类来表示屏幕上的每个物体:

class Sprite {
public:
  Sprite();
  virtual ~Sprite();
  void SetTexture(SDL_Texture* texture);
  virtual bool Load(char* filename);
  virtual void Render(SDL_Renderer* renderer);
  void SetPosition(float x, float y);
  void SetPosition(Vector2 pos);
  void SetSize(int width, int height);
  SDL_Rect GetRect();
protected:
  SDL_Texture* m_texture;
  SDL_Rect m_rect;
};
class Vector2 {
public:
  float x;
  float y;
  Vector2(float x, float y);
};

然后,我们需要创建一个玩家类和一个敌人类:

class Player : public Sprite {
public:
  Player();
  bool Load(char* filename);
  void Update(float deltaTime);
  void MoveLeft(float deltaTime);
  void MoveRight(float deltaTime);
  void MoveUp(float deltaTime);
  void MoveDown(float deltaTime);
  void Shoot(SDL_Renderer* renderer);
};
class Enemy : public Sprite {
public:
  Enemy();
  bool Load(char* filename);
  void Update(float deltaTime);
  SDL_Rect GetBulletRect(int index);
  void Shoot(SDL_Renderer* renderer, Vector2 target);
};

现在我们可以开始实现主函数了。我们需要充分利用SDL提供的函数来处理屏幕绘制、事件处理以及时间管理:

int main(int argc, char* argv[]) {
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
  SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  SDL_Surface* surface = IMG_Load("bg.jpg");
  SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
  SDL_Event e;
  bool quit = false;
  Player player;
  player.Load("player.png");
  Vector2 playerPosition(SCREEN_WIDTH / 2 - PLAYER_WIDTH / 2, SCREEN_HEIGHT - PLAYER_HEIGHT - 10);
  player.SetPosition(playerPosition);
  std::vector<Enemy *> enemies;
  while (!quit) {
    int startTicks = SDL_GetTicks();
    while (SDL_PollEvent(&e)) {
      if (e.type == SDL_QUIT)
        quit = true;
       else if (e.type == SDL_KEYDOWN) {
        switch (e.key.keysym.sym) {
          case SDLK_LEFT:
            player.MoveLeft(SCREEN_TICKS_PER_FRAME / 1000.0f);
            break;
          case SDLK_RIGHT:
            player.MoveRight(SCREEN_TICKS_PER_FRAME / 1000.0f);
            break;
          case SDLK_UP:
            player.MoveUp(SCREEN_TICKS_PER_FRAME / 1000.0f);
            break;
          case SDLK_DOWN:
            player.MoveDown(SCREEN_TICKS_PER_FRAME / 1000.0f);
            break;
          case SDLK_SPACE:
            player.Shoot(renderer);
            break;
        }
      }
    }
    // 更新玩家
    player.Update(SCREEN_TICKS_PER_FRAME / 1000.0f);
    // 创建敌人
    if (rand() % 100 < 2) {
      Enemy* enemy = new Enemy();
      enemy->Load("enemy.png");
      Vector2 enemyPosition(rand() % (SCREEN_WIDTH - ENEMY_WIDTH), -ENEMY_HEIGHT);
      enemy->SetPosition(enemyPosition);
      enemies.push_back(enemy);
    }
    // 更新所有敌人
    for (int i = 0; i < enemies.size(); i++) {
      enemies[i]->Update(SCREEN_TICKS_PER_FRAME / 1000.0f);
      enemies[i]->Shoot(renderer, playerPosition);
    }
    // 清除屏幕
    SDL_RenderClear(renderer);
    // 绘制背景
    SDL_RenderCopy(renderer, texture, NULL, NULL);
    // 绘制玩家
    player.Render(renderer);
    // 绘制所有敌人
    for (int i = 0; i < enemies.size(); i++) {
      enemies[i]->Render(renderer);
    }
    // 更新屏幕
    SDL_RenderPresent(renderer);
    int frameTicks = SDL_GetTicks() - startTicks;
    if (frameTicks < SCREEN_TICKS_PER_FRAME) {
      SDL_Delay(SCREEN_TICKS_PER_FRAME - frameTicks);
    }
  }
  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;
}

通过以上代码,我们成功创造了一个简单的“打飞机”小游戏。在这个过程中,我们使用了C++和SDL库来实现游戏中的主要元素,例如玩家、敌人和子弹。如果你初学C++游戏编程,这个例子可能会给你一些启示,帮助你理解如何思考和设计一个实际的游戏。

  
  

评论区

请求出错了