Trudność z biblioteką SDL przy wyświetlaniu tekstu

0

Mam problem z obsula biblioteki SDL:( A mianowicie z wyswietlaniem tekstu, bo inne elementy działaja bez zarzutu. Podczas proby odpalenia programu wyskakuje blad: project My Application raised exception class External sigsegv at address 71002A95. A tu kod programu

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.

Problem sprawia ta linijka

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

gdyz po jej zakomentowaniu program sie uruchamia bez bledu(tylko wtedy sie rzecz jasna napis nie wyswietla)

Mam Win 7, pisze na Lazarusie. Czy ktos pomoze? Bede bardzo wdzieczny

poprawienie tytułu wątku + dodanie znaczników <code class="pascal"> - fp

0

Sprawdź co zwraca funkcja TTF_RENDERTEXT_SHADED, tak jak powinno się to robić i ewentualnie obsłuż błąd, bo najwidoczniej na czymś się ona wywala; Zobacz pod ten link: http://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf_47.html

I nie zapominaj o wstawianiu kodu w znaczniki kolorujące składnię.

0
if(TTF_RENDERTEXT_SHADED(loaded_font,'HELLO',colour_font^,colour_font2^)=NIL) then HALT; 

o to chodzi?

nic,dalej to samo

0

Chodzi mi o tą linijkę:

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

Po niej powinieneś sprawdzić, czy funkcja zwróciła Nil czy nie, np. tak:

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

if fontface = nil then
  // obsługa błędu renderowania
else
begin
  SDL_BlitSurface(fontface, NIL, screen, NIL);
  SDL_Flip(screen);

  // ...

  SDL_FreeSurface(fontface);
end;

i sprawdź jak działa program; Jeśli nadal otrzymujesz ten sam błąd to sprawdź czy podajesz prawidłowe parametry;

EDIT: A to Readln można używać w trybie graficznym SDL?

0

zrobilem te obslugi i wyszlo na to ze TTF_OPENfONT zwraca NIL. tylko dlaczego? sciezka jest ok

edit:mozna uzywac, wtedy napis wyswietli sie na konsoli a nie na wyswietlanym screenie.

0

Zmienna loaded_font powinna być typu TTF_Font, tak jak sugeruje dokumentacja; Sugeruję skopiowanie pliku z fontem do katalogu z programem i spróbowanie w ten sposób (podając ścieżkę względną); Być może nie masz dostępu do katalogu C:\Windows\Fonts, dlatego zawsze zwraca Nil.

0

identifier not found "TTF_Font" , sciagnalem sobie czcionke i wstawilem do folderu z programem, podalem sciezke wzgledna (czyli 'nazwa.ttf' ?) i program odpala sie, ale czcionka sie nie pojawia a po zakonczeniu wyskakuje
".. class External SIGSEGV at address 68122A84"

0

identifier not found "TTF_Font"

Czyli albo nie dodałeś odpowiedniego modułu do listy, albo moduły nie są zgodne z dokumentacją;

sciagnalem sobie czcionke i wstawilem do folderu z programem, podalem sciezke wzgledna (czyli 'nazwa.ttf' ?) [...]

Tak, ścieżka względna tak wygląda - nie posiada litery dysku ani pełnej lokalizacji, tylko wersję skróconą względem pliku wykonywalnego;

[...] i program odpala sie, ale czcionka sie nie pojawia a po zakonczeniu wyskakuje
".. class External SIGSEGV at address 68122A84"

Jaka instrukcja powoduje ww. błąd? To ważne.

0

jak to sprawdzic ktora?

0

Użyj debugger.

0

jak sprawdzic debuggerem ktora?

1

Wykonujesz krok po kroku dopóki się nie wywali. Ta na której się wywaliło i jest ta której szukasz.

0

Nie wiem czy to ma znaczenia ale http://sdl.beuc.net/sdl.wiki/SDL_ttf_Functions_Render_TTF_RenderText_Shaded podają że 2 parametr to

text

    A NULL-terminated string in corresponding encoding.

a więc nie wiem czy nie powinno być:

fontface := TTF_RenderText_Shaded(loaded_font, 'HELLO'#0, colour_font^, colour_font2^);
0

wyskakuje okno z assemblerem, klikam step over i wywala gdy dojdzie do
00409b66 e855deffff call 0x4079c0 <SYSTEM_EXE_ENTRY$TENTRYINFORMATION>
nie wiem czy o to chodzilo jesli nie prosze wytlumaczcie

0

@czarny93123 - a jakiego typu są dwa ostatnie parametry funkcji TTF_RenderText_Shaded? Zobacz wciskając kombinację Shift+Ctrl+Space gdy kursor jest pomiędzy nawiasami funkcji.

0

Poniższy kod w Turbo Delphi, SDL 1.2, Jedi SDL, win32x86, Windows 7 64bit wykonuje się bez błędów.
W lewym górnym rogu "czarnego" okna wyświetla się krótki czerwony paseczek.

USES
  SDL, SDL_TTF;

procedure TForm1.Button1Click(Sender: TObject);
VAR
  screen, fontface:pSDL_SURFACE;
  loaded_font: PTTF_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('ARIALUNI.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'#0, colour_font^, colour_font^);


  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;
0
procedure TForm1.Button1Click(Sender: TObject); 

Error:Identifier no found "TForm1"
Error:Class identifier expected

0

@czarny93123 weź ty może przeczytaj najpierw kurs. Napisz jakiś hello world a nie się za pisanie gier bierzesz.

2

Poniżej masz działający przykład typu "Console". Niestety musisz w jakiś sposób poznać podstawy,
zacznij od tego: Kompendium

program SDL_Console;

{$APPTYPE CONSOLE}

uses
  SysUtils, SDL, SDL_TTF;

var
  screen, fontface:pSDL_SURFACE;
  loaded_font: PTTF_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('ARIALUNI.TTF', 18);

  NEW(colour_font);
  NEW(colour_font2);

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

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

  fontface := TTF_RENDERTEXT_SHADED(loaded_font, 'HELLO'#0, 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. 
0

Hej,

Mam podobny problem jak kolega @czarny93123 z tym, że mając przykładowo taki kod:

PROGRAM Show_font;
USES  SDL, SDL_TTF;

VAR
fontStart, screen:pSDL_SURFACE;
loaded_font:pointer;
colour_font:pSDL_COLOR;

begin
//IF TTF_INIT=-1 THEN HALT;
//loaded_font:=TTF_OPENFONT('C:\Windows\Fonts\arial.ttf',10);
// IF loaded_font=NIL THEN HALT;
NEW(colour_font);
colour_font^.r:=255; colour_font^.g:=0;    colour_font^.b:=0;
 //fontStart:=TTF_RENDERTEXT_SOLID(loaded_font,'HELLO WORLD!',colour_font^);
 SDL_BLITSURFACE(fontStart,NIL, screen, NIL);
 SDL_FLIP(screen);
 SDL_DELAY(2000);
 //TTF_QUIT;
 end.

aby w ogóle ruszył debugger muszą być za komentowane te linijki jak widnieje to powyżej. Jeśli nie są, wyskakuje błąd "The debugger filed to get the application's PID.", ponadto w debugger output "During startup program exited with code 0xc000007b"

Byłbym wdzięczny za wszelaką okazaną pomoc, pozdrawiam :)

dodanie znacznika <code class="delphi"> - fp

0

@durden - w czym Wy to kompilujecie, że takie problemy macie, nawet z poprawnym uruchomieniem debugera...?

0

W Lazarusie. Wszystko było do tej pory należycie do czasu zabawy z tekstem.

0

Lazarus 1.0.12 , win 7. moze mamy zla wersje jakichś bibliotek?

0

czy nikt nie jest w stanie mi pomóc? bardzoo proszę...

1

Co tu można pomóc:

  1. Pobierz

http://downloads.sourceforge.net/project/jedi-sdl/JEDI-SDL%20v1.0%20Final%20RC%202/Zip%20File%20for%20all%20supported%20platforms/JEDI-SDLv1.0.zip

  1. Wypakuj do

c:\lazarus\components\JEDI-SDLv1.0\

  1. Otwórz w notatniku:

c:\lazarus\fpc\2.6.2\bin\x86_64-win64\fpc.cfg

zajdziesz w tym pliku linię

# searchpath for units and other system dependent things

i tam dodanych kilka ścieżek pod nimi dodaj:

-FiC:\lazarus\components\JEDI-SDLv1.0\SDL\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL_Mixer\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL_Image\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL_Net\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL_ttf\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\smpeg\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SFont\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL_Sound\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDLMonoFonts\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDLSpriteEngine\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\Cal3D\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\ODE\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDLCtrls\Pas
-FuC:\lazarus\components\JEDI-SDLv1.0\SDL_flic\Pas

i zapisz plik

  1. Wejdź na:

http://www.libsdl.org/download-1.2.php

i pobierz bibliotekę odpowiednią dla twojej wersji systemu (32 lub 64 bit)

  1. Wejdź na:

http://www.libsdl.org/projects/SDL_ttf/release-1.2.html

i pobierz bibliotekę odpowiednią dla twojej wersji systemu (32 lub 64 bit)

  1. Odpal Lazarus

New -> Project -> Program

Zapisz projekt i do folderu w którym zapisałeś wrzuć czcionkę i pobrane biblioteki DLL

Mój testowy (DZIAŁAJĄCY!) kod:

program project1;
{$mode objfpc}{$H+}
uses
  sdl, SDL_TTF;
var
  screen, fontface: pSDL_SURFACE;
  loaded_font: pTTF_Font;
  colour_font, colour_font2: pSDL_COLOR;
  event: pSDL_EVENT;
  done: Boolean;
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('ariblk.ttf', 18);
  if loaded_font = nil then
    Halt;

  New(colour_font);
  New(colour_font2);

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

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

  fontface:= TTF_RenderText_Shaded(loaded_font, 'HELLO'#0, colour_font^, colour_font2^);
  done:= False;

  while done = False do
  begin
    New(event);

    while SDL_PollEvent(event) = 1 do
    begin
      case event^.type_ of
        SDL_QUITEV: done:= True;
        SDL_KEYDOWN: begin
                       if (event^.key.keysym.sym = SDLK_ESCAPE) then
                         done:= True;
                     end;
      end;
    end;

    SDL_BlitSurface(fontface, nil, screen, nil);
    SDL_Flip(screen);

    Dispose(event);
  end;

  Dispose(colour_font);
  Dispose(colour_font2);
  SDL_FreeSurface(screen);
  SDL_FreeSurface(fontface);
  TTF_CloseFont(loaded_font);
  TTF_Quit;
  SDL_Quit;
end.

Kod jest napisany na podstawie Twojego dodałem tylko pętlę obsługi zdarzeń (właściwie komunikatów jak chodzi o Windows) aby nie "wisiał". Kod nie jest idealny (te Halt mogą powodować wycieki pamięci bo nie będzie wtedy nic zwalniane) ale mi się nie chciało już z tym bawić w końcu robiłem tylko test.

Jak dalej nie działa to ja nie wiem :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1