• <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
            久久久久无码中| 一本久久知道综合久久| 国产精品久久久久久搜索| 久久精品亚洲精品国产色婷| 日本道色综合久久影院| 亚洲精品tv久久久久| 日本精品久久久中文字幕| 久久99精品久久久久久9蜜桃| 国产婷婷成人久久Av免费高清| 亚洲欧洲中文日韩久久AV乱码| 久久国产色AV免费观看| 久久夜色精品国产| 久久99国产一区二区三区| 久久精品aⅴ无码中文字字幕不卡| 久久久久国产成人精品亚洲午夜| 无码日韩人妻精品久久蜜桃 | 久久免费看黄a级毛片| 国产精品一久久香蕉产线看| 欧美激情精品久久久久久久| av无码久久久久不卡免费网站 | 久久久久精品国产亚洲AV无码| 久久国产香蕉视频| 91精品国产91久久久久福利| 久久精品一区二区三区AV| 午夜精品久久影院蜜桃| 久久久久人妻一区精品| 99久久这里只有精品| 久久影院综合精品| 国产精品无码久久久久久| 中文字幕久久波多野结衣av| 久久久人妻精品无码一区| 精品人妻伦九区久久AAA片69| 一本色道久久88加勒比—综合| 久久99国产精品一区二区| 久久久久久无码Av成人影院| 国色天香久久久久久久小说| 亚洲国产香蕉人人爽成AV片久久| 久久久久人妻精品一区三寸蜜桃| 99久久亚洲综合精品网站| 午夜精品久久久久久影视777 | 色妞色综合久久夜夜|