当前位置: 首页 > news >正文

幸存者游戏(类)

#include <iostream>
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
#include <string>
using namespace std;

int idx_player_anim = 0;
const int player_anim_num = 6;//这里要把动画帧数定位const int才能放入数组括号中,int不行
IMAGE img_player_left[player_anim_num];
IMAGE img_player_right[player_anim_num];
POINT player_pos = { 500,500 };
int player_speed = 10;

#pragma comment(lib,"MSIMG32.LIB")//putimage不能处理透明度,要弄个能处理透明度的putimage函数
inline void putimage_alpha(int x, int y, IMAGE* img)
{
    int w = img->getwidth();
    int h = img->getheight();
    AlphaBlend(GetImageHDC(NULL), x, y, w, h, GetImageHDC(img), 0, 0, w, h, { AC_SRC_OVER,0,255,AC_SRC_ALPHA });
}


class Animation
{
public:
    Animation(LPCTSTR path, int num, int interval)//构造函数实现loadimage
    {
        interval_ms = interval;

        TCHAR path_file[256];
        for (size_t i = 0; i < num; i++)
        {
            _stprintf_s(path_file, path, i);
            IMAGE* frame = new IMAGE();
            loadimage(frame, path_file);
            frame_list.push_back(frame);
        }
    }
    ~Animation()
    {
        for (size_t i = 0; i < frame_list.size(); i++)
            delete frame_list[i];
    }
    void play(int x, int y, int delta)//实现putiamge
    {
        timer += delta;
        if (timer > interval_ms)
        {
            idx_frame = (idx_frame + 1) % player_anim_num;
            timer = 0;
        }
        putimage_alpha(x, y, frame_list[idx_frame]);
    }
private:
    int timer = 0;
    int idx_frame = 0;
    int interval_ms = 0;
    vector<IMAGE*> frame_list;
};//别漏;
Animation anim_left_player(_T("img/player_left_%d.png"), 6, 45);
Animation anim_right_player(_T("img/player_right_%d.png"), 6, 45);


int main()
{
    initgraph(1280, 720);
    IMAGE img_background;
    loadimage(&img_background, _T("img/background.png"));
    

    bool running = true;
    bool is_up = false;
    bool is_down = false;
    bool is_left = false;
    bool is_right = false;
    bool turn_left = true;
    bool turn_right = false;

    ExMessage msg;
    BeginBatchDraw();
    while (running)
    {
        DWORD start_time = GetTickCount();
        while (peekmessage(&msg))
        {
            if (msg.message == WM_KEYDOWN)
            {
                switch (msg.vkcode)
                {
                case VK_UP:
                    is_up = true;
                    break;
                case VK_DOWN:
                    is_down = true;
                    break;
                case VK_LEFT:
                    is_left = true;
                    turn_left = true;
                    turn_right = false;
                    break;
                case VK_RIGHT:
                    is_right = true;
                    turn_left = false;
                    turn_right = true;
                    break;
                }
            }
            if (msg.message == WM_KEYUP)
            {
                switch (msg.vkcode)
                {
                case VK_UP:
                    is_up = false;
                    break;
                case VK_DOWN:
                    is_down = false;
                    break;
                case VK_LEFT:
                    is_left = false;
                    break;
                case VK_RIGHT:
                    is_right = false;
                    break;
                }
            }
        }
        if (is_up) player_pos.y -= player_speed;
        if (is_down) player_pos.y += player_speed;
        if (is_left) player_pos.x -= player_speed;
        if (is_right) player_pos.x += player_speed;

        cleardevice();

        static int counter = 0;
        if (++counter % 5 == 0)
            idx_player_anim++;
        idx_player_anim = idx_player_anim % player_anim_num;
        putimage_alpha(0, 0, &img_background);
        if(turn_left) anim_left_player.play(player_pos.x, player_pos.y, 10);
        if(turn_right)anim_right_player.play(player_pos.x, player_pos.y, 10);
        

        FlushBatchDraw();

        DWORD end_time = GetTickCount();
        DWORD delta_time = end_time - start_time;
        if (delta_time < 1000 / 144)
        {
            Sleep(1000 / 144 - delta_time);
        }
    }
    EndBatchDraw();

    return 0;
}

http://www.lryc.cn/news/458587.html

相关文章:

  • SQL 中UPDATE 和 DELETE 语句的深入理解与应用
  • 在 Windows 上查找和结束占用特定端口占用程序,并杀死
  • sql server尽量避免滥用影响性能的标量函数
  • python画图|二维动态柱状图输出
  • CocosCreator 快速部署 TON 游戏:Web2 游戏如何使用 Ton支付
  • 生信初学者教程(二十八):单细胞数据标准化
  • 【OceanBase诊断调优】—— 错误码 5065 和 5066 的区别
  • Spring Boot RESTful API开发教程
  • <Rust>iced库(0.13.1)学习之番外:如何为窗口添加初始值?
  • Redis:list类型
  • 政府采购方式有哪些,竞争性谈判和竞争性磋商的区别
  • 【JavaScript】移动色块案例 实现一个可以拖动并且在拖动过程中会自动改变颜色的色块(JS 事件监听器)
  • [Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制
  • 【中短文】区分神经网络中 表征特征、潜层特征、低秩 概念
  • MySQL8.0环境部署+Navicat17激活教程
  • 每日读则推(十)——Elon Musk‘s speech on self-driving at Tesla‘s annual meeting
  • C++新特性——外部模板
  • 字节跳动青训营开始报名了!
  • 从SQL Server过渡到PostgreSQL:理解模式的差异
  • 刷题 排序算法
  • 【python3】tornado高性能编程
  • 构建高效购物推荐系统:SpringBoot实战
  • docker tar包安装 docker-26.1.4.tgz
  • Github 2024-10-12 Rust开源项目日报 Top10
  • Spring Cloud 微服务架构及其应用:设计、实现与优化
  • Rider + xmake DX12 开发环境
  • 控制台java原生工具打包jar文件
  • MySQL主从同步
  • ansible 学习之变量
  • 【知识科普】Markdown语法内容看这一篇就够了