zoukankan      html  css  js  c++  java
  • 使用SDL打造游戏世界之入门篇 5

    同时,由于绘制的屏幕不能同时接受两个函数的同时操作,我们需要其他两个辅助函数,用于在绘制前对屏幕进行锁定,以及在绘制完成之后解除锁定。这两个 工作一般由SDL_MUSTLOK(SDL_Surface *screen)和SDL_UnlockSurface(SDL_Surface *screen)完成。使用如下两个自定义的函数会更加简单:

    void Slock(SDL_Surface *screen)
    {
    if ( SDL_MUSTLOCK(screen) )
    {
    if ( SDL_LockSurface(screen) < 0 )
    {
    return;
    }
    }
    }
    void Sulock(SDL_Surface *screen)
    {
    if ( SDL_MUSTLOCK(screen) )
    {
    SDL_UnlockSurface(screen);
    }
    }

    这样,我们可以得到一个简单的主程序框架如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include "SDL.h"

    // The functions are not shown to save space
    void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B);
    void Slock(SDL_Surface *screen);
    void Sulock(SDL_Surface *screen);

    int main(int argc, char *argv[])
    {
    if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
    {
    printf("Unable to init SDL: %s"n", SDL_GetError());
    exit(1);
    }
    atexit(SDL_Quit);
    SDL_Surface *screen;
    screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( screen == NULL )
    {
    printf("Unable to set 640x480 video: %s"n", SDL_GetError());
    exit(1);
    }

    // DRAWING GOES HERE
    return 0;
    }

    如果对该程序进行编译运行,那么只能得到一闪而过的一个黑色的窗口。我们需要对窗口进行绘制,并且对基本的键盘鼠标事件进行处理。

    绘制的基本原理是,先在缓冲区绘制,再一次性将缓冲区绘制到屏幕上。这样比起一次一个象素点在屏幕上绘图的方式效率更高,速度更快,也不易出错。首先使 用循环在screen所指向的surface(缓冲区)上绘制,然后调用SDL_Flip函数将screen surface绘制到真实电脑屏幕上。SDL_Flip函数的作用是:在支持双缓冲(double-buffering)的硬件上,建立flip并返回。 硬件将等待vertical retrace,然后在下一个视频surface blit或者执行锁定返回前交换视频缓冲区。如果硬件不支持双缓冲,那么等同于调用SDL_UpdateRect(screen, 0, 0, 0, 0),即对整个screen的绘制区域进行刷新。

    void DrawScene(SDL_Surface *screen)
    {
    Slock(screen);
    for(int x=0;x<640;x++)
    {
    for(int y=0;y<480;y++)
    {
    DrawPixel(screen, x,y,y/2,y/2,x/3);
    }
    }
    Sulock(screen);
    SDL_Flip(screen);
    }

    在SDL中对采用结构SDL_Event来描述事件,并采用轮询的机制对事件进行处理,程序中使用一个SDL_Event的实例(Instance)来检查事件的发生:

    SDL_Event event;

    轮询采用while循环来检查:

    while ( SDL_PollEvent(&event))
    {
    if ( event.type == SDL_QUIT)
    {
    //code here….
    }
    if ( event.type == SDL_KEYDOWN)
    {
    //code here….
    }
    //…..
    }

    事件轮询完毕之后,调用DrawScene(sreen)进行一次绘制。 更多文章 更多内容请看游戏开发网络游戏攻略Solaris基础知识入门专题,或进入讨论组讨论。
  • 相关阅读:
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】团队贡献分分配规则
    【二食堂】Alpha
    【二食堂】Alpha
    Scrum Meeting 10
    Scrum Meeting 9
  • 原文地址:https://www.cnblogs.com/Henrya2/p/1420866.html
Copyright © 2011-2022 走看看