• 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 = 640, height = 480;
    
     
    
            public Form1()
    
            {
    
                InitializeComponent();
    
     
    
                int i = 0;
    
                i = Tao.Sdl.Sdl.SDL_Init(flags);
    
                if (i != 0)
    
                {
    
                    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, 0,Tao.Sdl.Sdl.SDL_SWSURFACE | Tao.Sdl.Sdl.SDL_RESIZABLE);
    
                rect = new Tao.Sdl.Sdl.SDL_Rect(0, 0, (short)width, (short)height);
    
                Tao.Sdl.Sdl.SDL_Rect rect2 = new Tao.Sdl.Sdl.SDL_Rect(0, 0, (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, 0, 0, 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_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 widthint heightint bppint 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 srcref Sdl.SDL_Rect srcrectIntPtr dstrefSdl.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 screenint xint yint wint h);

     

    设置窗口图标

    public extern static void SDL_WM_SetIcon(IntPtr iconbyte[] mask);

    设置窗口标题

    public extern static void SDL_WM_SetCaption(string titlestring icon);

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

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

  • 相关阅读:
    hive从入门到放弃(一)——初识hive
    LeetCode 2040. Kth Smallest Product of Two Sorted Arrays
    LeetCode weekly contest 278 (amazon pay)
    LeetCode Weekly Contest 281
    《前端运维》一、Linux基础06Shell流程控制
    《前端运维》一、Linux基础05Shell运算符
    一比一还原axios源码(二)—— 请求响应处理
    一比一还原axios源码(八)—— 其他功能
    一比一还原axios源码(三)—— 错误处理
    《前端运维》一、Linux基础04Shell变量
  • 原文地址:https://www.cnblogs.com/jhlong/p/5433841.html
Copyright © 2020-2023  润新知