21xrx.com
2024-11-22 05:46:27 Friday
登录
文章检索 我的文章 写文章
C++游戏编程: 小游戏代码
2023-07-05 12:20:25 深夜i     --     --
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++游戏编程,这个例子可能会给你一些启示,帮助你理解如何思考和设计一个实际的游戏。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复