• <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
            數(shù)據(jù)加載中……

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

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

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

            下面是代碼:
            //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了,誰會用這種格式做游戲
            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()*************************
            //不能顯示中文,不過網(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);
               //銷毀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 閱讀(3140) 評論(5)  編輯 收藏 引用 所屬分類: Delphi

            評論

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

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

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

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

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

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

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

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

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

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

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

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


            久久久久久午夜精品| 色综合久久中文综合网| 久久九九久精品国产| 日韩AV毛片精品久久久| 久久精品国产乱子伦| 久久国产成人精品麻豆| 久久精品国产一区二区三区不卡| 美女久久久久久| 99久久超碰中文字幕伊人| 亚洲国产精品久久66| 97精品伊人久久久大香线蕉 | 99精品国产99久久久久久97| 久久人人爽人人爽人人AV| 狠狠色丁香婷婷综合久久来 | 亚洲欧美国产精品专区久久 | 一本一道久久a久久精品综合| 亚洲综合伊人久久大杳蕉| 99久久亚洲综合精品网站| 日韩精品久久无码中文字幕| 国产精品久久久久久久久久免费| 99久久这里只精品国产免费| 久久久久亚洲av成人无码电影 | 品成人欧美大片久久国产欧美...| 日本精品久久久久影院日本| 欧美久久综合性欧美| 欧洲人妻丰满av无码久久不卡 | 中文字幕日本人妻久久久免费| 久久中文字幕一区二区| 亚洲国产美女精品久久久久∴ | 亚洲精品高清国产一线久久| 亚洲国产成人精品91久久久| 国产精品一区二区久久精品无码 | 亚洲AⅤ优女AV综合久久久| 久久精品国产只有精品2020| AAA级久久久精品无码片| 人妻久久久一区二区三区| 一本久久a久久精品vr综合| 国产成人久久精品一区二区三区| 久久久久亚洲AV成人网人人软件| 精品久久久久一区二区三区| 久久久久亚洲AV无码专区桃色|