关闭

SDL简单动画

标签: sdl动画图片
579人阅读 评论(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);
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

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

一个SDL2.0程序的分析

。。
  • u011258240
  • u011258240
  • 2016-09-13 10:57
  • 524

linux图形编程之SDL

SDL startSDL是编写跨平台游戏和多媒体应用的支持库,包含了对图形、声音、游戏杆、线程等支持,内容丰富、应用广泛。 ubuntu15.04上安装SDL: Source Code在 http://www.libsdl.org/download-1.2.php上,下载SDL-1.2.15.t...
  • theArcticOcean
  • theArcticOcean
  • 2017-01-14 16:22
  • 1575

SDL在vc6.0中的简单应用

摘自:http://apps.hi.baidu.com/share/detail/38928436 简单的象素绘制 下文从使用SDL的编程函数开始,介绍了如何使用SDL在屏幕上进行象素绘制的基本知识,并给出了一个简单的例子。 如果要在VC中用SDL库,必须在源文件头部包含以下头文...
  • hustbin
  • hustbin
  • 2013-11-24 00:00
  • 1261

SDL2.0 学习笔记-1 windows下的第一个测试程序

SDL2.0 学习笔记-1 windows下的第一个测试程序 SDL全称是Simple DirectMedia Layer,是一个开源的、跨平台(win32,linux,mac)的多媒体开发c语言库。 官方网站 http://www.libsdl.org/   第一步,下载源文...
  • q236050650
  • q236050650
  • 2013-12-16 13:19
  • 5976

SDL2.0例子代码分析---代码运行平台检测

简介 SDL2.0例子程序中的 testplatform项目代码分析 ,针对不同的平台 检测字节序 CPU支持的指令集 类型宽度 以及断言 代码+注释 #include #include "SDL.h" #include &...
  • yue7603835
  • yue7603835
  • 2014-12-20 01:14
  • 2529

最简单的基于FFMPEG+SDL的音视频播放器

一、概述         在《最简单的基于FFMPEG+SDL的音频播放器》记录一中,我们实现了音频的播放。更早前,我们在《最简单的基于FFMPEG+SDL的视频播放器》记录一和二中,实现了视频的播放。在实现视频播放的时候,我们设置了一个延迟40ms,否则视频...
  • GAMEloft9
  • GAMEloft9
  • 2015-06-21 20:43
  • 933

利用javascript实现简单动画效果。

利用javascript的setTimeout()函数可以实现简单的动画效果。setTimeout()函数有两个参数,第一个参数是一个字符串,其内容是将要执行的哪个函数的名字;第二个参数是一个数值,它以毫秒为单位设定了需要经过多长时间才开始执行第一个参数所给出的函数。 setTimeout(&quo...
  • qq_32600929
  • qq_32600929
  • 2016-11-03 11:35
  • 1308

Html5的CSS3的transition实现简单动画效果

运行的效果如下: 当鼠标移动时,实现宽度变化的动画效果 Html部分代码如下: 标题党 内容 标题党 内容 ...
  • Qiustion
  • Qiustion
  • 2015-07-02 16:16
  • 1452

jquery简单动画效果实践(一)

这篇博客将介绍一个简单的jquery动画 js完成了DOM的状态切换,通过鼠标进入事件记录了当前的激活列,并且清除了之前的激活列。 css定义了不同状态的形态,以及形态切换的姿势。 接下来将会涉及到: CSS Jquery 作品目标:CSS浮动四列布局的基础上为每一列增加鼠标进入事件,从而...
  • u014733848
  • u014733848
  • 2016-09-17 16:31
  • 374
    个人资料
    • 访问:331303次
    • 积分:8856
    • 等级:
    • 排名:第2517名
    • 原创:575篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论