游戏幸存者学习VC源码

#include <ctime>
#include <easyx.h>
#include <list>
#include <stdio.h>
#include "header.h"

// 初始化
void InitGame();
// 绘制
void DrawGame();
// 更新
void UpdateGame();

// 定义武器的对象
struct FWeapon
{
    // 旋转角度
    float angle;
    // 旋转速度
    float speed;
    // 半径
    float radius;
    // 位置
    FVector location;
};

// 定义敌人对象
struct FEnemy
{
    // 移动速度
    float speed;
    // 方向
    int direction;
    // 位置
    FVector location;
    // 动画当前帧
    int current_anim;
};

// 背景图片
IMAGE bg_img;
// 玩家图片
IMAGE player_left[6];
IMAGE player_right[6];
// 定义玩家位置
FVector player_location;
// 定义玩家当前帧
int player_current_anim;
// 定义玩家当前方向
int player_direction;
// 定义玩家速度
float player_speed;

// 定义一个武器链表
std::list<FWeapon> weapon_list;

// 定义敌人图片
IMAGE enemy_left[6];
IMAGE enemy_right[6];
// 定义敌人链表
std::list<FEnemy> enemy_list;

FRectangle weapon_getBoundingBox(FWeapon weapon)
{
    return FRectangle(weapon.location.x - weapon.radius, weapon.location.y - weapon.radius, weapon.radius * 2, weapon.radius * 2);
}

FRectangle enemy_getBoundingBox(FEnemy enemy)
{
    return FRectangle(enemy.location.x, enemy.location.y, enemy_left[0].getwidth(), enemy_left->getheight());
}

int main()
{
    // 初始化随机数种子
    srand(time(NULL));

    initgraph(1280, 720, EX_SHOWCONSOLE);

    float FPS = 1000 / 60;
    InitGame();
    bool is_run = true;
    while (true)
    {
        DWORD start_time = GetCurrentTime();

        if (is_run == true)
        {
            DrawGame();
            UpdateGame();
        }

        DWORD end_time = GetCurrentTime();
        DWORD delay_time = end_time - start_time;

        if (delay_time < FPS)
        {
            Sleep(FPS - delay_time);
        }
    }

    return 0;
}

void InitGame()
{
    // 加载背景图片
    loadimage(&bg_img, TEXT("img/Background.png"));
    // 加载玩家图片
    for (int i = 0; i < 6; i++)
    {
        TCHAR player_left_path[MAX_PATH] = { 0 };
        TCHAR player_right_path[MAX_PATH] = { 0 };
        wsprintf(player_left_path, TEXT("img/player_left_%d.png"), i);
        wsprintf(player_right_path, TEXT("img/player_right_%d.png"), i);
        loadimage(&player_left[i], player_left_path);
        loadimage(&player_right[i], player_right_path);
    }
    // 初始化玩家的位置
    player_location = FVector(500, 500);
    // 初始化玩家当前帧
    player_current_anim = 0;
    // 初始化玩家当前方向
    player_direction = 0;// 0表示左 1表示右
    // 初始化玩家速度
    player_speed = 5;

    // 初始化一个武器
    FWeapon weapon;
    weapon.angle = 0;
    weapon.speed = 5;
    weapon.radius = 20;
    FVector player_center = player_location + FVector(player_left[0].getwidth() * 0.5, player_left[0].getheight() * 0.5);
    weapon.location = rotatePoint(FVector(player_center.x, player_center.y - 100), player_center, weapon.angle);
    weapon_list.push_back(weapon);

    // 加载敌人图片
    for (int i = 0; i < 6; i++)
    {
        TCHAR enemy_left_path[MAX_PATH] = { 0 };
        TCHAR enemy_right_path[MAX_PATH] = { 0 };
        wsprintf(enemy_left_path, TEXT("img/enemy_left_%d.png"), i);
        wsprintf(enemy_right_path, TEXT("img/enemy_right_%d.png"), i);
        loadimage(&enemy_left[i], enemy_left_path);
        loadimage(&enemy_right[i], enemy_right_path);
    }

    // 初始化敌人
    for (int i = 0; i < 10; i++)
    {
        FEnemy enemy;
        enemy.speed = 2;
        enemy.direction = 0;
        enemy.location.x = rand() % 1280;
        enemy.location.y = rand() % 720;
        enemy.current_anim = 0;
        enemy_list.push_back(enemy);
    }
}

void DrawGame()
{
    BeginBatchDraw();

    // 输出背景图片
    putimage(0, 0, &bg_img);
    // 输出玩家图片
    if (player_direction == 0)putimage_alpha(player_location.x, player_location.y, &player_left[player_current_anim]);
    else putimage_alpha(player_location.x, player_location.y, &player_right[player_current_anim]);

    // 输出武器
    setfillcolor(RED);
    for (FWeapon weapon : weapon_list)
        fillcircle(weapon.location.x, weapon.location.y, weapon.radius);

    // 显示敌人
    for (FEnemy enemy : enemy_list)
    {
        if (enemy.direction == 0)putimage_alpha(enemy.location.x, enemy.location.y, &enemy_left[enemy.current_anim]);
        else putimage_alpha(enemy.location.x, enemy.location.y, &enemy_right[enemy.current_anim]);
    }

    EndBatchDraw();
}

