使用TTF_RENDERGLYPH_SOLID时出错

时间:2014-01-12 23:54:41

标签: sdl pascal

PASCAL中的这个简短程序应该显示一个简单的文本,但我得到一个错误: “Project My Application在地址71002A95处提出异常类外部SIGSEGV”

PROGRAM chap5;

USES SDL,SDL_TTF;

VAR  
screen, fontface:pSDL_SURFACE;   
loaded_font:pointer;  
colour_font, colour_font2:pSDL_COLOR;   
i:BYTE;  

BEGIN  
SDL_INIT(SDL_INIT_VIDEO);  
screen:=SDL_SETVIDEOMODE(400,200,32,SDL_SWSURFACE);  
IF screen=NIL THEN HALT;  


IF TTF_INIT=-1 THEN HALT;  
loaded_font:=TTF_OPENFONT('C:\Windows\Fonts\Arial\ariblk.ttf',5);  

NEW(colour_font);  
NEW(colour_font2);  
colour_font^.r:=255;   colour_font^.g:=0;      colour_font^.b:=0;  
colour_font2^.r:=0;    colour_font2^.g:=255;   colour_font2^.b:=255;

fontface:=TTF_RENDERTEXT_SHADED(loaded_font,'HELLO',colour_font^,colour_font2^);  

SDL_BLITSURFACE(fontface,NIL,screen,NIL);  
SDL_FLIP(screen);  
READLN;  

DISPOSE(colour_font);  
DISPOSE(colour_font2);  
SDL_FREESURFACE(screen);  
SDL_FREESURFACE(fontface);  
TTF_CLOSEFONT(loaded_font);  
TTF_QUIT;  
SDL_QUIT;  
END.  

怎么了?

1 个答案:

答案 0 :(得分:2)

您正在尝试加载不在您认为的位置的字体,因此TTF_OPENFONT返回nil。然后,您不会对返回值进行错误检查,只是在代码的其余部分中盲目地使用loaded_font,并使用无效值。

在我的Windows 7系统上,字体位于C:\Windows\Fonts\ariblk.ttf;请注意,该路径名中没有Arial个文件夹。

您需要实际检查任何函数调用的返回值,尤其是那些对外部API进行调用的函数,以确保它们成功。您还需要检查以确保文件在加载之前位于您认为的位置。

const
  FontFileName = 'C:\Windows\Fonts\ariblk.ttf';
...

  if not FileExists(FontFileName) then
  begin
    WriteLn('Font file doesn't exist in ' + FontFileName);
    Halt;
  end;

  loaded_font := TTF_OPENFONT(FontFileName, 5);  
  if loaded_font = nil then
  begin
    WriteLn('TTF_OPENFONT failed!');
    Halt;
  end;

  // Other code here - check the return values of the SDL functions!

您还有其他一些问题:

首先,您已声明了两个变量(colour_font' and colour_font2 incorrectly. They shouldn't be pointers, but just references to TSDK_Color`:

colour_font, colour_font2: TSDL_Color;

现在您不再需要对NewDispose进行两次调用,因此请完全删除它们。

将您的代码更改为

colour_font.r := 255;
colour_font.g := 0;
colour_font.b := 0;

colour_font2.r := 0;
colour_font2.g := 255;
colour_font2.b := 255;

fontface :=TTF_RENDERTEXT_SHADED(loaded_font, 
                                 'HELLO',
                                 colour_font,   // Remove ^ - no longer needed
                                 colour_font2);

在使用返回的值之前,再次检查所有函数调用的返回值