幸存者游戏(类)

#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;

}

相关推荐
许泽宇的技术分享5 小时前
Windows桌面自动化的革命性突破:深度解析Windows-MCP.Net Desktop模块的技术奥秘
windows·自动化·.net
NRatel8 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
七仔的博客13 小时前
【摸鱼办公神器】七仔的桌面工具超进化 -> 灵卡面板 v1.1.9
windows·神器·摸鱼
人工干智能13 小时前
pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?
python·游戏·计算机外设·pygame
码农阿豪13 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
CC__xy21 小时前
demo 通讯录 + 城市选择器 (字母索引左右联动 ListItemGroup+AlphabetIndexer)笔记
windows
EanoJiang1 天前
类蜘蛛侠+刺客信条暗杀动作系统开发日志
游戏
★YUI★1 天前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
谷宇.1 天前
【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
游戏·unity·c#·游戏程序·unity3d·游戏开发·游戏编程
LZQqqqqo1 天前
C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
windows·c#·list