啊,抱歉,本人是单身狗,呜呜呜
废话少说,我来展示我的音乐相册的开发历程(也是为了更好的让你们学习)
首先我先想好我要实现的功能
1.音乐播放
2.在某个位置显示字符串
3.字符串组合成心形
4.一个个字符串出现
5.滚动
6.贴图
7.图片切换
大概就是这么个顺序
首先是音乐播放
#include<Windows.h>
#include<mmsystem.h>//一定要加Windows头文件
#pragma comment(lib,"winmm.lib")
int main(){
mciSendString("open 1.mp3", NULL, NULL, NULL);//加载音乐
mciSendString("play 1.mp3", NULL, NULL, NULL);//播放
}
其中的音乐文件1.MP3 我是跟源码放在一起,这里相当于相对路径,如果在其他文件夹内,那么我们需要指出路径,本人建议是放到相同文件夹
第二是在某位置显示字符串
我用的是EasyX插件更好用,更容易理解
那么就是创建一定大小的窗口,在想要的坐标上展示字符串就行
以下实现:
#include<graphics.h>
#include<stdio.h>
int main() {
initgraph(800, 800);
settextcolor(PINK);//设置字体颜色
outtextxy(400, 400, "goudan,真是菜");
}
运行以后看到中心生成的“goudan,真是菜”的红色文字
第三我要实现的功能是字符串组成心形
上面我已经知道了怎么展示字符串,利用的就是所需要的坐标
既然是多个字符组成的心形,必定需要多个坐标
那么何不必设计个结构体表达我们的坐标
struct point
{
int x;
int y;
};
那么接下来就是得到心形的坐标了
我们可以利用画图工具和心形图片来得到所需的坐标
通过这样的方法,鼠标移动,然后得到像素位置就成了,然后以下是我得到的坐标
point arr[NUM] = {
{ 395,268 },
{ 406,222 },
{ 416,193 },
{ 441,162 },
{ 468,133 },
{ 500,117 },
{ 537,105 },
{ 577,107 },
{ 617,120 },
{ 649,146 },
{ 666,173 },
{ 680,211 },
{ 683,247 },
{ 680,293 },
{ 675,338 },
{ 660,385 },
{ 640,440 },
{ 616,484 },
{ 588,529 },
{ 557,573 },
{ 530,610 },
{ 493,645 },
{ 460,675 },
{ 422,696 },
{ 381,676 },
{ 350,654 },
{ 320,626 },
{ 292,606 },
{ 257,570 },
{ 230,540 },
{ 200,500 },
{ 180,470 },
{ 160,430 },
{ 140,390 },
{ 126,342 },
{ 117,293 },
{ 120,250 },
{ 133,203 },
{ 160,170 },
{ 200,140 },
{ 240,130 },
{ 280,135 },
{ 312,146 },
{ 340,170 },
{ 360,195 },
{ 375,230 }
};
然后坐标有了,我就可以实现字符串组成心形的功能了:
int main() {
initgraph(800, 800);
for (int i = 0; i < NUM; i++) {
settextcolor(RED);
outtextxy(arr[i].x, arr[i].y, "yyds");
Sleep(100);
}
接下来是一个个字符串出现
这个是很简单的一个功能,Sleep函数就成(Windows头的函数)
但是我想要一个花样的,我想要显示不同的字符串成为心形
那么我们想到字符数组
以下是我找的歌词并实现了这个功能
char buff[NUM][50] = {
"一封信",
"两年未都",
"没动笔",
"三个字",
"过了",
"几个四季",
"你是有",
"多想逃避",
"来不及",
"问问你",
"我已经",
"错过",
"相爱",
"的日期",
"那天你",
"消失在",
"人海里",
"你的背影",
"沉默的",
"让人恐惧",
"你说的",
"那些问题",
"我回答得",
"很坚定",
"偏偏",
"那个时候",
"我最想你",
"我不曾",
"爱过你",
"我自己",
"骗自己",
"已经给你",
"写了信",
"又被我",
"丢进海里",
"我不曾",
"爱过你",
"我自己",
"骗自己",
"明明觉得",
"自己",
"很冷静",
"却还",
"掉入",
"我自己",
"的陷阱"
};
int main(){
initgraph(800, 800);
for (int i = 0; i < NUM; i++) {
settextcolor(RED);
outtextxy(arr[i].x, arr[i].y, buff[i]);
Sleep(100);
}
}
我想要更骚一点的,不同字符串不同颜色
添加随机函数头和time头就可以
#include<time.h>
#include<conio.h>
int main(){
initgraph(800, 800);
srand(time(NULL));
for (int i = 0; i < NUM; i++) {
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
outtextxy(arr[i].x, arr[i].y, buff[i]);
Sleep(100);
}
}
接下来是字符串滚动:
如何让字体爱的魔力转圈圈呢?
很简单更换字符串就行,看我代码实现理解:
while (1) {
for (int i = 0; i < NUM; i++) {
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
outtextxy(arr[i].x, arr[i].y, buff[(i+n)%NUM]);
}
Sleep(500);
n++;
}
}
但是呢这里有个显著的问题就是,发现有的字没有跟着滚动(没有一起带走,留下了影分身!)
这是因为没有清屏:
while (1) {
for (int i = 0; i < NUM; i++) {
cleardevice();
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
outtextxy(arr[i].x, arr[i].y, buff[(i+n)%NUM]);
}
Sleep(500);
n++;
}
}
接下来是音乐相册的最重要部分了:贴图
IMAGE img;//图片类变量,声明
loadimage(&img1, "1.jpg", 200, 200, true);//加载1.jpg图片
putimage(300,300,&img1);//在300,300的位置上加载图片
但是我们音乐相册肯定不只是一张图片啊
那么先把这些图片都放到一个文件夹里,我这里放在了名为image的文件夹里,然后放在根目录下方便查找和写入
接下来有提到一个问题就是,我不想一个个声明,加载,图片太多了!!!
看我的操作:
IMAGE img[8];//图片变量声明成数组
char temp[256];
for (int i = 0;i<8;i++){
memset(temp, 0, sizeof(char) * 256);
sprintf_s(temp, "image\\%d.jpg", i+1 );//写成字符串一遍加载的使用
loadimage(&img[i], temp, 200, 200, true);
}
那么最后一步:图片切换
很简单就是putimage的参数变一变就行了循环一下,所以我添加到字符串滚动的后面就可以了:
while (1) {
cleardevice();
for (int i = 0; i < NUM; i++) {
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
outtextxy(arr[i].x, arr[i].y, buff[(i+n)%NUM]);
}
putimage(300, 300, &img[n%8]);
Sleep(500);
n++;
}
那么咱的功能实现都想好了,咱来组装一下:
1.创建窗口
2.一个个显示字符串并组成心形
3.播放音乐
4.字符串滚动,图片展示并开始切换
5.延时这样好看
那么整体代码就出来了
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<graphics.h>
#include<Windows.h>
#include<mmsystem.h>//一定要加Windows头文件
#pragma comment(lib,"winmm.lib")
const int NUM = 46;
struct point
{
int x;
int y;
};
point arr[NUM] = {
{ 395,268 },
{ 406,222 },
{ 416,193 },
{ 441,162 },
{ 468,133 },
{ 500,117 },
{ 537,105 },
{ 577,107 },
{ 617,120 },
{ 649,146 },
{ 666,173 },
{ 680,211 },
{ 683,247 },
{ 680,293 },
{ 675,338 },
{ 660,385 },
{ 640,440 },
{ 616,484 },
{ 588,529 },
{ 557,573 },
{ 530,610 },
{ 493,645 },
{ 460,675 },
{ 422,696 },
{ 381,676 },
{ 350,654 },
{ 320,626 },
{ 292,606 },
{ 257,570 },
{ 230,540 },
{ 200,500 },
{ 180,470 },
{ 160,430 },
{ 140,390 },
{ 126,342 },
{ 117,293 },
{ 120,250 },
{ 133,203 },
{ 160,170 },
{ 200,140 },
{ 240,130 },
{ 280,135 },
{ 312,146 },
{ 340,170 },
{ 360,195 },
{ 375,230 }
};
char buff[NUM][50] = {
"一封信",
"两年未都",
"没动笔",
"三个字",
"过了",
"几个四季",
"你是有",
"多想逃避",
"来不及",
"问问你",
"我已经",
"错过",
"相爱",
"的日期",
"那天你",
"消失在",
"人海里",
"你的背影",
"沉默的",
"让人恐惧",
"你说的",
"那些问题",
"我回答得",
"很坚定",
"偏偏",
"那个时候",
"我最想你",
"我不曾",
"爱过你",
"我自己",
"骗自己",
"已经给你",
"写了信",
"又被我",
"丢进海里",
"我不曾",
"爱过你",
"我自己",
"骗自己",
"明明觉得",
"自己",
"很冷静",
"却还",
"掉入",
"我自己",
"的陷阱"
};
int main() {
initgraph(800, 800);
srand(time(NULL));
IMAGE img[8];
char temp[256];
for (int i = 0;i<8;i++){
memset(temp, 0, sizeof(char) * 256);
sprintf_s(temp, "image\\%d.jpg", i+1 );
loadimage(&img[i], temp, 200, 200, true);
}
for (int i = 0; i < NUM; i++) {
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
outtextxy(arr[i].x, arr[i].y, buff[i]);
Sleep(100);
}
//putimage(300,300,&img[0]);
mciSendString("open 1.mp3", NULL, NULL, NULL);
mciSendString("play 1.mp3", NULL, NULL, NULL);
Sleep(3000);
int n = 0;
while (1) {
cleardevice();
for (int i = 0; i < NUM; i++) {
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
outtextxy(arr[i].x, arr[i].y, buff[(i+n)%NUM]);
}
putimage(300, 300, &img[n%8]);
Sleep(500);
n++;
}
}
这就是我的音乐相册,哈哈哈,我可以去给女朋友了!!!诶,好像,没有女朋友,呜呜呜呜