SDL简单动画

标签: sdl 动画 图片
705人阅读 评论(4) 收藏 举报
分类:

动画是利用人类的视觉特点被创造出来的艺术品。图像在不同的时间和位置出现可以产生一定的视觉特效。SDL程序可以制作动画。想要制作出动画的效果,就需要把握好单位时间内出现的图片数量这一个因素。一般来说,一秒24帧可以得到流畅的动画场景。那么两张图像的时间间隔保持约为41666 microseconds.
下面例子中的GIF图片是GifCam.exe截屏制成。

  • 制作一个简单动画:
    红色的圆圈不断扩大,周而复始。整个窗口在一段时间后自动关闭。
    可以使用alarm函数可以实现“计时”,或者SDL_GetTicks判断时间再终止。想要之前所画的圆消失,可以用不同的颜色再画一次,将其抹去。
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <string.h>
#include <math.h>
#include <SDL_draw.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
    SDL_Surface *screen = SDL_SetVideoMode(240,240,16,SDL_SWSURFACE);
    if(screen == NULL){
        fprintf(stderr,"SDL_SetVideoMode error %s\n",SDL_GetError());
        exit(1);
    }   
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        fprintf(stderr,"SDL_INIT_VIDEO error %s\n",SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit);
    int us = 41666*2;   
    while(1){
        if(SDL_GetTicks()>10000) exit(0);
        int r;
        for(r=0;r<=80;r+=10){
            Draw_Circle(screen,120,120,r,SDL_MapRGB(screen->format,255,0,0));
            SDL_UpdateRect(screen,0,0,0,0);
            Draw_Circle(screen,120,120,r-10,SDL_MapRGB(screen->format,0,0,0));
            SDL_UpdateRect(screen,0,0,0,0);
            usleep(us);
        }
        Draw_Circle(screen,120,120,r-10,SDL_MapRGB(screen->format,0,0,0));
        SDL_UpdateRect(screen,0,0,0,0);
        usleep(us);
    }
    return 0;
}

编译运行:

edemon@ubuntu1:~/workspace$ cat draw_circle.sh
export CFLAGS="`sdl-config --cflags` -I/home/edemon/SDL_draw-1.2.13/include"
export LIBS="`sdl-config --libs` /home/edemon/SDL_draw-1.2.13/src/.libs/libSDL_draw.a"
gcc -o draw_circle draw_circle.c -Wall $CFLAGS $LIBS -lm
edemon@ubuntu1:~/workspace$ ./draw_cricle

这里写图片描述

  • 制作动画:红色的小球在方块范围内不断运动,碰到边界则反弹。当用户敲击任意键后程序结束。
    制作一个小球的bmp位图图片,背景是白色。然后用SDL_FillRect函数将屏幕背景也变成白色。在41666us的时间间隔下不断更新自己的位置。
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <string.h>
#include <math.h>
#include <SDL_draw.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

SDL_Surface *image;
void handler(){
    SDL_FreeSurface(image);
    exit(0);
}
int main(){
    SDL_Surface *screen = SDL_SetVideoMode(340,340,16,SDL_SWSURFACE);
    unsigned int color;
    SDL_Event event;
    image = SDL_LoadBMP("ball.bmp");
    if(screen == NULL){
        fprintf(stderr,"SDL_SetVideoMode error %s\n",SDL_GetError());
        exit(1);
    }   
    if(image == NULL){
        fprintf(stderr,"SDL_LoadBMP error %s\n",SDL_GetError());
        exit(1);
    }
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        fprintf(stderr,"SDL_INIT_VIDEO error %s\n",SDL_GetError());
        exit(1);
    }
    color = SDL_MapRGB(screen->format,255,255,255);
    atexit(SDL_Quit);
    SDL_Rect rect;
    rect.x = 100;
    rect.y = 70;
    rect.w = image->w;
    rect.h = image->h;
    SDL_FillRect(screen,NULL,color);
    SDL_BlitSurface(image,NULL,screen,&rect);
    SDL_UpdateRect(screen,0,0,0,0);
    int rightleft = 1, updown = 1;  // for rightleft, 1 means right, 0 means left; for updown, 1 means down, 0 means up.
    int speed = 4;
    while(1){
        if(SDL_PollEvent(&event) && event.type == SDL_KEYDOWN) handler();
        usleep(41666);
        if(rightleft){
            if(rect.x+rect.w+speed<screen->w){
                rect.x+=speed;
            }   
            else {
                rect.x-=speed;
                rightleft = 0;
            }
        }
        else {
            if(rect.x-speed>0){
                rect.x-=speed;
            }
            else {
                rect.x+=speed;
                rightleft = 1;
            }
        }

        if(updown){
            if(rect.y+rect.h+speed<screen->h){
                rect.y+=speed;
            }
            else {
                rect.y-=speed;
                updown = 0;
            }
        }
        else {
            if(rect.y-speed>0){
                rect.y-=speed;
            }
            else {
                rect.y+=speed;
                updown = 1;
            }
        }
        SDL_BlitSurface(image,NULL,screen,&rect);
        SDL_Flip(screen);
    }
    //SDL_Delay(5000);
    return 0;
}

