提瓦特幸存者2


能帮到你的话,就给个赞吧 😘


#include <iostream>
#include <windows.h>
#include <string>
#include <graphics.h>
#include <vector>
#pragma comment(lib, "MSIMG32.LIB")class Animation {
private:std::vector<IMAGE*> imgs;int imgIndex = 0;int frameInterval = 0;								//帧间隔: 两帧图片间的时间int timer = 0;										//计时器: 图片播放的时间public:Animation(LPCTSTR path, int num, int frameInterval);//LPCSTR 更通用的常字符指针~Animation();
public:void play(int x, int y, int time);					//time :此次播放的时间
};class Player {
private:	POINT playerPos{ 500,500 };							//玩家位置const int playerSpeed = 6;							//移动速度bool isLeft = false, isRight = false,				//移动方向isUp = false, isDown = false;					bool isFacingLeft = false;							//面部朝向const int playerWidth = 80;							//玩家高度const int playerHeight = 80;const int shadowWidth = 32;							//玩家阴影高度private:IMAGE playerShadow;Animation* animationPlayerLeft;						//玩家动画Animation* animationPlayerRight;
public:Player();~Player();
public:void processMessage(const ExMessage& msg);void move();void draw(int frameInterval);
public:int x() const { return playerPos.x; }int y() const { return playerPos.y; }
};class Enemy {
private:POINT enemyPos{ 0,0 };								//敌人位置const int enemySpeed = 2;							//移动速度bool isLeft = false, isRight = false,				//移动方向isUp = false, isDown = false;					bool isFacingLeft = false;							//面部朝向const int enemyWidth = 80;							//敌人高度const int enemyHeight = 80;const int shadowWidth = 48;							//敌人阴影高度private:IMAGE enemyShadow;Animation* animationEnemyLeft;						//敌人动画Animation* animationEnemyRight;
public:Enemy();~Enemy();
public:	void move(const Player& player);void draw(int frameInterval);
};void putImageAlpha(int x, int y, IMAGE* img);			//图像绘制(透明度)
void generateEnemy(std::vector<Enemy*>& enemys);const int windowWidth = 1280;
const int windowHeight = 720;
const int frameInterval = 1000 / 120;int main() {initgraph(windowWidth, windowHeight);	Player player;std::vector<Enemy*> enemys;IMAGE background;	ExMessage message;bool running = true;loadimage(&background, _T("resources/img/background.png"));BeginBatchDraw();while (running) {ULONGLONG startTime = GetTickCount64();//读数据peekmessage(&message);//处理数据	player.processMessage(message);player.move();generateEnemy(enemys);for (auto& enemy : enemys)enemy->move(player);//渲染cleardevice();putimage(0, 0, &background);player.draw(frameInterval);for (auto& enemy : enemys)enemy->draw(frameInterval);FlushBatchDraw();//120刷新ULONGLONG executionTime = GetTickCount64() - startTime;if (executionTime < frameInterval)Sleep(frameInterval - executionTime);}
}Player::Player(){loadimage(&playerShadow, _T("resources/img/shadow_player.png"));animationPlayerLeft = new Animation(_T("resources/img/player_left_%d.png"), 6, 45);animationPlayerRight = new Animation(_T("resources/img/player_right_%d.png"), 6, 45);
}Player::~Player(){delete animationPlayerLeft;delete animationPlayerRight;
}void Player::processMessage(const ExMessage& msg){//判断移动方向if (msg.message == WM_KEYDOWN) {switch (msg.vkcode) {case VK_UP:isUp = true;break;case VK_DOWN:isDown = true;break;case VK_LEFT:isLeft = true;break;case VK_RIGHT:isRight = true;break;default:break;}}else if (msg.message == WM_KEYUP) {switch (msg.vkcode) {case VK_UP:isUp = false;break;case VK_DOWN:isDown = false;break;case VK_LEFT:isLeft = false;break;case VK_RIGHT:isRight = false;break;default:break;}}
}//计算移动信息
void Player::move(){// x,y 代表 向量int x = isRight - isLeft;int y = isDown - isUp;double modulus = sqrt(x * x + y * y);	//向量的模if (modulus) {double vectorX = x / modulus;double vectorY = y / modulus;playerPos.x += int(playerSpeed * vectorX);playerPos.y += int(playerSpeed * vectorY);}//校准if (playerPos.x < 0)	playerPos.x = 0;if (playerPos.y < 0)	playerPos.y = 0;if (playerPos.x + playerWidth > windowWidth)	playerPos.x = windowWidth - playerWidth;if (playerPos.y + playerHeight > windowHeight)	playerPos.y = windowHeight - playerHeight;//修改面部朝向//等于0时,指向原先面部朝向if (x > 0)isFacingLeft = false;else if (x < 0)isFacingLeft = true;}void Player::draw(int frameInterval){//绘制阴影int xShadow = playerPos.x + (playerWidth - shadowWidth) / 2;int yShadow = playerPos.y + playerHeight - 8;putImageAlpha(xShadow, yShadow, &playerShadow);//绘制动画if (isFacingLeft)animationPlayerLeft->play(playerPos.x, playerPos.y, frameInterval);elseanimationPlayerRight->play(playerPos.x, playerPos.y, frameInterval);
}Enemy::Enemy(){loadimage(&enemyShadow, _T("resources/img/shadow_enemy.png"));animationEnemyLeft = new Animation(_T("resources/img/enemy_left_%d.png"), 6, 45);animationEnemyRight = new Animation(_T("resources/img/enemy_right_%d.png"), 6, 45);enum spawnEdge { up, down, left, right };spawnEdge edge = spawnEdge(rand() % 4);switch (edge){case up:enemyPos.x = rand() % windowWidth;enemyPos.y = -enemyHeight;break;case down:enemyPos.x = rand() % windowWidth;enemyPos.y = windowHeight;break;case left:enemyPos.x = -enemyWidth ;enemyPos.y = rand() % windowHeight;break;case right:enemyPos.x = windowWidth;enemyPos.y = rand() % windowHeight;break;default:break;}}Enemy::~Enemy(){delete animationEnemyLeft;delete animationEnemyRight;
}void Enemy::move(const Player& player){//怪物向玩家移动int x = player.x() - enemyPos.x;int y = player.y() - enemyPos.y;double modulus = sqrt(x * x + y * y);	//向量的模if (modulus) {double vectorX = x / modulus;double vectorY = y / modulus;enemyPos.x += int(enemySpeed * vectorX);enemyPos.y += int(enemySpeed * vectorY);}//修改面部朝向if (x > 0)isFacingLeft = false;else if(x < 0)isFacingLeft = true;
}void Enemy::draw(int frameInterval){//绘制阴影int x = enemyPos.x + (enemyWidth - shadowWidth) / 2;int y = enemyPos.y + enemyHeight - 35;putImageAlpha(x, y, &enemyShadow);//等于0时,指向原先的面部朝向if (isFacingLeft)animationEnemyLeft->play(enemyPos.x, enemyPos.y, frameInterval);elseanimationEnemyRight->play(enemyPos.x, enemyPos.y, frameInterval);
}void putImageAlpha(int x, int y, IMAGE* img){int w = img->getwidth();int h = img->getheight();/*AlphaBlend:	Windows GDI+ API,用于图像混合。GetImageHDC(nullptr), x, y, w, h:GetImageHDC(nullptr):获取屏幕x, y, w, h:	屏幕的位置,作为目标区域。(左上角坐标为x,y,宽为w,高为h)GetImageHDC(img), 0, 0, w, h:GetImageHDC(img):获取图像0, 0, w, h:	整个图像,作为源区域。{ AC_SRC_OVER,0,255, AC_SRC_ALPHA }: 将源图像以透明的方式覆盖到目标图像上,透明度由源图像的Alpha通道控制。AC_SRC_OVER:	源图像覆盖目标图像0,255:			参数,此处无作用AC_SRC_ALPHA:	指定源图像的Alpha通道覆盖图像的Alpha通道: 是图像的透明度通道,存储着每个像素的透明度信息*/AlphaBlend(GetImageHDC(nullptr), x, y, w, h, GetImageHDC(img), 0, 0, w, h, { AC_SRC_OVER,0,255, AC_SRC_ALPHA });
}void generateEnemy(std::vector<Enemy*>& enemys){static const int interval = 100;static int timer = 0;if (timer % interval == 0) {auto enemy = new Enemy;enemys.push_back(enemy);}timer++;timer %= interval;
}Animation::Animation(LPCTSTR path, int num, int frameInterval): frameInterval(frameInterval){TCHAR tPath[256];	// TCHAR: 更通用的字符for (int i = 0; i < num; i++) {/*将一个格式化的字符串 写入到 tPath 指向的字符数组中。格式 由 path 字符串模板决定,其中包含一些格式占位符(比如 %d、%s 等)。i 变量的值将用来替换 path 中对应的格式占位符。*/_stprintf_s(tPath, path, i);IMAGE* img = new IMAGE;loadimage(img, tPath);imgs.push_back(img);}
}Animation::~Animation(){for (int i = 0; i < imgs.size(); i++)delete imgs[i];
}void Animation::play(int x, int y, int time){putImageAlpha(x, y, imgs[imgIndex]);timer += time;				//此次图片播放的时间if (timer > frameInterval) {imgIndex++;timer = 0;}imgIndex %= imgs.size();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4926.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

为什么说PPQ对于FPGA的神经网络的量化来说是神?

这几天踩了无数坑把PPQ走通了&#xff0c;把自己搭的一个网络实现了完美量化&#xff0c;测试结果也可以正常分类。看到结果终于明白为什么说PPQ对于FPGA的神经网络的量化来说是神了 虔诚地放出链接&#xff1a; OpenPPL/ppq PS&#xff1a;这辈子要是能去商汤就好了…… 一、 …

VMWareTools安装及文件无法拖拽解决方案

文章目录 1 安装VMWare Tools2 安装vmware tools之后还是无法拖拽文件解决方案2.1 确认vmware tools安装2.2 客户机隔离2.3 修改自定义配置文件2.4 安装open-vm-tools-desktop软件 1 安装VMWare Tools 打开虚拟机VMware Workstation&#xff0c;启动Ubuntu系统&#xff0c;菜单…

【TabBar嵌套Navigation案例-常见问题按钮-WebView-加载本地html文件 Objective-C语言】

一、接下来,我们来说,webView如何加载本地的html文件 1.把这里的http://www.baidu.com/ 如何替换成本地的html文件,实际上,我们只需要把URL替换一下就可以了, 然后呢,先给大家看一眼素材,在我们的help.json里边,比如说,第一个按钮, 如何领奖,这块儿有一个叫做htm…

pwn:[NISACTF 2022]ReorPwn?

题目 解题 附件下载 在kali里打开 执行checksec命令&#xff0c;查看控制程序的命令 64位 用ida64位版本打开 打开页面显示如下 发现关键函数system() 双击system(a) 显示如下 需要知道command是怎么传入的 通过原始的数据可以知道 gets函数获取参数a&#xff0c;即用户输入…

诗林工作室(编号:mb0005)分享:HTML模版Paxton,一款自适应响应式图集、博客设计开发模板

这是来自国外一款HTML网页模板&#xff0c;适合Web开发人员做前端站点设计参考使用。全站模版倾向于图集、博客等多行业的平台模版开发。此模版适合各大CMS的主题模版开发参考&#xff0c;如常见的Wordpress主题开发、Z-Blog模板开发、Typecho模板开发、DiscuzX模板开发、Jooml…

JavaScript缓存之Service Worker workbox

目录 先来看看基础Service Worker 注册阶段 安装和激活 workbox workbox-webpack-plugin 来看看结果 这次再做组件的库模式打包之后想着优化js加载&#xff0c;于是想到了大家用的并不是很多的Service Worker技术&#xff0c;这个技术类似于原生的离线包能力 先来看看基…

Html编写发射粒子爱心

下载html文件&#xff1a;https://download.csdn.net/download/m0_58419490/89963280 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>&#x1f497;</title>…

什么是分布式光伏发电?设备构成、应用形式讲解

分布式光伏发电系统&#xff0c;又称分散式发电或分布式供能&#xff0c;是指在用户现场或靠近用电现场配置较小的光伏发电供电系统&#xff0c;以满足特定用户的需求&#xff0c;支持现存配电网的经济运行&#xff0c;或者同时满足这两个方面的要求。 分布式光伏发电由哪些设备…

新160个crackme - 093-kesan

运行分析 需破解用户名和注册码 PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找不到字符串&#xff0c;根据Delphi程序逻辑&#xff0c;双击进入cls_Unit1_TForm1查找 向下翻找后发现4个事件&#xff0c;逐个分析 动调_TForm1_Edit1Change函数…

OpenAI 的 正式版o1 模型意外泄露,推理能力真是震撼——事情是这样的

序言&#xff1a;无论 OpenAI 出于何种原因&#xff0c;用户的期待和认可都是关键。这次 o1 模型的泄露事件意外引发热议&#xff0c;也让用户有机会一窥 o1 的强大潜力。虽然 OpenAI 已推出 o1-preview 和 o1-mini 供用户试用&#xff0c;性能有所提升&#xff0c;但仍未展现最…

QCon演讲实录|徐广治:边缘云原生操作系统的设计与思考

10月18日&#xff0c;在 QCon 全球软件开发大会 2024&#xff08;上海站&#xff09;&#xff0c;火山引擎边缘云资深架构师徐广治围绕火山引擎边缘计算产品背后的算力底座 - 边缘云原生操作系统&#xff0c;探讨如何实现算力服务的混合部署和跨区域弹性调度&#xff0c;以及在…

「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件

本篇将带你实现一个自定义评分星级组件&#xff0c;用户可以通过点击星星进行评分&#xff0c;并实时显示评分结果。为了让界面更具吸引力&#xff0c;我们还将添加一只小猫图片作为评分的背景装饰。 关键词 UI互动应用评分系统自定义星级组件状态管理用户交互 一、功能说明 …

MySQL表设计(三大范式 表的设计)

1.上讲约束复习&#xff1a; 1.NOT NULL 非空约束&#xff0c;被指定NOT NULL的列&#xff0c;值不允许为空(必填) 2. UNIQUE 唯一约束&#xff0c;这个列里的值在表中是唯一的&#xff0c;也就是说不能重复 3. PRIMARY KEY 主键约束&#xff0c;可以看做是NOT NULL和UNIQUE…

继承机制深度解析:从基础到进阶的完整指南

文章目录 1. 继承的概念及定义1.1 继承的概念&#xff1a;1.2继承的定义&#xff1a;1.2.1 定义格式1.2.2 继承基类成员访问方式的变化&#xff1a; 1.3继续类模板 2. 基类和派生类间的转换2.1 向上转换&#xff08;Upcasting&#xff09;2.2 向下转换&#xff08;Downcasting&…

C++(类和对象-友元)

友元的作用 作用&#xff1a; 在C中&#xff0c;友元&#xff08;friend&#xff09;是一种特殊的类成员&#xff0c;它可以让一个函数或者类访问其他类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员。 注意&#xff1a; 友元的使用应该谨…

ssm045基于jsp的精品酒销售管理系统+jsp(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 精品酒销售管理系统 学 院 专 业 班 级 学 号 用户姓名 指导教师 完成日期…

解决return code from pthread_create() is 22报错问题

今天在处理芯片数据&#xff0c;在使用rma方法对数据进行预处理时报错&#xff0c;试了非常多的方法&#xff0c;记录一下。 可能时rma函数会涉及调用多线程的操作&#xff0c;这一过程会产生冲突。此错误表示在规范化过程中创建新线程时出现问题&#xff0c;特别是与 pthread_…

ChatPaper.ai - 3分钟读懂一篇论文的AI阅读助手

你是否曾经面对过这些困扰&#xff1f; 堆积如山的论文&#xff0c;不知从何读起 课堂笔记零零散散&#xff0c;复习时一头雾水 会议记录不完整&#xff0c;重要信息错过了 ChatPaper.ai就是为解决这些问题而生的智能助手。 地址&#xff1a;https://www.chatpaper.ai/zh …

0基础入门linux文件系统

目录 文件系统简介 1. 文件系统类型 2. 文件系统结构 3. 文件系统的主要功能 4. 文件系统的使用 5. 文件系统的维护 6. 注意事项 简单举例 机械硬盘 物理结构介绍​编辑 CHS寻址 逻辑结构介绍 LBA寻址法 文件系统与磁盘管理 Boot Block Data block inode block…

【docker入门】docker的安装

目录 Centos 7 添加docker 官方仓库到yum源 将 Docker 的官方镜像源替换为国内可以的 Docker 镜像源 安装docker 配置docker加速源 Ubuntu 创建 gpg key 目录 下载 gpg key 添加国内可用镜像源到 系统的 APT 仓库中 安装docker 配置加速源 Centos 7 添加docker 官方仓…