• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            若水居

            shaoyun的編程Blog
            隨筆 - 1, 文章 - 0, 評論 - 5, 引用 - 0
            數據加載中……

            SDL學習筆記一 圖片和字體顯示

            偶然得知SDL這個游戲庫,趕忙迫不及待的學習了一下,正好最近在學習DELPHI,于是下了DELPHI版的。可以在http://www.libsdl.org  http://www.delphi-jedi.org/這兩個站點了解到相關的信息。

            SDL庫設計的十分的簡潔,非常容易使用。我的代碼實例,實現了BMP、PNG、JPG三種圖片格式的加載顯示,并加入了TTF字體的顯示,都是庫使用的例子,代碼不難,發出來共享。以下是截圖:

            下面是代碼:
            //Program: A simple delphi sdl demo
            //Author: shaoyun
            //Mail: shaoyun at yeah.net (please use '@' instead of 'at')
            program SDLDemo;
            uses SysUtils, Windows, SDL, SDL_Image, SDL_TTF;
            var
               screen: PSDL_Surface;
               event: TSDL_Event;
               isOver:boolean=false;

            //*******************定義顯示位圖的函數draw_bmp()*************************
            //BMP格式的圖片通常都上MB了,誰會用這種格式做游戲
            procedure draw_bmp(surface:PSDL_Surface; img_path:PChar; x_pos:integer; y_pos:integer );
            var
               image : PSDL_Surface;
               dest:TSDL_Rect;
            begin
               image := SDL_LoadBMP(img_path);
            if ( image = nil ) then
            begin
               MessageBox(0, PChar(Format( ' Error:%s! ' #9, [SDL_GetError])), ' Error ' , MB_OK or MB_ICONHAND);
               exit;
            end;
            if (image.format.palette<>nil) then
            begin
              SDL_SetColors(surface, @image.format.palette.colors[0], 0, image.format.palette.ncolors);
            end;
              dest.x:=x_pos;
              dest.y:=y_pos;
              dest.w:=0;
              dest.h:=0;
            if (SDL_BlitSurface(image, nil, surface, @dest) < 0) then
              MessageBox(0, PChar(Format( ' BlitSurface error : %s ' , [SDL_GetError])), ' Error ' , MB_OK or MB_ICONHAND);
              SDL_UpdateRect(surface, 0, 0, image.w, image.h);
              SDL_FreeSurface(image);
            end;

            //*******************定義顯示圖片的函數draw_img()*************************
            //這個函數的調用須有SDL_Image.dll、jpeg.dll、libpng1.dll的支持 ,可以顯示bmp、jpg、png三種格式
            //文檔指明顯示png格式需要zlib.dll和libpng1.dll
            procedure draw_img(surface:PSDL_Surface; img_path:PChar; x_pos:integer; y_pos:integer);
            var
              image : PSDL_Surface;
              dest:TSDL_Rect;

            begin
              
            image:=IMG_Load(img_path);
               if image=nil then begin
                 MessageBox(0, PChar(Format( ' Error:%s! ' #9, [SDL_GetError])), ' Error ' , MB_OK or MB_ICONHAND);
                exit;
              end;
              dest.x:=x_pos;
              dest.y:=y_pos;
              dest.w:=0;
              dest.h:=0;
              SDL_BlitSurface ( image, nil, surface, @Dest );
              SDL_FreeSurface ( image );
            end;
            //*******************定義顯示TTF字體的函數draw_text()*************************
            //不能顯示中文,不過網上有人實現了中文的顯示
            procedure draw_text(surface:PSDL_Surface; words:PChar; x_pos:integer; y_pos:integer );
            var

              text : PSDL_Surface;
              font : PTTF_Font;
              dest: TSDL_Rect;
              textColor : TSDL_Color;
            begin
              textcolor.r:=$00;
              textcolor.g:=$FF;
              textcolor.b:=$00;
              textcolor.unused:=0;
              font:= TTF_OpenFont( ' simhei.ttf ' ,20);
            if font=nil then
            begin
               MessageBox(0, PChar(Format( ' Error:%s! ' #9, [SDL_GetError])), ' Error ' , MB_OK or MB_ICONHAND);
               exit;
            end;
               text:= TTF_RenderText_Blended(font,words, textColor);
               dest.x:=x_pos;
               dest.y:=y_pos;
               SDL_BlitSurface ( text, nil, surface, @Dest );
               SDL_Flip(screen);
               SDL_FreeSurface ( text );
               TTF_CloseFont( font );
            end;
            //*****************************Main***************************// 
            begin
               if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) then
               begin
                exit;
               end;
              
            SDL_WM_SetCaption( ' Delphi SDL Simple Demo ' , nil );
               screen:= SDL_SetVideoMode( 640,480,32, SDL_SWSURFACE );//設置分辨率
               if ( screen = nil ) then
               begin
                SDL_Quit;
                exit;
               end;
               //draw_bmp(screen,'bg.bmp',0,0);
               draw_img(screen, ' bg.jpg ' ,0,0);
               //TTF初始化
               if TTF_Init()<0 then
              
            begin
                 MessageBox(0, PChar(Format( ' Error:%s! ' #9, [SDL_GetError])), ' Error ' , MB_OK or MB_ICONHAND);
                 exit;
               end;
               draw_text(screen, ' A Delphi SDL Simple Demo ' ,30,30);
               draw_text(screen, ' By shaoyun ' ,380,400); draw_text(screen, ' E-mail: shaoyun@yeah.net ' ,380,430);
               //銷毀TTF
               TTF_Quit();
               while not isOver do
               begin
                 while (SDL_PollEvent(@event)<>0) do //處理鍵盤按鍵
                 begin
                   case of
                     SDL_QUITEV: isOver:=true;
                     SDL_KEYDOWN:
                     begin
                        case event.key.keysym.sym of
                           SDLK_ESCAPE: isOver:= True;
                        end;
                     end;
                   end;
                 end;
               end;
               SDL_Quit;
            end.

            posted on 2007-07-27 18:04 shaoyun 閱讀(3127) 評論(5)  編輯 收藏 引用 所屬分類: Delphi

            評論

            # re: SDL學習筆記一 圖片和字體顯示  回復  更多評論   

            對SDL感興趣可以看看
            http://lazyfoo.net/SDL_tutorials/index.php

            http://sol.gfxile.net/gp/
            2007-07-27 21:23 | zhongwx

            # re: SDL學習筆記一 圖片和字體顯示  回復  更多評論   

            我在C++里是這樣的直接用中文的
            message = TTF_RenderUNICODE_Blended( font, (const Uint16 *)L"嗨,世界~", textColor );
            2007-07-28 03:30 | func

            # re: SDL學習筆記一 圖片和字體顯示[未登錄]  回復  更多評論   

            代碼可以用插入代碼,這樣看起來比較好!
            2007-07-28 10:01 | 夢在天涯

            # re: SDL學習筆記一 圖片和字體顯示  回復  更多評論   

            怎么沒有接著寫下去,挺好的
            2008-06-26 00:55 | Onet

            # re: SDL學習筆記一 圖片和字體顯示  回復  更多評論   

            delhi版的SDL庫我一直沒找著,你說的那個網站我也去看了,還是沒有找到,麻煩你給個下載地址,和在DELPHI里的設置方法,謝謝。
            2008-07-07 09:45 | DELPHIGAMER
            亚洲国产成人精品女人久久久| 欧美大香线蕉线伊人久久| 国内精品久久国产大陆| 国产美女久久久| 天天影视色香欲综合久久| 国内精品综合久久久40p| 久久99国产综合精品免费| 久久人人爽人人精品视频| 日产精品久久久久久久性色| 国产成人精品久久二区二区 | 99久久久国产精品免费无卡顿| 久久久久久免费一区二区三区| 色综合久久88色综合天天 | 欧洲精品久久久av无码电影| 日本精品久久久久久久久免费| 精品久久久久久中文字幕人妻最新| 久久人人爽人爽人人爽av| 国产精品18久久久久久vr | 亚洲人成电影网站久久| 久久综合九色综合97_久久久| 99精品国产综合久久久久五月天| 亚洲国产成人久久精品动漫| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 久久综合久久综合久久| 99久久精品免费看国产一区二区三区| 久久精品国产99国产精品| 国产精品一久久香蕉国产线看 | 久久久久亚洲av无码专区喷水| 久久久久一本毛久久久| 伊人久久综在合线亚洲2019| 国产精品久久国产精品99盘 | 亚洲va久久久噜噜噜久久狠狠 | 99久久精品日本一区二区免费 | 欧美激情精品久久久久久| 国产91久久精品一区二区| 久久久婷婷五月亚洲97号色| 99久久夜色精品国产网站| 亚洲国产精品无码久久一线| 精品一二三区久久aaa片| 人人妻久久人人澡人人爽人人精品| 色诱久久av|