#include <stdio.h>
#include <conio.h>
#include <easyx.h>
#include<mmsystem.h>
#include <math.h>
#include <time.h>
#include "rose.h"
#include <graphics.h>
#pragma comment(lib,"winmm.lib")
IMAGE img_bk[3];
IMAGE img_meteor[3];
#define NUM 41
#define MUN 10
#define PI 3.1415
#define WIDTH 960
#define HEIGHT 640
void sayToYou()
{
int x = 550, y = 80;
TCHAR story[13][100] = {
_T("我一直以为山是水的故事"),
_T("云是风的故事"),
_T("你是我的故事"),
_T("可是却不知道"),
_T("我是不是你的故事"),
_T("如果可以和你在一起"),
_T("我宁愿让天空所有的星光全部陨落"),
_T("因为你的眼睛"),
_T("是我生命里最亮的光芒"),
_T(""),
_T("我的山楂树之恋"),
_T("只有是和你才会纯洁"),
_T("所以丢弃 我的视线")
};
//浪漫字体颜色(粉色)
settextcolor(RGB(0xdb, 0x70, 0x93));
//settextcolor(RGB(219,112,147));
//浪漫字体
settextstyle(23, 0, _T("Matura MT Script Capitals"));//字号,字宽,字体
//爱情背景音乐
for (int i = 0; i < 13; i++)
{
if (i >= 10)
{
settextstyle(30, 0, _T("Matura MT Script Capitals"));
settextcolor(RED);
//settextcolor(RGB(255,0,0));
outtextxy(x, y, story[i]);
y += 25;
continue;//结束本次循环
}
outtextxy(x, y, story[i]);
y += 25;
Sleep(500);
}
}
struct Meteor //流星
{
int x;
int y;
int speed;//速度
};
struct Fire//烟花
{
int x, y;
int cen_x, cen_y;//中心点坐标
int r;//当前绽放半径
int max_r;//最大绽放半径
int width, height;
DWORD pixel[240][240];//图像像素数组
bool isShow; //烟花是否好了
bool isDraw; //是否会置烟花
}fire[MUN];
struct Meteor meteor[NUM];//流星结构体
struct Jet//烟花结构体
{
int x, y;
int hx, hy;
bool isLaunch;//烟花是否在发射中
IMAGE img[2];
byte n : 1;
}jet[MUN];
void initMeteor(int i)//初始化流星
{
meteor[i].x = rand() % (1200 * 2) - 1200;//(0~-1000,1200)
meteor[i].y = rand() % 20 - 200; //(-78,-200)
meteor[i].speed = rand() % 2+1 ;
}
void InitData(int i)//初始化烟花
{
fire[i].cen_x = 120;
fire[i].cen_y = 120;
fire[i].max_r = 120;
fire[i].r = 0;
fire[i].width = 240;
fire[i].height = 240;
fire[i].isDraw = false;
fire[i].isShow = false;
}
void loadImg()//初始化烟花爆炸效果
{
IMAGE bloomImg, tImg;
loadimage(&bloomImg, L"./images/爆炸.jpg", 3120, 240);
for (int i = 0; i < MUN; i++)
{
InitData(i);
SetWorkingImage(&bloomImg);
getimage(&tImg, i * 240, 0, 240, 240);
SetWorkingImage(&tImg);
for (int a = 0; a < 240; a++)
{
for (int b = 0; b < 240; b++)
{
fire[i].pixel[a][b] = getpixel(a, b);
}
}
}
//初始化烟花弹
IMAGE jetImg;
loadimage(&jetImg, L"./images/烟花.jpg", 200, 50);
for (int i = 0; i < MUN; i++)
{
SetWorkingImage(&jetImg);
int n = rand() % 5;
getimage(&jet[i].img[0], n * 20, 0, 20, 50);
getimage(&jet[i].img[1], n * 20 + 100, 0, 20, 50);
SetWorkingImage();
/*putimage(i * 50, 0, &jet[i].img[0]);*/
jet[i].isLaunch = false;
}
SetWorkingImage();
}
void drawMeteor()//画流星
{
for (int i = 0; i < NUM; i++)
{
putimage(meteor[i].x, meteor[i].y, img_meteor , SRCPAINT);
}
}
void createJet()//画烟花
{
int i = rand() % MUN;//(0~13)
if (jet[i].isLaunch == false)
{
jet[i].x = rand() % (WIDTH);
jet[i].y = rand() % 100 + HEIGHT;
jet[i].hx = jet[i].x;
jet[i].hy = rand() % (HEIGHT / 5 * 3);
jet[i].isLaunch = true;
}
}
void moveMeteor()//移动流星
{
//改变坐标就可以实现移动,斜线x,y都要变化
for (int i = 0; i < NUM; i++)
{
meteor[i].x += meteor[i].speed;
meteor[i].y += meteor[i].speed;
if (meteor[i].y > getheight() || meteor[i].x > getwidth())
{
initMeteor(i);
}
}
}
void launch()//移动烟花
{
for (int i = 0; i < MUN; i++)
{
if (jet[i].isLaunch)
{
putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
if (jet[i].y > jet[i].hy)
{
jet[i].y -= 1;
jet[i].n++;
}
putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
if (jet[i].y <= jet[i].hy)
{
jet[i].isLaunch = false;
//可以开始放烟花
fire[i].x = jet[i].x;
fire[i].y = jet[i].y;
fire[i].isShow = true;
}
}
}
}
void bloom(DWORD* pMem)
{
for (int i = 0; i < MUN; i++)
{
if (fire[i].isShow)
{
if (fire[i].r < fire[i].max_r)
{
fire[i].r++;
fire[i].isDraw = true;//可以开始绘制烟花
}
if (fire[i].r >= fire[i].max_r)
{
InitData(i);
}
}
if (fire[i].isDraw)
{
//求当前半径下,圆上的每个点对应的弧度
for (double a = 0; a < 2 * PI; a += 0.01)
{
int img_x = fire[i].cen_x + fire[i].r * cos(a);//求出圆上每个点的坐标
int img_y = fire[i].cen_y + fire[i].r * sin(a);
if (img_x > 0 && img_x < fire[i].width && img_y>0 && img_y < fire[i].height);
{
//针对现在的绽放点,对应的品目坐标
int win_x = fire[i].x + fire[i].r * cos(a);
int win_y = fire[i].y + fire[i].r * sin(a);
if (win_x > 0 && win_x < WIDTH && win_y>0 && win_y < WIDTH)
{
pMem[win_y * WIDTH + win_x] = BGR(fire[i].pixel[img_x][img_y]);
}
}
}
}
}
}
void welcome()
{
int s = 0;
settextstyle(40, 0, _T("华文行楷"));
setbkmode(TRANSPARENT);
for (s = 0; s <= 20; s++)
{
cleardevice();
putimage(0, 0, img_bk);
settextstyle(40, 0, _T("华文行楷"));
outtextxy(450, 20, _T("这就是城里来的作家"));
outtextxy(100, 50, _T("不不,我是八中的学生"));
outtextxy(100, 100, _T("来菜写村史"));
outtextxy(100, 150, _T("会去帮老师编写教材"));
outtextxy(100, 200, _T("你肯定要写那棵山楂树吧"));
outtextxy(100, 250, _T("你则么知道"));
outtextxy(100, 300, _T("我猜的"));
outtextxy(100, 350, _T("还是留给小孩吃吧"));
outtextxy(100, 400, _T("不是小孩就不能吃糖了"));
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256, ));
for (size_t i = 0; i < 20; i++)
{
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256, rand()));
outtextxy(rand() % 1200, rand() % 800, _T("❤"));
}
Sleep(1000);
}
}
int main()
{
initgraph(WIDTH, HEIGHT);
mciSendString(_T("open ./images/山楂树.mp3 alias bgm "), NULL, 0, NULL);
mciSendString(TEXT("play bgm"), NULL, 0, NULL);
void sayToYou(); //打印情书的内容
sayToYou();
drawRose();
srand((unsigned)time(NULL) + clock());
loadimage(img_bk, _T("./images/山楂树之恋.jpeg"), 960,640);
loadimage(img_bk + 1, _T("./images/你的名字.jpeg"), 960,640);
loadimage(img_bk + 2, _T("./images/山楂树之恋.jpeg"), 960,640);
loadimage(img_meteor, _T("./images/d.jpeg"), 50, 50);
welcome();
cleardevice();
loadImg();
DWORD* pMem = GetImageBuffer();//获取窗口的内存指针
while (!_kbhit())
{
settextstyle(40, 0, _T("华文行楷"));
outtextxy(400, 50, _T("山楂树之恋"));
for (int i = 0; i < WIDTH; i++)
{
for (int k = 0; k < 4; k++)
{
int x = rand() % WIDTH;
int y = rand() % HEIGHT;
if (y < HEIGHT)
{
pMem[y * WIDTH + x] = BLACK;
}
}
}
createJet();
launch();
bloom(pMem);
Sleep(10);
}
setbkmode(TRANSPARENT);
for (size_t i = 0; i < NUM; i++)
{
initMeteor(i);
}
//防止闪屏 双缓冲
BeginBatchDraw();//开起双缓冲绘图
while (1)
{
int begin = clock();//获取程序运行时间(毫秒数)
//控制画面的帧数 26
putimage(0, 0, img_bk + 1);
drawMeteor();
moveMeteor();
FlushBatchDraw();//刷星
//获取程序总共的执行时间
int timeRemaining = clock() - begin;
//计算每帧需要的时间
int timeFrame = 1000.0 / 60;
//获取程序执行时间有没有超过,没帧执行的最大时间
评论0