• <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, 評(píng)論 - 5, 引用 - 0
            數(shù)據(jù)加載中……

            SDL學(xué)習(xí)筆記一 圖片和字體顯示

            偶然得知SDL這個(gè)游戲庫(kù),趕忙迫不及待的學(xué)習(xí)了一下,正好最近在學(xué)習(xí)DELPHI,于是下了DELPHI版的。可以在http://www.libsdl.org  http://www.delphi-jedi.org/這兩個(gè)站點(diǎn)了解到相關(guān)的信息。

            SDL庫(kù)設(shè)計(jì)的十分的簡(jiǎn)潔,非常容易使用。我的代碼實(shí)例,實(shí)現(xiàn)了BMP、PNG、JPG三種圖片格式的加載顯示,并加入了TTF字體的顯示,都是庫(kù)使用的例子,代碼不難,發(fā)出來(lái)共享。以下是截圖:

            下面是代碼:
            //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;

            //*******************定義顯示位圖的函數(shù)draw_bmp()*************************
            //BMP格式的圖片通常都上MB了,誰(shuí)會(huì)用這種格式做游戲
            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;

            //*******************定義顯示圖片的函數(shù)draw_img()*************************
            //這個(gè)函數(shù)的調(diào)用須有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字體的函數(shù)draw_text()*************************
            //不能顯示中文,不過(guò)網(wǎng)上有人實(shí)現(xiàn)了中文的顯示
            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 );//設(shè)置分辨率
               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);
               //銷(xiāo)毀TTF
               TTF_Quit();
               while not isOver do
               begin
                 while (SDL_PollEvent(@event)<>0) do //處理鍵盤(pán)按鍵
                 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 閱讀(3132) 評(píng)論(5)  編輯 收藏 引用 所屬分類(lèi): Delphi

            評(píng)論

            # re: SDL學(xué)習(xí)筆記一 圖片和字體顯示  回復(fù)  更多評(píng)論   

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

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

            # re: SDL學(xué)習(xí)筆記一 圖片和字體顯示  回復(fù)  更多評(píng)論   

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

            # re: SDL學(xué)習(xí)筆記一 圖片和字體顯示[未登錄](méi)  回復(fù)  更多評(píng)論   

            代碼可以用插入代碼,這樣看起來(lái)比較好!
            2007-07-28 10:01 | 夢(mèng)在天涯

            # re: SDL學(xué)習(xí)筆記一 圖片和字體顯示  回復(fù)  更多評(píng)論   

            怎么沒(méi)有接著寫(xiě)下去,挺好的
            2008-06-26 00:55 | Onet

            # re: SDL學(xué)習(xí)筆記一 圖片和字體顯示  回復(fù)  更多評(píng)論   

            delhi版的SDL庫(kù)我一直沒(méi)找著,你說(shuō)的那個(gè)網(wǎng)站我也去看了,還是沒(méi)有找到,麻煩你給個(gè)下載地址,和在DELPHI里的設(shè)置方法,謝謝。
            2008-07-07 09:45 | DELPHIGAMER

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            午夜精品久久久久久影视riav| 久久综合九色欧美综合狠狠| 要久久爱在线免费观看| 久久天天躁狠狠躁夜夜av浪潮| 九九久久自然熟的香蕉图片| 久久综合久久综合久久综合| 26uuu久久五月天| 日日狠狠久久偷偷色综合0| 久久久久人妻一区精品| 中文精品99久久国产| 久久毛片免费看一区二区三区| 99久久国产热无码精品免费久久久久 | 青青青青久久精品国产 | 久久久亚洲精品蜜桃臀| 久久精品亚洲精品国产欧美| 久久精品免费大片国产大片| 91亚洲国产成人久久精品网址 | 国产69精品久久久久久人妻精品 | 久久久www免费人成精品| 99久久精品国产麻豆| 亚洲精品无码久久久| 色欲综合久久躁天天躁| 久久久久青草线蕉综合超碰| 亚洲精品乱码久久久久久蜜桃不卡| 99精品久久久久久久婷婷| 久久人人爽人人精品视频| 亚洲国产日韩欧美久久| 亚洲精品国精品久久99热一| 久久久精品免费国产四虎| 久久综合亚洲色HEZYO国产| 久久久无码精品亚洲日韩按摩 | 久久这里都是精品| 久久精品国产亚洲av日韩| 国内精品欧美久久精品| av无码久久久久久不卡网站| 91精品国产91久久久久久青草| 中文字幕精品无码久久久久久3D日动漫 | 国产亚洲成人久久| 亚洲综合精品香蕉久久网| 精品久久久久久无码中文字幕 | 人妻丰满?V无码久久不卡|