#include <SDL.h>
#include <stdio.h>
//让图片动起来
int main(int argc, char ** argv)
{
SDL_Surface * screen; //主表面
SDL_Surface * image; //用来放MM-----的图片信息(像素)
SDL_Event event;
bool bAppRun = true;
bool bTopBottom = true; //为true时向下移动,为false时向上移动
bool bLeftRight = true; //为true时向又移动,为false时向左移动
Uint32 TimeBegin, TimeEnd; //TimeBegin存放时间的开始数据,TimeEnd存放时间的结束数据
SDL_Rect MMRect;//看看它有什么用
//初始化SDL加上SDL_INIT_TIMER标志,这里我们要用时间
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
fprintf(stderr, "SDL_Init %s\n", SDL_GetError());
return -1;
}
//初始化成功设置退出要调用的函数SDL_Quit
atexit(SDL_Quit);
//创建一个640X480 16-bit 模式的主表面 16位可以让MM的效果好看一点
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if (screen == NULL) {
fprintf(stderr, "Couldn't set 640x480x8 video mode %s\n",
SDL_GetError());
return -1;
}
//读取MM图片信息,并创建一个表面,并把数据填入该表面中。
image = SDL_LoadBMP("./mm.bmp"); //请在终端里运行该程序
if (image == NULL) {
fprintf(stderr, "Couldn't load MM, %s\n", SDL_GetError()); //遗憾你不能显示MM了,不过你可以用图片浏览程序看。
return -1;
}
//初始化MMRect
MMRect.x = 0;
MMRect.y = 0;
MMRect.w = image->w;
MMRect.h = image->h;
//有了MM的表面了,就可以显示了。
//将MM的表面画在我们的主表面上
if (SDL_BlitSurface(image, NULL, screen, &MMRect) < 0) {
//解释一下NULL,第一个是按照image的尺寸显示,第二个是默认显示。你也可以指定大小,不过要用到SDL_Rect你可以看一看帮助。
fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧
//退出了程序释放MM表面的资源
SDL_FreeSurface(image);
return -1;
}
//好了更新显示画出MM
SDL_UpdateRect(screen, 0, 0, image->w, image->h);
//获取一个时间滴答
TimeBegin = SDL_GetTicks();
while (bAppRun) {
//消息循环
if (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYDOWN:
//按下任意键退出
bAppRun = false;
break;
}
}
//获取时间滴答
TimeEnd = SDL_GetTicks();
if ((TimeEnd - TimeBegin) > 25) { //判断时间滴答是否大于了25ms
//达到了25ms
//交换数据
TimeBegin = TimeEnd;
//先用黑色清除背景
SDL_FillRect(screen, &MMRect, 0);
//下面只是一个小把戏,留给大家自己分析.
if (bTopBottom) {
if ((MMRect.y + MMRect.h + 5) < screen->h) {
MMRect.y += 5;
}
else {
bTopBottom = false;
MMRect.y = screen->h - MMRect.h;
}
} else {
if ((MMRect.y - 5) > 0) {
MMRect.y -= 5;
}
else {
bTopBottom = true;
MMRect.y = 0;
}
}
if (bLeftRight) {
if ((MMRect.x + MMRect.w + 5) < screen->w) {
MMRect.x += 5;
}
else {
bLeftRight = false;
MMRect.x = screen->w - MMRect.w;
}
} else {
if ((MMRect.x - 5) > 0) {
MMRect.x -=5;
}
else {
bLeftRight = true;
MMRect.x = 0;
}
}
//将MM的表面画在我们的主表面上
if (SDL_BlitSurface(image, NULL, screen, &MMRect) < 0) {
fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧
//退出了程序释放MM表面的资源
SDL_FreeSurface(image);
return -1;
}
//更新显示
SDL_Flip(screen);
}
}
//退出了程序释放MM表面的资源
SDL_FreeSurface(image);
return 0;
}
SDL中文简约教程(网页版)
5星 · 超过95%的资源 需积分: 49 86 浏览量
2009-04-01
21:59:22
上传
评论
收藏 78KB RAR 举报
zuoziwang
- 粉丝: 1
- 资源: 12
最新资源
- 基于springboot+layui的医院日常耗材管理系统.zip
- 计算机毕业设计-ASP.NET教育报表管理系统-权限管理模块(源代码+)-毕设源码实例.zip
- 计算机毕业设计-ASP.NET教务信息管理系统的设计与实现(源代码+)-毕设源码实例.zip
- Eleven的精益供应链管理-碓胤咨询龚胤全.rar
- 5套光伏、储能、充电收益测算表.zip
- C2 供应链集成演示平台操作手册(详细版).rar
- 3套光储充一体化站CAD+PDF图纸.zip
- Screenshot_20240426_195831_com.huawei.android.launcher.jpg
- 2000-2023年各省专利侵权结案数据.xlsx
- C#使用NPOI操作合并单元格
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