void UpdateGame()
{
    // 玩家的动画
    player_current_anim++;
    if (player_current_anim >= 6)
        player_current_anim = 0;
    // 敌人的动画
    for (FEnemy& enemy : enemy_list)
    {
        enemy.current_anim++;
        if (enemy.current_anim >= 6)
            enemy.current_anim = 0;
    }

    // 玩家的移动
    if (GetAsyncKeyState('W'))player_location.y -= player_speed;
    if (GetAsyncKeyState('S'))player_location.y += player_speed;
    if (GetAsyncKeyState('A')) { player_location.x -= player_speed; player_direction = 0; }
    if (GetAsyncKeyState('D')) { player_location.x += player_speed; player_direction = 1; }

    FVector player_center = player_location + FVector(player_left[0].getwidth() * 0.5, player_left[0].getheight() * 0.5);
    // 武器围绕主角旋转
    for (FWeapon& weapon : weapon_list)
    {
        weapon.angle += weapon.speed;
        weapon.location = rotatePoint(FVector(player_center.x, player_center.y - 100), player_center, weapon.angle);
    }

    // 敌人的移动
    for (FEnemy& enemy : enemy_list)
    {
        FVector enemy_center = enemy.location + FVector(enemy_left[0].getwidth() * 0.5, enemy_left[0].getheight() * 0.5);
        FVector enemy_move_direction = FVector::unitization(player_center - enemy_center);
        if (enemy_move_direction.dot(FVector(1, 0)) > 0)enemy.direction = 1;
        else enemy.direction = 0;
        enemy.location += enemy_move_direction * enemy.speed;
    }

    // 攻击敌人
    std::list<FEnemy>::iterator enemy_list_iterator, temp;
    int weapon_num = weapon_list.size();
    for (FWeapon weapon : weapon_list)
    {
        FRectangle weapon_BoundingBox = weapon_getBoundingBox(weapon);
        for (enemy_list_iterator = enemy_list.begin(); enemy_list_iterator != enemy_list.end(); )
        {
            if (weapon_BoundingBox.isOverlay(enemy_getBoundingBox(*enemy_list_iterator)))
            {
                temp = enemy_list_iterator;
                enemy_list_iterator++;
                enemy_list.erase(temp);
                if (weapon_num < 5)
                    weapon_num++;
            }
            else
            {
                enemy_list_iterator++;
            }
        }
    }
    int need_weapon_num = weapon_num - weapon_list.size();
    bool is = false;
    for (int i = 0; i < need_weapon_num; i++)
    {
        FWeapon weapon;
        weapon.angle = 0;
        weapon.speed = 5;
        weapon.radius = 20;
        weapon_list.push_back(weapon);
        is = true;
    }

    if (is)
    {
        int j = 0;
        for (FWeapon& weapon : weapon_list)
        {
            weapon.angle = j * (360 / weapon_list.size());
            FVector player_center = player_location + FVector(player_left[0].getwidth() * 0.5, player_left[0].getheight() * 0.5);
            weapon.location = rotatePoint(FVector(player_center.x, player_center.y - 100), player_center, weapon.angle);
            j++;
        }
    }


    // 补充敌人
    int need_enemy_num = 10 - enemy_list.size();
    for (int i = 0; i < need_enemy_num; i++)
    {
        FEnemy enemy;
        enemy.speed = 2;
        enemy.direction = 0;

        enemy.location.x = (rand() % 2) ? (-rand() % 400) : (1280 + rand() % 400);
        enemy.location.y = (rand() % 2) ? (-rand() % 200) : (720 + rand() % 200);
        enemy.current_anim = 0;
        enemy_list.push_back(enemy);
    }
}

相关推荐

  1. 游戏幸存者学习VC

    2024-03-23 22:52:02       35 阅读
  2. spdlog学习

    2024-03-23 22:52:02       53 阅读
  3. Python小游戏(1)附带

    2024-03-23 22:52:02       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 22:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 22:52:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 22:52:02       82 阅读
  4. Python语言-面向对象

    2024-03-23 22:52:02       91 阅读

热门阅读

  1. 算法——排序

    2024-03-23 22:52:02       48 阅读
  2. 蓝桥杯刷题--python-27--全球变暖-dfs-bfs

    2024-03-23 22:52:02       40 阅读
  3. Zookeeper详解(zk)

    2024-03-23 22:52:02       36 阅读
  4. AndroidStudio开发 相关依赖

    2024-03-23 22:52:02       44 阅读
  5. linux修改ftp上传路径

    2024-03-23 22:52:02       37 阅读
  6. NSURLSessionConfiguration

    2024-03-23 22:52:02       40 阅读
  7. centos7 安装php82

    2024-03-23 22:52:02       41 阅读
  8. 编写人脸检测程序

    2024-03-23 22:52:02       43 阅读
  9. Vue3:编程式路由导航

    2024-03-23 22:52:02       50 阅读