编译执行:

edemon@ubuntu1:~/workspace$ cat move.sh
export CFLAGS="`sdl-config --cflags` -I/home/edemon/SDL_draw-1.2.13/include"
export LIBS="`sdl-config --libs` /home/edemon/SDL_draw-1.2.13/src/.libs/libSDL_draw.a"
gcc -o move move.c -Wall $CFLAGS $LIBS -lm
edemon@ubuntu1:~/workspace$ ./move

这里写图片描述
———————————————————————-
17.04.17 更新:
注意,矩形小球图片需要保证小球和矩形图片边界保留一定的白色空间,不然你很可能得到这样的效果:

这里写图片描述
当然,可以自己添加类似于下面的函数,解决这个问题,不过存在闪烁的副作用。

void deleteRec(SDL_Rect *Rec){
    SDL_FillRect(screen,Rec,color);     /* sweep past the trace before */
    SDL_UpdateRect(screen, 0, 0, 0, 0);
}
查看评论

用ADO进行数据库编程

使用ADO6.1    概述ADO是ActiveX数据对象(ActiveX Data Object),这是Microsoft开发数据库应用程序的面向对象的新接口。ADO访问数据库是通过访问OLE DB...
  • zzh
  • zzh
  • 2000-08-11 16:07:00
  • 1368

利用SDL编程做一个简单的动画;

利用SDL编程做一个简单的动画; #include #include #include int main(int argc,char **argv) {   SDL_Surface...
  • crystal19890426
  • crystal19890426
  • 2014-05-16 20:50:02
  • 898

SDL游戏之路(九)--动画制作

动画制作
  • ycg01
  • ycg01
  • 2014-01-15 22:11:41
  • 1505

SDL入门教程(四):2、SDL动画的硬件渲染(Hardware Render)

作者:龙飞 2.1:需要修改的地方。         这里,我们真正的开始使用SDL的硬件渲染。首先,我们需要设置驱动的环境(以windows为例,我们设置为directx,Linux的设...
  • guoduhua
  • guoduhua
  • 2012-09-10 10:05:32
  • 989

SDL入门教程(四):1、SDL动画的软件渲染(Software Render)

作者:龙飞1.1:准备工作。        准备一张640*480的bmp位图(back.bmp)作为背景,另外一张小一点的(比如100*100的front.bmp)作为前景。        渲染(r...
  • lf426
  • lf426
  • 2008-02-15 18:00:00
  • 2263

SDL入门教程(十三):1、多线程,从动画说起

作者:龙飞1.1:简单动画        游戏离不开动画。我们考虑最简单的情况:将一个角色从一个位置移动到另外一个位置。这个行为表述给电脑就是,将一个surface不断的blit(),从起始位置的坐标...
  • lf426
  • lf426
  • 2008-07-16 01:20:00
  • 1646

SDL简单动画

动画是利用人类的视觉特点被创造出来的艺术品。图像在不同的时间和位置出现可以产生一定的视觉特效。SDL程序可以制作动画。想要制作出动画的效果,就需要把握好单位时间内出现的图片数量这一个因素。一般来说,一...
  • theArcticOcean
  • theArcticOcean
  • 2017-01-16 18:24:21
  • 705

linux 基于<em>SDL</em>简单<em>动画</em>设计

举报人: 被举报人: abc0032 举报的资源分: 10 *类型: *详细原因: 取  消 提  交 linux 基于<em>SDL</em>简单<em>动画</em>设计 10积分 立即下载 ...
  • 2018年04月06日 00:00

<em>SDL+</em>C简单游戏例子

//用来测试的图片 <em>SDL</em>_Event event; Uint32 BeginTicks, EndTicks; <em>SDL</em>_Rect PRect, BRect; //PRect对应精灵的移动的小图位置(实现<em>动画</em>),BRect对应精灵在屏幕...
  • 2018年04月14日 00:00

js—<em>动画</em>库

<em>sdl</em>-14<em>sdl动画</em>库 帧 立即下载 上传者: buttontwo 时间: 2010-09-26 综合评分: 0 积分/C币:3 css+js实现跳动<em>动画</em> 立即下载 上传者: 虫虫教父 时间: ...
  • 2018年04月14日 00:00
    个人资料
    持之以恒
    等级:
    访问量: 37万+
    积分: 9448
    排名: 2423
    我的链接
    最新评论