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

植物明星大乱斗3


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


文章目录

  • util.h
  • util.cpp
  • main
  • animation.h
  • animation.cpp

文件太多,仅更新 更新的内容

util.h

#pragma once
#include <graphics.h>void flipImage(IMAGE* src, IMAGE* dst);void putImageAlpha(int x, int y, IMAGE* img);		//图像绘制(透明度)

util.cpp

#include "util.h"
#pragma comment(lib, "MSIMG32.LIB")		//AlphaBlendvoid flipImage(IMAGE* src, IMAGE* dst){int height = src->getheight();int width = src->getwidth();Resize(dst, width, height);auto srcPixels = GetImageBuffer(src);auto dstPixels = GetImageBuffer(dst);for (int h = 0; h < height; h++)for (int w = 0; w < width; w++)dstPixels[h * width + w] = srcPixels[h * width + width - 1 - w];
}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 });
}

main

#include <Windows.h>		//windows要放在graphics之前
#include <graphics.h>
#include "menuScene.h"
#include "gameScene.h"
#include "selectorScene.h"
#include "sceneManager.h"
#include "util.h"
#include "atlas.h"#include <thread>
#include <chrono>#pragma comment(lib, "Winmm.lib")	//mciSendStringIMAGE	imgMenuBackground;IMAGE	imgVs;										//艺术字IMAGE	img1P;										//文本
IMAGE	img2P;
IMAGE	img1PDesc;									//描述
IMAGE	img2PDesc;IMAGE	imgGraveStoneLeft;							//向左墓碑
IMAGE	imgGraveStoneRight;
IMAGE	imgSelectorTip;								//选择提示
IMAGE	imgSelectorBackground;IMAGE	img1PSelectorButtonLeftIdle;				//1P向左选择按钮默认
IMAGE	img1PSelectorButtonRightIdle;
IMAGE	img1PSelectorButtonLeftDown;
IMAGE	img1PSelectorButtonRightDown;				//1P向左选择按钮按下IMAGE	img2PSelectorButtonLeftIdle;
IMAGE	img2PSelectorButtonRightIdle;
IMAGE	img2PSelectorButtonLeftDown;
IMAGE	img2PSelectorButtonRightDown;IMAGE	imgPeaShooterSelectorLeftBackground;		//豌豆向左选择界面
IMAGE	imgPeaShooterSelectorRightBackground;
IMAGE	imgSunFlowerSelectorLeftBackground;			//向日葵向左选择界面
IMAGE	imgSunFlowerSelectorRightBackground;IMAGE	imgSky;										//天空
IMAGE	imgHills;									//山脉
IMAGE	imgLargePlatform;							//平台
IMAGE	imgSmallPlatform;IMAGE	img1PCursor;
IMAGE	img2PCursor;Atlas	atlasPeaShooterIdleLeft;					//豌豆向左
Atlas	atlasPeaShooterIdleRight;
Atlas	atlasPeaShooterRunLeft;
Atlas	atlasPeaShooterRunRight;
Atlas	atlasPeaShooterAttackExLeft;				//豌豆向左特殊攻击
Atlas	atlasPeaShooterAttackExRight;
Atlas	atlasPeaShooterDieLeft;						//向左死亡
Atlas	atlasPeaShooterDieRight;Atlas	atlasSunFlowerIdleLeft;				//向日葵
Atlas	atlasSunFlowerIdleRight;
Atlas	atlasSunFlowerRunLeft;
Atlas	atlasSunFlowerRunRight;
Atlas	atlasSunFlowerAttackExLeft;
Atlas	atlasSunFlowerAttackExRight;
Atlas	atlasSunFlowerDieLeft;
Atlas	atlasSunFlowerDieRight;IMAGE	imgPea;								//豌豆
Atlas	atlasPeaBreak;
Atlas	atlasSun;
Atlas	atlasSunExplode;					//太阳爆炸
Atlas	atlasSunEX;							//特殊动画
Atlas	atlasSunEXExplode;					//特殊爆炸
Atlas	atlasSunText;						//文本动画Atlas	atlasRunEffect;						//奔跑特效
Atlas	atlasJumpEffect;
Atlas	atlasLandEffect;IMAGE	img1PWinner;						//1P获胜文本
IMAGE	img2PWinner;
IMAGE	imgWinnerBar;						//获胜背景IMAGE	imgPeaShooterAvatar;				//豌豆头像
IMAGE	imgSunFlowerAvatar;					//向日葵头像//场景与场景管理器互相引用
Scene* menuScene = new MenuScene;
Scene* gameScene = new GameScene;
Scene* selectorScene = new SelectorScene;SceneManager sceneManager;void flipAtlas(Atlas& src, Atlas& dst) {dst.clear();for (int i = 0; i < src.getSize(); i++) {IMAGE img;flipImage(src.getImage(i), &img);dst.addImage(img);}}void loadResources() {//加载字体//将 IPix.ttf" 加载到系统字体中,并将其设置为私有字体。AddFontResourceEx(_T("resources/IPix.ttf"), FR_PRIVATE, nullptr);//加载图片loadimage(&imgVs, _T("resources/VS.png"));loadimage(&img1P, _T("resources/1P.png"));loadimage(&img2P, _T("resources/2P.png"));loadimage(&img1PDesc, _T("resources/1P_desc.png"));loadimage(&img2PDesc, _T("resources/2P_desc.png"));loadimage(&imgGraveStoneRight, _T("resources/gravestone.png"));flipImage(&imgGraveStoneRight, &imgGraveStoneLeft);loadimage(&imgSelectorTip, _T("resources/selector_tip.png"));loadimage(&imgSelectorBackground, _T("resources/selector_background.png"));loadimage(&img1PSelectorButtonRightIdle, _T("resources/1P_selector_btn_idle.png"));flipImage(&img1PSelectorButtonRightIdle, &img1PSelectorButtonLeftIdle);loadimage(&img1PSelectorButtonRightDown, _T("resources/1P_selector_btn_down.png"));flipImage(&img1PSelectorButtonRightDown, &img1PSelectorButtonLeftDown);loadimage(&img2PSelectorButtonRightIdle, _T("resources/2P_selector_btn_idle.png"));flipImage(&img2PSelectorButtonRightIdle, &img2PSelectorButtonLeftIdle);loadimage(&img2PSelectorButtonRightDown, _T("resources/2P_selector_btn_down.png"));flipImage(&img2PSelectorButtonRightDown, &img2PSelectorButtonLeftDown);loadimage(&imgPeaShooterSelectorRightBackground, _T("resources/peashooter_selector_background.png"));flipImage(&imgPeaShooterSelectorRightBackground, &imgPeaShooterSelectorLeftBackground);loadimage(&imgSunFlowerSelectorRightBackground, _T("resources/sunflower_selector_background.png"));flipImage(&imgSunFlowerSelectorRightBackground, &imgSunFlowerSelectorLeftBackground);loadimage(&imgSky, _T("resources/sky.png"));loadimage(&imgHills, _T("resources/hills.png"));loadimage(&imgLargePlatform, _T("resources/platform_large.png"));loadimage(&imgSmallPlatform, _T("resources/platform_small.png"));loadimage(&img1PCursor, _T("resources/1P_cursor.png"));loadimage(&img2PCursor, _T("resources/2P_cursor.png"));atlasPeaShooterIdleRight.loadImages(_T("resources/peashooter_idle_%d.png"), 9);flipAtlas(atlasPeaShooterIdleRight, atlasPeaShooterIdleLeft);atlasPeaShooterRunRight.loadImages(_T("resources/peashooter_run_%d.png"), 5);flipAtlas(atlasPeaShooterRunRight, atlasPeaShooterRunLeft);atlasPeaShooterAttackExRight.loadImages(_T("resources/peashooter_attack_ex_%d.png"), 3);flipAtlas(atlasPeaShooterAttackExRight, atlasPeaShooterAttackExLeft);atlasPeaShooterDieRight.loadImages(_T("resources/peashooter_die_%d.png"), 4);flipAtlas(atlasPeaShooterDieRight, atlasPeaShooterDieLeft);atlasSunFlowerIdleRight.loadImages(_T("resources/sunflower_idle_%d.png"), 8);flipAtlas(atlasSunFlowerIdleRight, atlasSunFlowerIdleLeft);atlasSunFlowerRunRight.loadImages(_T("resources/sunflower_run_%d.png"), 5);flipAtlas(atlasSunFlowerRunRight, atlasSunFlowerRunLeft);atlasSunFlowerAttackExRight.loadImages(_T("resources/sunflower_attack_ex_%d.png"), 9);flipAtlas(atlasSunFlowerAttackExRight, atlasSunFlowerAttackExLeft);atlasSunFlowerDieRight.loadImages(_T("resources/sunflower_die_%d.png"), 2);flipAtlas(atlasSunFlowerDieRight, atlasSunFlowerDieLeft);loadimage(&imgPea, _T("resources/pea.png"));atlasSunFlowerIdleRight.loadImages(_T("resources/pea_break_%d.png"), 3);atlasSunFlowerIdleRight.loadImages(_T("resources/sun_%d.png"), 5);atlasSunFlowerIdleRight.loadImages(_T("resources/sun_explode_%d.png"), 5);atlasSunFlowerIdleRight.loadImages(_T("resources/sun_ex_%d.png"), 5);atlasSunFlowerIdleRight.loadImages(_T("resources/sun_ex_explode_%d.png"), 5);atlasSunFlowerIdleRight.loadImages(_T("resources/sun_text_%d.png"), 6);atlasRunEffect.loadImages(_T("resources/run_effect_%d.png"), 4);atlasJumpEffect.loadImages(_T("resources/jump_effect_%d.png"), 5);atlasLandEffect.loadImages(_T("resources/land_effect_%d.png"), 2);loadimage(&img1PWinner, _T("resources/1P_winner.png"));loadimage(&img2PWinner, _T("resources/2P_winner.png"));loadimage(&imgWinnerBar, _T("resources/winnner_bar.png"));loadimage(&imgPeaShooterAvatar, _T("resources/avatar_peashooter.png"));loadimage(&imgSunFlowerAvatar, _T("resources/avatar_sunflower.png"));
//加载音乐mciSendString(_T("open resources/bgm_game.mp3 alias bgmGame"), nullptr, 0, nullptr);mciSendString(_T("open resources/bgm_menu.mp3 alias bgmMenu"), nullptr, 0, nullptr);mciSendString(_T("open resources/pea_break_1.mp3 alias peaBreak1"), nullptr, 0, nullptr);mciSendString(_T("open resources/pea_break_2.mp3 alias peaBreak2"), nullptr, 0, nullptr);mciSendString(_T("open resources/pea_break_3.mp3 alias peaBreak3"), nullptr, 0, nullptr);mciSendString(_T("open resources/pea_shoot_1.mp3 alias peaShoot1"), nullptr, 0, nullptr);mciSendString(_T("open resources/pea_shoot_2.mp3 alias peaShoot2"), nullptr, 0, nullptr);mciSendString(_T("open resources/pea_shoot_ex.mp3 alias peaShootEx"), nullptr, 0, nullptr);mciSendString(_T("open resources/sun_explode.mp3 alias sunExplode"), nullptr, 0, nullptr);mciSendString(_T("open resources/sun_explode_ex.mp3 alias sunExplodeEx"), nullptr, 0, nullptr);mciSendString(_T("open resources/sun_text.mp3 alias sunText"), nullptr, 0, nullptr);mciSendString(_T("open resources/ui_confirm.wav alias uiConfirm"), nullptr, 0, nullptr);mciSendString(_T("open resources/ui_switch.wav alias uiSwitch"), nullptr, 0, nullptr);mciSendString(_T("open resources/ui_win.wav alias uiWin"), nullptr, 0, nullptr);
}int main() {loadResources();sceneManager.setCurrentScene(menuScene);	//初始化管理器	ExMessage msg;	const int FPS = 1000 / 1;initgraph(700, 600, EW_SHOWCONSOLE);BeginBatchDraw();while (1) {	//auto startTime = GetTickCount64();//读消息peekmessage(&msg);//处理消息sceneManager.onInput(msg);//更新数据sceneManager.onUpdate();//渲染cleardevice();sceneManager.onDraw();FlushBatchDraw();//hertz/*auto excutionTime = GetTickCount64() - startTime;if (excutionTime < FPS)Sleep(FPS - excutionTime);*///Sleep(1000);std::this_thread::sleep_for(std::chrono::microseconds(100));}EndBatchDraw();//释放资源delete menuScene;delete gameScene;	
}

