SDL第一个程序:加载一张图片

直接看代码吧

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        int flags = (Tao.Sdl.Sdl.SDL_INIT_VIDEO | Tao.Sdl.Sdl.SDL_INIT_TIMER |Tao.Sdl.Sdl.SDL_INIT_AUDIO);

        IntPtr surfacePtr;

        Tao.Sdl.Sdl.SDL_Rect rect;

        int width = , height = ;

        public Form1()

        {

            InitializeComponent();

            int i = ;

            i = Tao.Sdl.Sdl.SDL_Init(flags);

            if (i != )

            {

                MessageBox.Show("SDL初始化失败!");

                return;

            }

Tao.Sdl.Sdl.SDL_WM_SetCaption("SDL", "MY 1ST SDL");

IntPtr icoptr = Tao.Sdl.Sdl.SDL_LoadBMP("E:\\2.bmp");

            Tao.Sdl.Sdl.SDL_WM_SetIcon(icoptr, null);

            surfacePtr = Tao.Sdl.Sdl.SDL_SetVideoMode(width, height, ,Tao.Sdl.Sdl.SDL_SWSURFACE | Tao.Sdl.Sdl.SDL_RESIZABLE);

            rect = new Tao.Sdl.Sdl.SDL_Rect(, , (short)width, (short)height);

            Tao.Sdl.Sdl.SDL_Rect rect2 = new Tao.Sdl.Sdl.SDL_Rect(, , (short)width, (short)height);

            Tao.Sdl.Sdl.SDL_SetClipRect(surfacePtr, ref rect);

            IntPtr bmpptr = Tao.Sdl.Sdl.SDL_LoadBMP("E:\\1.bmp");

            Tao.Sdl.Sdl.SDL_BlitSurface(bmpptr, ref rect, surfacePtr, ref rect2);

            Tao.Sdl.Sdl.SDL_Flip(surfacePtr);

            Tao.Sdl.Sdl.SDL_UpdateRect(surfacePtr, , , rect.w, rect.h);

            Tao.Sdl.Sdl.SDL_FreeSurface(bmpptr);

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)

        {

            Tao.Sdl.Sdl.SDL_FreeYUVOverlay(yuv);

            Tao.Sdl.Sdl.SDL_FreeSurface(surfacePtr);

            Tao.Sdl.Sdl.SDL_Quit();

        }

    }

}

SDL第一个程序:加载一张图片

SDL的初始化函数SDL_Init()。该函数可以确定希望激活的子系统。SDL_Init()函数原型如下:

public static int SDL_Init(int flags);

其中,flags可以取下列值:

SDL_INIT_TIMER:定时器
SDL_INIT_AUDIO:音频
SDL_INIT_VIDEO:视频
SDL_INIT_JOYSTICK:摇杆
SDL_INIT_HAPTIC:触摸屏
SDL_INIT_GAMECONTROLLER:游戏控制器
SDL_INIT_EVENTS:事件
SDL_INIT_NOPARACHUTE:不捕获关键信号(这个不理解)
SDL_INIT_EVERYTHING:包含上述所有选项

SDL各个子系统

名称 

常量

说明

自动初始化

定时器

SDL_INIT_TIMER

0x00000001

初始化时间子系统

音频

SDL_INIT_AUDIO

0x00000010

初始化音频子系统

视频

SDL_INIT_VIDEO

0x00000020

初始化视频子系统

CDROM

SDL_INIT_CDROM

0x00000100

初始化CDROM子系统

游戏杆

SDL_INIT_JOYSTICK

0x00000200

初始化JOYSTICK子系统

错误捕获

SDL_INIT_NOPARACHUTE

0x00100000

避免捕获致命错误

线程

SDL_INIT_EVENTTHREAD

0x01000000

初始化线程子系统

全部子系统

SDL_INIT_EVERYTHING

0x0000FFFF

初始化上述所有子系统

SDL各个子系统

名称      常量         值     说明        自动初始化

定时器     SDL_INIT_TIMER            0x00000001     初始化时间子系统       否

音频         SDL_INIT_AUDIO           0x00000010     初始化音频子系统       否

视频         SDL_INIT_VIDEO     0x00000020     初始化视频子系统       否

CDROM   SDL_INIT_CDROM         0x00000100     初始化CDROM子系统        否

游戏杆     SDL_INIT_JOYSTICK        0x00000200     初始化JOYSTICK子系统      否

错误捕获         SDL_INIT_NOPARACHUTE      0x00100000     避免捕获致命错误       是

线程         SDL_INIT_EVENTTHREAD      0x01000000     初始化线程子系统       是

全部子系统     SDL_INIT_EVERYTHING          0x0000FFFF      初始化上述所有子系统      否

返回值:

-1  On error

0     On success

采用 SDL_SetVideoMode()来初始化屏幕。这个屏幕是特指SDL绘制的窗口,并不是指整个屏幕。

public extern static IntPtr SDL_SetVideoMode(int width, int height, int bpp, int flags);

width,height是输出高和宽,bitsperpixel 就是指bpp.即每点像素数,取值 8,16,32,值越大,说明屏幕表现力越丰富。它取决于显示器或LCD的硬件性能。一般桌面显示器是32.嵌入式设备的bpp可以用fbset 命令来查看。

flags 常见取值有如下(可以取多个值)

SDL_SWSURFACE :数据区建立在系统内存之上

SDL_HWSURFACE:数据区建立在显存之上

SDL_FULLSCREEN:全屏模式

SDL_NOFRAME:取消边框和标题栏

SDL_DOUBLEBUF:硬件双缓冲,必须与SDL_HWSURFACE同时使用。

把一个Surface数据拷入屏幕

public extern static int SDL_BlitSurface(IntPtr src, ref Sdl.SDL_Rect srcrect, IntPtr dst, refSdl.SDL_Rect dstrect);

这里dst是输出surface(不一定是屏幕Surface,也可以另外一个Surface).

dstrect是src在dst中相应的位置.

刷新屏幕

public extern static int SDL_Flip(IntPtr screen);

把更新后的Surface数据显示在屏幕上,SDL_BlitSurface数据加入屏幕后,不执行这一句,将不会更新到屏幕上显示。

部分更新屏幕

如果每次都更新整个屏幕,效率这样很低,可以用SDL_UpdateRect更新部分区域

public extern static void SDL_UpdateRect(IntPtr screen, int x, int y, int w, int h);

设置窗口图标

public extern static void SDL_WM_SetIcon(IntPtr icon, byte[] mask);

设置窗口标题

public extern static void SDL_WM_SetCaption(string title, string icon);

title 是窗口标题名字,如果是中文,必须是UTF-8编码。

icon 是窗口最小化采用显示文字。也采用UTF-8编码

上一篇:AKKA(一)认知AKKA


下一篇:PHP----------linux下如何安装redis扩展。安装redis可以在我的博客redis里面寻找。