这是主文件
/*#include<stdio.h>
#include<graphics.h>
#include<mmsystem.h>//包含多媒体设备接口头文件
#pragma comment(lib,"winmm.lib")//加载静态库
void BGM()
{
mciSendString("open ./牛尾憲輔 (agraph) - From Here to Eternity.mp3", 0, 0, 0);
mciSendString("play ./牛尾憲輔 (agraph) - From Here to Eternity.mp3", 0, 0, 0);
}
int main()
{
//创建一个窗口,initgraph();
initgraph(400, 480);
BGM();
getchar();
//关闭窗口,closegraph();
closegraph();
return 0;
}
*/
/*#include <graphics.h> // 引用 EasyX 图形库
#include <Windows.h>
#include <mmsystem.h> // mci库头文件
#pragma comment(lib, "winmm.lib")
int main(void) {
initgraph(700, 900);
loadimage(0, "01.jpg");
mciSendString("play 牛尾憲輔 (agraph) - From Here to Eternity.mp3 repeat", 0, 0, 0); //重复播放
system("pause");
closegraph();
}
*/
#include<stdio.h>
#include<Windows.h>
#include<graphics.h>//包含图形库头文件
#include<conio.h>
#include <math.h>
#include <time.h>
#include<mmsystem.h>//包含多媒体设备接口头文件
#include <stdlib.h>
#include <string.h>
#pragma warning(disable : 4996)
#pragma comment(lib,"winmm.lib")
#define NUM 13 // 烟花种类数量宏定义
#define PI 3.1415926548
IMAGE backimg; //定义一张图片
/*void PlayBGM()
{
PlaySound("E:\\Easyx\\ConsoleApplication11\\茶太,真理絵,くない瓜 - だんご大家族.wav", NULL, SND_SYNC);
//mciSendString("open E:/Easyx/ConsoleApplication11/牛尾憲輔 (agraph) - From Here to Eternity.mp3 alias BGM", 0, 0, 0);//打开音乐,向多媒体设备接口发送一个字符串 ,代表指令
mciSendString("play BGM wait", 0, 0, 0);//播放音乐
mciSendString("close BGM", 0, 0, 0);
}
*/
static void SetPos(int x, int y)
{
COORD point = { x , y }; //光标要设置的位置x,y
HANDLE HOutput = GetStdHandle(STD_OUTPUT_HANDLE); //使用GetStdHandle(STD_OUTPUT_HANDLE)来获取标准输出的句柄
SetConsoleCursorPosition(HOutput, point); //设置光标位置
}
// 烟花结构
struct FIRE
{
int r=0; // 当前爆炸半径
int max_r; // 爆炸中心距离边缘最大半径
int x=0, y=0; // 爆炸中心在窗口的坐标
int cen_x, cen_y; // 爆炸中心相对图片左上角的坐标
int width, height; // 图片的宽高
int xy[240][240]; // 储存图片像素点
bool show; // 是否绽放
bool draw; // 开始输出像素点
DWORD t1, t2, dt; // 绽放速度
}Fire[NUM];
// 烟花弹结构
struct JET
{
int x=0, y=0; // 喷射点坐标
int hx, hy; // 最高点坐标------将赋值给 FIRE 里面的 x, y
int height; // 烟花高度
bool shoot; // 是否可以发射
DWORD t1, t2, dt; // 发射速度
IMAGE img[2]; // 储存花弹一亮一暗图片
byte n : 1; // 图片下标
}Jet[NUM];
// happy birthday 艺术字结构
struct HAPPY // 储存 Happy Birthday 艺术字图片
{
int x=0, y=0; // 每个字的图片的左上角坐标
IMAGE img; // 储存单个字图片
static int num; // 字母序号
}Happy[NUM];
int HAPPY::num = 0;
// For. yaojing.jpg结构
struct WISH // 滚动祝福图片结构
{
int x=0, y=0; // 图片左上角坐标
DWORD t1, t2, dt; // 图片运动时间间隔
IMAGE img; // 储存图片
int dxy; // 每次的移动量
byte dir : 1; // 限制两个滚动方向
}Wish;
// For.CL 结构
struct CL // 滚动祝福图片结构
{
int x = 0, y = 0; // 图片左上角坐标
DWORD t1, t2, dt; // 图片运动时间间隔
IMAGE img; // 储存图片
int dxy; // 每次的移动量
byte dir : 1; // 限制两个滚动方向
}CL;
//欢迎界面
void Welcome()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/01.jpg", 1070, 800);
PlaySound("./fire/邱有句,馒头,AirS1991 - My Love.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
//hello world
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最喜欢的动漫之一~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(44);
}
putimage(0, 0, &backimg);
_getch();
//虽然不能保证努力就能解决问题。但我可以保证,如果不努力什么都不会改变。 -- 千反田爱瑠 《冰菓》
settextstyle(33, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(300, 200, "XXXXXXXXXXX");
outtextxy(300, 250, "XXXXXXXXXXXXXXX");
outtextxy(300, 300, "虽然不能保证努力就能解决问题。");
outtextxy(300, 350, "但我可以保证,");
outtextxy(300, 400, "如果不努力什么都不会改变。");
outtextxy(300, 450, "XXXXXXXXXXXXX");
outtextxy(500, 500, "——千反田爱瑠 《冰菓》");
_getch();
cleardevice();
}
void Welcome1()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/02.jpeg", 1070, 800);
PlaySound("./fire/ReSound Wave - 渚.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最爱的动漫Clannad~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/*在这所学校里的生活,有过不少痛苦的事情。我总是很容易消沉,不擅长交朋友。到了三年级,课程也没能好好出席,
只好留级了。在迎来第二次三年级的那个春天,我在新的班级里孤独一人。在时间的流逝中一切都在不断的改变着,
当我意识到这一点时,已经无法再前进了,所以就一直站在这个坡道的下面。然后在背后推了我一把的是朋也君,
接下来我和许多人相识了。被这里的大家支持着,成立了演剧部。还在学院祭上站上了舞台。但是那之后我又病倒了,
又上了一次三年级。但即使如此我也想要加油,我想变得坚强起来。虽然身体不好,但还是想坚强地活下去。
是这里的大家给了我这样的勇气。 -- 古河渚 《Clannad》
*/
settextstyle(24, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(40, 100, "在这所学校里的生活,有过不少痛苦的事情。我总是很容易消沉,不擅长交朋友。");
outtextxy(40, 150, "到了三年级,课程也没能好好出席,只好留级了。");
outtextxy(40, 200, "在迎来第二次三年级的那个春天,我在新的班级里孤独一人。");
outtextxy(40, 250, "在时间的流逝中一切都在不断的改变着,当我意识到这一点时,");
outtextxy(40, 300, "已经无法再前进了,所以就一直站在这个坡道的下面。");
outtextxy(40, 350, "然后在背后推了我一把的是朋也君,接下来我和许多人相识了。");
outtextxy(40, 400, "被这里的大家支持着,成立了演剧部。还在学院祭上站上了舞台。");
outtextxy(40, 450, "但是那之后我又病倒了,又上了一次三年级。");
outtextxy(40, 500, "但即使如此我也想要加油,我想变得坚强起来。虽然身体不好,但还是想坚强地活下去。");
outtextxy(40, 550, "是这里的大家给了我这样的勇气。");
outtextxy(700, 600, "——团子大家族 古河渚");
_getch();
cleardevice();
}
void Welcome2()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/03.jpeg", 1070, 800);
PlaySound("./fire/夢跡 (梦痕).wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
// 播放背景音乐
//PlaySound("./Key Sounds Label (キー・サウンズ・レーベル) - 夢の跡 (梦痕).wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最爱的动漫Clannad~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(25);
}
/*如果一个人笑,那就证明这个人很开心。
但是一直笑,那就绝对不是。
这就可以证明这个人的过去,有一种非常痛苦的经历,让她在面对未来的生活中必须微笑
-- 愿君与你白头偕老 《鬼灭之刃》
微风轻倦,拥满院
刹时花开,蝶未飞 -- 纪野川奈 《鬼灭之刃》
*/
putimage(0, 0, &backimg);
_getch();
settextstyle(24, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(200, 200, "如果一个人笑,那就证明这个人很开心。");
outtextxy(200, 250, "但是一直笑,那就绝对不是。");
outtextxy(70, 300, "这就可以证明这个人的过去,有一种非常痛苦的经历,让她在面对未来的生活中必须微笑 ");
outtextxy(200, 350, "-- 愿君与你白头偕老");
outtextxy(200, 400, "微风轻倦,拥满院");
outtextxy(200, 450, "刹时花开,蝶未飞");
outtextxy(200, 500, "-- 纪野川奈 《鬼灭之刃》");
outtextxy(400, 550, "——兔婧");
_getch();
cleardevice();
}
void Welcome3()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/04.jpeg", 1070, 800);
PlaySound("./fire/海小贼 - 布鲁克的心跳.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最喜欢的动漫之一 恶魔人Crybaby~");
outtextxy(x - 10, y + 70, "你是我心中黑暗的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/*恶魔之所以是恶魔,因为他真实;天使之所以是天使,因为她虚伪。 人的心,一半是上帝一半是恶魔,上帝和恶魔的斗争是你内心的斗争。
每个人的身体里都住着一个天使和一个恶魔。这不是童话,这是人性。
恶魔,天使。你是恶魔,还是天使。我是天使,还是恶魔。你知道吗?
*/
settextstyle(33, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(200, 200, "恶魔之所以是恶魔,因为他真实;");
outtextxy(200, 250, "天使之所以是天使,因为她虚伪。");
outtextxy(200, 300, "每个人的身体里都住着一个天使和一个恶魔。");
outtextxy(200, 350, "这不是童话,这是人性。");
outtextxy(200, 400, "恶魔,天使。你是恶魔,还是天使。");
outtextxy(200, 450, "我是天使,还是恶魔。你知道吗?");
outtextxy(600, 500, "——恶魔人 Crybaby");
outtextxy(400, 550, "——牧村美树与不动明");
_getch();
cleardevice();
}
void Welcome4()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/05.jpg", 1070, 800);
PlaySound("./fire/太一 - 负重一万斤长大.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最喜欢的动漫之一 寄生兽生命准则~");
outtextxy(x - 10, y + 70, "你是我心中黑暗的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/*极少的人类真矛盾,平时什么都不想杀甚至会去保护所有生命,而且已经习以为常,现在轮到自己认为重要的事物反而会牺牲生命去保护。 -- 《xxxx》 --
*/
settextstyle(33, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(200, 200, "极少的人类真矛盾,");
outtextxy(200, 250, "平时什么都不想杀甚至会去保护所有生命,");
outtextxy(200, 300, "而且已经习以为常,");
outtextxy(200, 350, "现在轮到自己认为重要的事物反而会牺牲生命去保护。");
outtextxy(200, 400, "-- 《xxxx》");
outtextxy(200, 450, "XXXXXXXXXXXXX");
outtextxy(600, 500, "——云云");
_getch();
cleardevice();
}
void Welcome5()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/06.jpg", 1070, 800);
PlaySound("./fire/ReSound Wave - 渚.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最爱的动漫Clannad~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/*岗崎朋也:渚,我们结婚吧!
你答应了!
古河渚:我也一直觉得,除了朋也君以外,
没其他人是可以的。
岗崎朋也:这样的我啊!是这么的没用。
古河渚:我也很没用。
但两个人在一起的话就会变得坚强。
岗崎朋也:你能一直在我身边吗?
古河渚:是的,我一直都会在你身边。
无论何时,直到永远。 -- 岗崎朋也与古河渚 《Clannad》
*/
settextstyle(33, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(200, 100, "岗崎朋也:渚,我们结婚吧!");
outtextxy(200, 150, "你答应了!");
outtextxy(200, 200, "古河渚:我也一直觉得,除了朋也君以外,");
outtextxy(200, 250, "没其他人是可以的。");
outtextxy(200, 300, "岗崎朋也:这样的我啊!是这么的没用。");
outtextxy(200, 350, "古河渚:我也很没用。");
outtextxy(200, 400, "但两个人在一起的话就会变得坚强。");
outtextxy(200, 450, "岗崎朋也:你能一直在我身边吗?");
outtextxy(200, 500, "古河渚:是的,我一直都会在你身边。");
outtextxy(200, 550, "无论何时,直到永远。");
outtextxy(400, 600, "——岗崎朋也与古河渚 《Clannad》");
_getch();
cleardevice();
}
void Welcome6()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/07.jpg", 1070, 800);
PlaySound("./fire/邱有句,馒头,AirS1991 - My Love.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我喜欢的动漫~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/*雪中智代雨中杏,樱花树下古河渚。
图书馆中小琴美,资料室里有纪宁。
春原兄妹路边走,古河夫妻店里忙。
海星风子随风去,花田丛中冈崎汐。 -- 《Clannad》*/
settextstyle(33, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(200, 200, "雪中智代雨中杏,樱花树下古河渚。");
outtextxy(200, 250, "图书馆中小琴美,资料室里有纪宁。");
outtextxy(200, 300, "春原兄妹路边走,古河夫妻店里忙。");
outtextxy(200, 350, "海星风子随风去,花田丛中冈崎汐。");
outtextxy(200, 400, "XXXXXXXXXXXX");
outtextxy(200, 450, "XXXXXXXXXXXXX");
outtextxy(400, 500, " ——《Clannad》");
_getch();
cleardevice();
}
void Welcome7()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/08.jpg", 1070, 800);
PlaySound("./fire/折戸伸治 - 潮鳴り.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最爱的动漫Clannad~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/* 15:02:45
clannad——Call life as natality, noticing, accompaning, death. 人生即是到来、相遇、陪伴、离开 -- 《Clannad》
15:03:21
时光流转,愿你与珍爱之人,能够再次重逢。 -- 《可塑性记忆》
15:06:24
真正重要的东西,永远都是非常简单的。 -- 一之濑水惠 《Clannad》
*/
settextstyle(33, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(200, 200, "Clannad——Call life as natality,");
outtextxy(200, 250, "noticing, accompaning, death.");
outtextxy(200, 300, "人生即是到来、相遇、陪伴、离开 ");
outtextxy(200, 350, "真正重要的东西,永远都是非常简单的。");
outtextxy(500, 400, "——《Clannad》");
outtextxy(200, 450, "时光流转,愿你与珍爱之人,能够再次重逢。");
outtextxy(500, 500, "——《可塑性记忆》");
_getch();
cleardevice();
}
void Welcome8()
{
//初始化界面
initgraph(1070, 800); //1070 800
srand((unsigned int)time(NULL));
//加载图片
loadimage(&backimg, "./fire/09.jpg", 1070, 800);
PlaySound("./fire/折戸伸治 - 潮鳴り.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
for (int i = 0; i < 50; i++) //50
{
//圆的轨迹方程。
int x = 600 + int(180 * sin(PI * 2 * i / 60));
int y = 200 + int(180 * cos(PI * 2 * i / 60));
cleardevice();
settextcolor(WHITE);
settextstyle(i, 0, "楷体");
outtextxy(x - 80, y, "我最爱的动漫Clannad~");
outtextxy(x - 10, y + 70, "你是我心中善良的一面!");
Sleep(25);
}
putimage(0, 0, &backimg);
_getch();
/* 15:12:58
别失去你重要的东西。 -- 芳野佑介 《Clannad》
15:13:36
团子 团子 团子 团子,团子 团子 大家族,
团子 团子 团子 团子,团子 大家族,
顽皮捣蛋的烧烤团子,
温柔的豆沙团子,
有些喜欢做梦的,
赏月团子,
装模作样的,芝麻团子,
大家大家聚在一起,组成了百人大家族,
团子宝宝每天都生活,在幸福中,
团子老人眼睛,总是眯成一直线,
团子们都是好朋友,手牵着手围成大圆圈,
团子们建起了小镇,团子星上大家乐呵呵,
天上有兔子在招手,还有大大的月亮婆婆,
把开心的事 悲伤的事,全部揉成一团吧,
团子们都是好朋友,手牵着手围成大圆圈 -- 《Clannad》
*/
settextstyle(24, 0, "楷体");
settextcolor(WHITE);
setbkmode(0);
outtextxy(100, 100, "别失去你重要的东西。");
outtextxy(100, 150, "团子 团子 团子 团子,团子 团子 大家族,");
outtextxy(100, 200, "团子 团子 团子 团子,团子 大家族,");
outtextxy(100, 250, "顽皮捣蛋的烧烤团子,温柔的豆沙团子,");
outtextxy(100, 300, "有些喜欢做梦的,赏月团子,装模作样的,芝麻团子,");
outtextxy(100, 350, "大家大家聚在一起,组成了百人大家族,");
outtextxy(100, 400, "团子宝宝每天都生活,在幸福中,");
outtextxy(100, 450, "团子老人眼睛,总是眯成一直线,");
outtextxy(100, 500, "团子们都是好朋友,手牵着手围成大圆圈,");
outtextxy(100, 550, "团子们建起了小镇,团子星上大家乐呵呵,");
outtextxy(100, 600, "天上有兔子在招手,还有大大的月亮婆婆,");
outtextxy(100, 650, "把开心的事 悲伤的事,全部揉成一团吧,");
outtextxy(100, 700, "团子们都是好朋友,手牵着手围成大圆圈");
outtextxy(400, 750, "——《Clannad》");
_getch();
cleardevice();
}
// 初始化烟花参数
void Init(int i)
{
// 分别为:烟花中心到图片边缘的最远距离、烟花中心到图片左上角的距离 (x、y) 两个分量
int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 };
int x[13] = { 120, 120, 110, 117, 110, 93, 102, 102, 110, 105, 100, 108, 110 };
int y[13] = { 120, 120, 85, 118, 120, 103, 105, 110, 110, 120, 120, 104, 85 };
/**** 初始化烟花 *****/
Fire[i].x = 0; // 烟花中心坐标
Fire[i].y = 0;
Fire[i].width = 240; // 图片宽
Fire[i].height = 240; // 图片高
Fire[i].max_r = r[i]; // 最大半径
Fire[i].cen_x = x[i]; // 中心距左上角距离
Fire[i].cen_y = y[i];
Fire[i].show = false; // 是否绽放
Fire[i].dt = 5; // 绽放时间间隔
Fire[i].t1 = timeGetTime();
Fire[i].r = 0; // 从 0 开始绽放
/**** 初始化烟花弹 *****/
Jet[i].x = -240; // 烟花弹左上角坐标
Jet[i].y = -240;
Jet[i].hx = -240; // 烟花弹发射最高点坐标
Jet[i].hy = -240;
Jet[i].height = 0; // 发射高度
Jet[i].t1 = timeGetTime();
Jet[i].dt = rand() % 10; // 发射速度时间间隔
Jet[i].n = 0; // 烟花弹闪烁图片下标
Jet[i].shoot = false; // 是否发射
}
// 加载图片
void Load()
{
/**** 储存烟花的像素点颜色 ****/
IMAGE fm, gm;
loadimage(&fm, "./fire/flower.jpg", 3120, 240);
for (int i = 0; i < 13; i++)
{
SetWorkingImage(&fm);
getimage(&gm, i * 240, 0, 240, 240);
SetWorkingImage(&gm);
for (int a = 0; a < 240; a++)
for (int b = 0; b < 240; b++)
Fire[i].xy[a][b] = getpixel(a, b);
}
/**** 加载烟花弹 ************/
IMAGE sm;
loadimage(&sm, "./fire/shoot.jpg", 200, 50);
for (int i = 0; i < 13; i++)
{
SetWorkingImage(&sm);
int n = rand() % 5;
getimage(&Jet[i].img[0], n * 20, 0, 20, 50); // 暗
getimage(&Jet[i].img[1], (n + 5) * 20, 0, 20, 50); // 亮
}
/***** 加载 Happy Birthday 图片 ********/
IMAGE hm;
loadimage(&hm, "./fire/happy.jpg", 689, 115);
for (int i = 0; i < 13; i++)
{
SetWorkingImage(&hm);
Happy[i].x = i * 90;
Happy[i].y = rand() % 100 + 500;
getimage(&Happy[i].img, i * 53, 0, 53, 115);
}
/***** 加载 For.yaojing.jpg 图片 *********/
Wish.x = 0;
Wish.y = 100;
Wish.t1 = timeGetTime();
Wish.dt = 46;
Wish.dir = 0;
Wish.dxy = rand() % 8 + 1;
loadimage(&Wish.img, "./fire/yaojing.jpg");
putimage(Wish.x, Wish.y, &Wish.img, SRCINVERT);
/***** 加载 CL 图片 *********/
CL.x = 0;
CL.y = 100;
CL.t1 = timeGetTime();
CL.dt = 46;
CL.dir = 0;
CL.dxy = rand() % 8 + 1;
loadimage(&CL.img, "./fire/CL03.jpg");
putimage(CL.x, CL.y, &CL.img, SRCINVERT);
SetWorkingImage(); // 设置回绘图窗口
}
// 在一定范围内筛选可发射的烟花,并初始化发射参数,输出烟花弹到屏幕,播放声音
void Chose(DWORD& t1)
{
DWORD t2 = timeGetTime();
if (t2 - t1 > 100)
{
int n = rand() % 20;
if (n < 13 && Jet[n].shoot == false && Fire[n].show == false)
{
/**** 重置烟花弹,预备发射 *****/
Jet[n].x = rand() % 1070;
Jet[n].y = rand() % 100 + 600;
Jet[n].hx = Jet[n].x;
Jet[n].hy = rand() % 400;
Jet[n].height = Jet[n].y - Jet[n].hy;
Jet[n].shoot = true;
putimage(Jet[n].x, Jet[n].y, Jet[n].img, SRCINVERT);
/**** 播放每个烟花弹的声音 *****/
char c1[50], c2[30], c3[30];
sprintf_s(c1, "open ./fire/shoot.mp3 alias s%d", n);
sprintf_s(c2, "play s%d", n);
sprintf_s(c3, "close n%d", n);
mciSendString(c3, 0, 0, 0);
mciSendString(c1, 0, 0, 0);
mciSendString(c2, 0, 0, 0);
}
t1 = t2;
}
}
// 扫描烟花弹并发射
void Shoot()
{
for (int i = 0; i < 13; i++)
{
Jet[i].t2 = timeGetTime();
if (Jet[i].t2 - Jet[i].t1 > Jet[i].dt && Jet[i].shoot == true)
{
/**** 烟花弹的上升 *****/
putimage(Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT);
if (Jet[i].y > Jet[i].hy)
{
Jet[i].n++;
Jet[i].y -= 5;
}
putimage(Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT);
/**** 上升到高度的 3 / 4,减速 *****/
if ((Jet[i].y - Jet[i].hy) * 4 < Jet[i].height)
Jet[i].dt = rand() % 4 + 10;
/**** 上升到最大高度 *****/
if (Jet[i].y <= Jet[i].hy)
{
// 播放爆炸声
char c1[50], c2[30], c3[30];
sprintf_s(c1, "open ./fire/bomb.wav alias n%d", i);
sprintf_s(c2, "play n%d", i);
sprintf_s(c3, "close s%d", i);
mciSendString(c3, 0, 0, 0);
mciSendString(c1, 0, 0, 0);
mciSendString(c2, 0, 0, 0);
putimage(Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT); // 擦掉烟花弹
Fire[i].x = Jet[i].hx + 10; // 在烟花弹中间爆炸
Fire[i].y = Jet[i].hy; // 在最高点绽放
Fire[i].show = true; // 开始绽放
Jet[i].shoot = false; // 停止发射
// 显示对应字母
putimage(Happy[HAPPY::num].x, Happy[HAPPY::num].y, &Happy[HAPPY::num].img, SRCINVERT);
HAPPY::num++;
if (HAPPY::num > 12)
HAPPY::num = 0;
}
Jet[i].t1 = Jet[i].t2;
}
}
}
// 制作水平、竖直移动的图片
void Wishing()
{
Wish.t2 = timeGetTime();
if (Wish.t2 - Wish.t1 > Wish.dt)
{
/**** 图片的移动 *****/
putimage(Wish.x, Wish.y, &Wish.img, SRCINVERT);
if (Wish.dir == 0)
Wish.x += Wish.dxy;
else
Wish.y -= Wish.dxy;
putimage(Wish.x, Wish.y, &Wish.img, SRCINVERT);
/**** 图片出界后 *****/
if (Wish.x > 1070 || Wish.y < 0)
{
Wish.dir = rand() % 2; // 获取随机方向
if (Wish.dir == 0) // 如果左右运动
{
Wish.y = rand() % 700; // 初始位置
Wish.x = -490;
Wish.dxy = rand() % 7 + 1; // 随机运动分量
}
else // 上下运动
{
Wish.dxy = rand() % 7 + 1;
Wish.x = rand() % 700;
Wish.y = 800;
}
}
Wish.t1 = Wish.t2;
}
}
void CLing()
{
CL.t2 = timeGetTime();
if (CL.t2 - CL.t1 > CL.dt)
{
/**** 图片的移动 *****/
putimage(CL.x, CL.y, &CL.img, SRCINVERT);
if (CL.dir == 0)
CL.x += CL.dxy;
else
CL.y -= CL.dxy;
putimage(CL.x, CL.y, &CL.img, SRCINVERT);
/**** 图片出界后 *****/
if (CL.x > 1070 || CL.y < 0)
{
CL.dir = rand() % 2; // 获取随机方向
if (CL.dir == 0) // 如果左右运动
{
CL.y = rand() % 700; // 初始位置
CL.x = -490;
CL.dxy = rand() % 7 + 1; // 随机运动分量
}
else // 上下运动
{
CL.dxy = rand() % 7 + 1;
CL.x = rand() % 700;
CL.y = 800;
}
}
CL.t1 = CL.t2;
}
}
// 显示花样
void Style(DWORD& st1)
{
DWORD st2 = timeGetTime();
if (st2 - st1 > 266000) // 一首歌的时间
{
// 心形坐标
int x[13] = { 60, 75, 91, 100, 95, 75, 60, 45, 25, 15, 25, 41, 60 };
int y[13] = { 65, 53, 40, 22, 5, 4, 20, 4, 5, 22, 40, 53, 65 };
for (int i = 0; i < NUM; i++)
{
cleardevice();
/**** 规律分布烟花弹 ***/
Jet[i].x = x[i] * 10;
Jet[i].y = (y[i] + 75) * 10;
Jet[i].hx = Jet[i].x;
Jet[i].hy = y[i] * 10;
Jet[i].height = Jet[i].y - Jet[i].hy;
Jet[i].shoot = true;
Jet[i].dt = 7;
putimage(Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT); // 显示烟花弹
/**** 设置烟花参数 ***/
Fire[i].x = Jet[i].x + 10;
Fire[i].y = Jet[i].hy;
Fire[i].show = false;
Fire[i].r = 0;
/**** 播放发射声音 ***/
char c1[50], c2[30], c3[30];
sprintf_s(c1, "open ./fire/shoot.mp3 alias s%d", i);
sprintf_s(c2, "play s%d", i);
sprintf_s(c3, "close n%d", i);
mciSendString(c3, 0, 0, 0);
mciSendString(c1, 0, 0, 0);
mciSendString(c2, 0, 0, 0);
}
st1 = st2;
}
}
// 绽放烟花
void Show(DWORD* pMem)
{
// 烟花个阶段绽放时间间隔,制作变速绽放效果
int drt[16] = { 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 55, 55, 55, 55, 55 };
for (int i = 0; i < NUM; i++)
{
Fire[i].t2 = timeGetTime();
// 增加爆炸半径,绽放烟花,增加时间间隔做变速效果
if (Fire[i].t2 - Fire[i].t1 > Fire[i].dt && Fire[i].show == true)
{
if (Fire[i].r < Fire[i].max_r)
{
Fire[i].r++;
Fire[i].dt = drt[Fire[i].r / 10];
Fire[i].draw = true;
}
if (Fire[i].r >= Fire[i].max_r - 1)
{
Fire[i].draw = false;
Init(i);
}
Fire[i].t1 = Fire[i].t2;
}
// 如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出。
if (Fire[i].draw)
{
for (double a = 0; a <= 6.28; a += 0.01)
{
int x1 = (int)(Fire[i].cen_x + Fire[i].r * cos(a)); // 相对于图片左上角的坐标
int y1 = (int)(Fire[i].cen_y - Fire[i].r * sin(a));
if (x1 > 0 && x1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height) // 只输出图片内的像素点
{
int b = Fire[i].xy[x1][y1] & 0xff;
int g = (Fire[i].xy[x1][y1] >> 8) & 0xff;
int r = (Fire[i].xy[x1][y1] >> 16);
// 烟花像素点在窗口上的坐标
int xx = (int)(Fire[i].x + Fire[i].r * cos(a));
int yy = (int)(Fire[i].y - Fire[i].r * sin(a));
// 较暗的像素点不输出、防止越界
if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1070 && yy > 0 && yy < 800)
pMem[yy * 1070 + xx] = BGR(Fire[i].xy[x1][y1]); // 显存操作绘制烟花
}
}
Fire[i].draw = false;
}
}
}
//E:\Easyx\ConsoleApplication11\fire
int main()
{
FILE* fp;
char buf[150], add[60], ai[5];
int i = 1, delay = 33;
clock_t stime = 0, ftime = 0;
// 播放背景音乐
PlaySound("./fire/clannad.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
// mciSendString(TEXT("open E:\\C语言\\0013\\Project1\yy\\茶太,真理絵,くない瓜 - だんご大家族.wav alias bkmusic"), NULL, 0, NULL);//播放音乐
//mciSendString(TEXT("play bkmusic"), NULL, 0, NULL);
/* Sleep(200);*/
stime = clock();
while (i <= 7012)
{
if (i % 30 == 0)
{
delay = 43;
}
else
{
delay = 33;
}
/*E:\Easyx\ConsoleApplication11\CL02*/ //E:\Easyx\TZDJZ
//strcpy(add, "E:\\Easyx\\TZDJZ\\CL02\\t (");
strcpy(add, "./CL02/t (");
sprintf(ai, "%d", i);
strcat(add, ai);
strcat(add, ").txt");
// 名字修改
ftime = clock();
if (ftime - stime >= delay)
{
fp = fopen(add, "r");//打印文本
if (NULL == fp)
printf("打开错误");
else
{
while (fgets(buf, 150, fp))
{
printf("%s", buf);
}
fclose(fp);
SetPos(0, 0);
i++;
stime += delay;
}
}
}
//创建一个窗口,initgraph();
initgraph(1070, 800);
HWND hn = GetHWnd();//获取窗口句柄函数;
SetWindowText(hn, "团子大家族");//修改窗口名字函数
MessageBox(hn, "我是二次元", "提示", MB_OKCANCEL);//消息框弹出设置函数
getchar();
//关闭窗口,closegraph();
closegraph();
Welcome();
Welcome1();
Welcome2();
Welcome3();
Welcome4();
Welcome5();
Welcome6();
Welcome7();
Welcome8();
//initgraph(1070, 800);
/*initgraph(1070, 800, NOMINIMIZE);
IMAGE img;//创建一个加载图像的变量
loadimage(&img, "./fire/10.jpg", 1070, 800);//加载图像
putimage(0, 0, &img);//在窗口中打印图像
*/
while (1)
{
initgraph(1070, 800, NOCLOSE | NOMINIMIZE);//定义窗口的宽和高
IMAGE img;
loadimage(&img, "./fire/10.jpg");
putimage(0, 0, &img);
srand(time(0));
// 播放背景音乐
PlaySound("./fire/茶太,真理絵,くない瓜 - だんご大家族.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);
settextstyle(40, 0, "楷体");//设置字体形式(高度,宽度,字体)
setbkmode(TRANSPARENT);//考虑到文字背景也有默认颜色,可能发生遮挡,所以将文字背景改为透明
//settextcolor(BLUE);//设置文字颜色
outtextxy(9, 74, "心之所向,二次元,我(云云)大爱Clannad(团子大家族)!");//指定位置打印字符串1
//PlayBGM();
setfillstyle(0, 0, 0);//实际参数和形式参数应该相同!!!
setfont(36, 0, "楷体");
setcolor(BLUE);
outtextxy(370, 100, "云云的作品!!!");
DWORD t1 = timeGetTime(); // 筛选烟花计时
DWORD st1 = timeGetTime(); // 播放花样计时
DWORD* pMem = GetImageBuffer(); // 获取窗口显存指针
for (int i = 0; i < NUM; i++) // 初始化烟花
{
Init(i);
}
Load(); // 将烟花图片信息加载进相应结构中
BeginBatchDraw(); // 开始批量绘图
while (1)//(!_kbhit())
{
Sleep(10);
// 随机选择 4000 个像素点擦除
for (int clr = 0; clr < 1000; clr++)
{
for (int j = 0; j < 2; j++)
{
int px1 = rand() % 1070;
int py1 = rand() % 800;
if (py1 < 799) // 防止越界
pMem[py1 * 1070 + px1] = pMem[py1 * 1070 + px1 + 1] = BLACK; // 对显存赋值擦出像素点
}
}
Chose(t1); // 筛选烟花
Shoot(); // 发射烟花
Show(pMem); // 绽放烟花
Wishing();
CLing(); // 滚动字符
Style(st1); // 花样发射
FlushBatchDraw(); // 显示前面的所有绘图操作
}
//getchar();
//关闭窗口,closegraph();
//closegraph();
//return 0;
//使程序处于循环中
}
}
/*bool putting_picture(MOUSEMSG m) {
if (button_judge(m.x, m.y)==1|| button_judge(m.x, m.y)==2|| button_judge(m.x, m.y)==3)
{
IMAGE im;
initgraph(1000, 700);
loadimage(&im, _T("C:\\Users\\Administrator.CH-202202161013\\Desktop\\QQ图片20220302091847.jpg"), 1000, 700);
putimage(0, 0, &im);
return true;
}
if (button_judge(m.x, m.y) == 4)
{
IMAGE im;
initgraph(1000, 800);
loadimage(&im, _T("C:\\Users\\Administrator.CH-202202161013\\source\\repos\\eaxyx\\eaxyx\\hongkong.jpg"), 1000, 800);
putimage(0, 0, &im);
system("puase");
Sleep(10000);
closegraph();
exit(0);
}
else
{
return false;
}
}
bool sign() {
settextstyle(30, 0, "楷体");
outtextxy(300, 150, "用户名");
outtextxy(300, 200, "密码");
settextstyle(30, 0, "黑体");
char coco[64];
TCHAR input[] = _T("请输入ID");
InputBox(coco, 10, input);
outtextxy(400, 150, coco);
char coco2[64];
TCHAR input2[] = _T("请输入密码");
InputBox(coco2, 10, input2);
outtextxy(400, 200, coco2);
Sleep(600);
if (strcmp(coco, "1949") == 0 && strcmp(coco2, "snape") == 0) {
return true;
}
else
{
HWND SignError = GetHWnd();
int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
return false;
}
}
*/
这是头文件
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script1.rc
//
#define IDI_ICON1 101
#define IDI_ICON2 102
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
这是资源文件
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/
#undef APSTUDIO_READONLY_SYMBOLS
/
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
/
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON DISCARDABLE "008.ico"
#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // Chinese (P.R.C.) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
/
#endif // not APSTUDIO_INVOKED
这是实现成功的样子~
【最爱的动漫-------简单的用编程实现(C++)-哔哩哔哩】 https://b23.tv/k4DnEav
只需要用到Easyx库,还有图片、音乐文件,还有字符动画!
功能会慢慢完善,当然有好的想法也是非常不错的!