animation.h

#pragma once
#include <graphics.h>
#include "atlas.h"
#include <functional>class Animation {
public:void update(int playTime);		//更新动画数据void draw(int x, int y);		//渲染
public:void reset();void setAtals(Atlas* atlas);void setIsLoop(bool isLoop);void setInterval(int ms);void setCallback(const std::function<void()>& cb);public:int getFrameIndex();IMAGE* getFrame();bool checkFinish();private:int time = 0;	//计时器int interval;	//帧间隔int index = 0; //帧索引Atlas* atlas;bool isLoop;std::function<void()> callback;
};

animation.cpp

#include "animation.h"
#include "util.h"//增加动画播放的时间
void Animation::update(int playTime){if (time > interval) {time = 0;index++;if (index == atlas->getSize()) {index = isLoop ? 0 : atlas->getSize() - 1;if (!isLoop && callback)callback();}}time += playTime;}void Animation::draw(int x, int y){putImageAlpha(x, y, atlas->getImage(index));
}void Animation::reset(){time = 0;index = 0;
}void Animation::setAtals(Atlas* atlas){this->atlas = atlas;
}void Animation::setIsLoop(bool isLoop){this->isLoop = isLoop;
}void Animation::setInterval(int ms){interval = ms;
}void Animation::setCallback(const std::function<void()>& cb){callback = cb;
}int Animation::getFrameIndex(){return index;
}IMAGE* Animation::getFrame(){return atlas->getImage(index);
}bool Animation::checkFinish(){if (isLoop)return false;return index == atlas->getSize() - 1;
}

http://www.mrgr.cn/news/70095.html

相关文章:

  • Spring 解析xml中的 BeanDefination 大概过程
  • MySQL数据库常用命令大全(完整版——表格形式)
  • rust高级特征
  • 【数据结构 | C++】字符串关键字的散列映射
  • 基于STM32的智能宠物自动喂食器设计思路:TCP\HTTP、Node.js技术
  • 【计算机网络】网络框架
  • [产品管理-68]:别让沉没成本影响你未来的决策
  • 【大数据学习 | HBASE】hbase的写数据流程与hbase插入数据
  • nacos单机服务注册源码解析
  • 第14张 GROUP BY 分组
  • caozha-comment(原生PHP评论系统)
  • 支付宝域名如何加入白名单(扫码老是弹窗)
  • Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
  • 计算机的错误计算(一百五十)
  • 【基于轻量型架构的WEB开发】课程 作业4 AOP
  • CentOS网络配置
  • 第四十一章 Vue之初识VueX
  • 集群架构中Lua脚本的限制以及出现的报错
  • 【王木头】最大似然估计、最大后验估计
  • 23年广大新生赛
  • 由于 C*DN 的不做为,将暂停 C*DN 文章的发表
  • 安全见闻六:通讯协议安全问题剖析
  • DNS域名解析
  • mysql 配置文件 my.cnf 增加 lower_case_table_names = 1 服务启动不了
  • JDBC-Util工具类
  • sql专题 之 三大范式