Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

SDL2 2022 jún. 29 09:17 #2596

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Ha a deklarációk, a használt modulok (uses) stb is meg vannak adva a forráskódban (eszköztár "Kód" gombja) akkor mások hamarabb nekiállnak a válasz keresésének.
Légy szíves az említett adatokkal kiegészíteni a kódot ha még fenn áll a probléma...
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

SDL2 2022 jún. 10 19:50 #2586

  • Magortaltos
  • Magortaltos profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 18
  • Köszönetek: 0
Létrehoztam az OutTextXY -t hogy használható legyen. Íme:

                Procedure OutTextXY(x,y : Sint16; w,h: Uint16; S:String);

Var k : TSDL_Rect;
    P : PChar;
Begin

  if TTF_Init = -1 then HALT;
  ttfFont := TTF_OpenFont(Betutipus, 70);        
  TTF_SetFontStyle(ttfFont, TTF_STYLE_NORMAL);
        // TTF_STYLE_NORMAL No application of a certain style
        // TTF_STYLE_BOLD   Set a bold style
        // TTF_STYLE_ITALIC Set letters in italics
        // TTF_STYLE_UNDERLINE Have the text underlined
        // TTF_STYLE_STRIKETHROUGH Have the text stroken through

  TTF_SetFontOutline(ttfFont, 1);
  TTF_SetFontHinting(ttfFont, TTF_HINTING_NONE);

        // TTF_HINTING_NORMAL Normal hinting is applied
        // TTF_HINTING_LIGHT Light hinting is applied
        // TTF_HINTING_MONO I guess monospaced characters, so all the characters have the same space between each otherwise
        // TTF_HINTING_NONE Have the text underlined

        //define colors by RGB values
        sdlColor1.r := 255; sdlColor1.g := 0;   sdlColor1.b := 0;
        sdlColor2.r := 0;   sdlColor2.g := 255; sdlColor2.b := 255;

        P:=@S;
        sdlSurface1 := TTF_RenderText_Shaded(ttfFont, P , sdlColor1, sdlColor2);
        sdlTexture1 := SDL_CreateTextureFromSurface(sdlRenderer, sdlSurface1);

        k.x:=x;
        k.y:=y;
        k.w:=w;
        k.h:=h;
        //rendering of the texture
        SDL_RenderCopy(sdlRenderer, sdlTexture1, nil, @k);
        SDL_RenderPresent(sdlRenderer);

        //cleaning procedure
        TTF_CloseFont(ttfFont);
        TTF_Quit;
End;

Majd meghívom:

Betutipus:='FreeSans.ttf';
OutTextXY(100,200,300,250,'Ez egy próba szöveg');


Íme a "csodálatos eredmény":


Se ékezet....  Ha nagyítom a teületét szétcsúszik....  Használhatatlan.
Miért?

 

SDL2 2021 jan. 26 16:41 #2438

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Ezekkel (vagy más TTF_Render*) eljárásokkal hozhatsz létre szöveget tartalmazó felületet, melynek a mérete pont akkora lesz, amekkorát a szöveg igényel:
function TTF_RenderText_Solid(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderText_Solid' {$ENDIF} {$ENDIF};
function TTF_RenderUTF8_Solid(font: PTTF_Font; text: PAnsiChar; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUTF8_Solid' {$ENDIF} {$ENDIF};
function TTF_RenderUNICODE_Solid(font: PTTF_Font; text: PUInt16; fg: TSDL_Color): PSDL_Surface cdecl; external TTF_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_TTF_RenderUNICODE_Solid' {$ENDIF} {$ENDIF};
{* Create an 8-bit palettized surface and render the given glyph at 
   fast quality with the given font and color.  The 0 pixel is the
   colorkey, giving a transparent background, and the 1 pixel is set
   to the text color.  The glyph is rendered without any padding or
   centering in the X direction, and aligned normally in the Y direction.
   This function returns the new surface, or NULL if there was an error.
*}

A szöveget tartalmazó a felületet kell beillesztened arra a felületre, amelyen a szöveget meg szeretnéd jeleníteni. Ehhez a következő (vagy más SDL_Render*) eljárásokat használhatod:
function SDL_RenderCopy(renderer: PSDL_Renderer; texture: PSDL_Texture; srcrect: PSDL_Rect; dstrect: PSDL_Rect): SInt32 cdecl; external SDL_LibName {$IFDEF DELPHI} {$IFDEF MACOS} name '_SDL_RenderCopy' {$ENDIF} {$ENDIF};
{
  Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center
 
   renderer The renderer which should copy parts of a texture.
   texture   The source texture.
   srcrect   A pointer to the source rectangle, or NULL for the entire texture.
   dstrect   A pointer to the destination rectangle, or NULL for the entire rendering target.
 
   0 on success, or -1 on error
}

Az általad hivatkozott oldalon található példában az srcrect és a dstrect paraméterek helyére ugyan NIL érték került, de szükség esetén azok tartalmazzák a forrás (ez a szövegfelület egésze legyen) és a célterület (ahová a szöveg kerül a célfelületen) koordinátáit (PSDL_Rect):
  PSDL_Rect = ^TSDL_Rect;
  TSDL_Rect = record
    x,y: SInt32;
    w,h: SInt32;
  end;
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

SDL2 2021 jan. 25 22:12 #2437

  • Magortaltos
  • Magortaltos profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 18
  • Köszönetek: 0
Egyszerűen nem tudom hogy kell betűméretet állítani és xy koordinátára tenni a szöveget:
www.freepascal-meets-sdl.net/chapter-7-texts-fonts-surface-conversion/
www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf.pdf

Nem találok példaprogramokat sem.

SDL2 2021 jan. 22 15:07 #2436

  • Magortaltos
  • Magortaltos profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 18
  • Köszönetek: 0
Itt található a unit:
github.com/PascalGameDevelopment/SDL2-for-Pascal

Itt a tutorial hozzá:
www.freepascal-meets-sdl.net/sdl-tutorials/

És itt a referencia kézikönyv (on-line sajnos nincs pdf, pedig nagyon kellene...)
wiki.libsdl.org/FrontPage

Semmilyen egyéb segítséget nem találtam még eddig fp / sdl2 témában. Pedig jó lenne még egy csomó példaprogram.
Meg valami kiegészítő unit pl. gomb, ablak, menük, textbox stb. létrehozásához, vagyis emulálásához. (Nem Tform meg ilyesmik, hanem direkt sdl2 grafikával, majd én lekezelem a gombnyomást és hasonló eseményeket fp -ben.)

SDL2 2021 jan. 21 22:28 #2435

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 78
  • Köszönetek: 16
Nekem nem megy a Gábor kódja, viszont lefordul simán.

Magortaltos! Az SDL2 unit honnan van, mert a Free Pascal unitok között nekem nincs, csak sima SDL.
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.2.6
CodeTyphon 8.2

SDL2 2021 jan. 21 22:06 #2434

  • Magortaltos
  • Magortaltos profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 18
  • Köszönetek: 0
Nem igazán egyszerűbb. Ugyan úgy surface memóriaterületre másol, majd bemozgatja a képernyő memóriába, mint az sdl2 példák.
...és valamiért nem is fut nekem a karakteres fp -ben.

Tudom, hogy most a hajatok szála az égnek fog állni, de szimpatikusabbá teszem az sdl2 -t egy saját graph unittal. Jó lesz az sdl2, később legyen meg a lehetősége a komolyabb grafikának. De egyenlőre grafikus primitívekre van szükségem, az pedig kényelmesebb a régi, bgi graph unitos eljárásokkal. Ezért ezt a szörnyűséget kezdetem el tákolni: ...és így tovább...
Unit Zoligraph;
interface
Uses SDL2;

Procedure InitGraph();
Procedure CloseGraph();
Procedure SetColor(r,g,b,a : Uint8);
Procedure Line(x1,y1,x2,y2 : Integer);
Procedure RecTangle(x1,y1,x2,y2 : Integer);

Var
ablak1 : PSDL_Window;
gyujtoablak : PSDL_Renderer;
sdlRect1 : TSDL_Rect;

implementation
{ ************************************************************************** }
Procedure Initgraph();

Begin
if SDL_Init(SDL_INIT_VIDEO) < 0 then Halt;
if SDL_CreateWindowAndRenderer(500, 500, SDL_WINDOW_SHOWN, @ablak1, @gyujtoablak) <> 0
then Halt;
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, 'nearest');
//render and show cleared window with background color

SDL_SetRenderDrawColor(gyujtoablak, 0, 255, 255, 255);
SDL_RenderClear(gyujtoablak);
SDL_RenderPresent(gyujtoablak);

End;
{ ************************************************************************** }
Procedure CloseGraph();

Begin
SDL_DestroyRenderer(gyujtoablak);
SDL_DestroyWindow (ablak1);
SDL_Quit;
End;
{ ************************************************************************** }
Procedure SetColor(r,g,b,a : Uint8);
Begin
SDL_SetRenderDrawColor(gyujtoablak, r, g, b, a);
End;
{ ************************************************************************** }

Procedure Line(x1,y1,x2,y2 : Integer);
Begin
//render and show a line
SDL_RenderDrawLine(gyujtoablak, x1, y1, x2, y2);
SDL_RenderPresent(gyujtoablak);
End;
{ ************************************************************************** }
Procedure RecTangle(x1,y1,x2,y2 : Integer);
Begin
sdlRect1.x := x1;
sdlRect1.y := y1;
sdlRect1.w := x2;
sdlRect1.h := y2;
SDL_RenderDrawRect(gyujtoablak, @sdlRect1);
SDL_RenderPresent(gyujtoablak);
End;
{ ************************************************************************** }

Begin
End.

SDL2 2021 jan. 19 18:54 #2417

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
SDL-ben a rajzolás megoldható egy kicsit egyszerűbben is, mint az általad írt példában látható.
Ehhez a programban alapvetően következő szakaszokra van szükség:
  1. Program indításakor a grafikus felület megnyitása és legalább egy rajzvászon létrehozása.
  2. Rajzolás a vászonra (egyszerű vagy akár egészen bonyolult grafika előállítása), majd a vászon képének küldése a képernyőre. (Esetleg ennek ciklikus ismétlése.)
  3. Program végén a grafikus felület bezárása, memória felszabadítása stb.

Az alábbi példában ezt láthatod kidolgozva és kiegészítve a billentyűzet figyelésével, hogy meg lehessen szakítani a program futását.
{$mode delphi}
 
uses sdl{, sdl_ttf};
 
var
  sx,sy,bpp:Integer; // grafikus felület beállításai
  S:PSDL_Surface; // "rajzvászon" felülete, ezt küljük majd a képernyőre
 
  E:PSDL_Event; // eseménykezeléshez - beviteli eszközök
  Quit:Boolean; // kilépési szándék
 
  P,R:PSDL_Rect; // téglalapok
  C:Integer; // szín
  I:Integer; // számláló
 
begin
 
  sx:=800; // szélesség
  sy:=600; // magasság
  bpp:=32; // színmálység (bits)
 
  //S:=SDL_SetVideoMode(sx,sy,bpp,SDL_FULLSCREEN); // teljes képernyő használata
  S:=SDL_SetVideoMode(sx,sy,bpp,SDL_SWSURFACE); // ablak használata
 
  SDL_Init(SDL_INIT_EVERYTHING); // mindent használunk
 
  E:=New(PSDL_Event); // eseménykezeléshez: beviteli eszközök
 
  P:=New(PSDL_Rect); // háttér
  P^.x:=0;
  P^.y:=0;
  P^.w:=sx;
  P^.h:=sy;
 
  R:=New(PSDL_Rect); // kis téglalapok
 
  repeat // ismétlés: rajzolás ==> megjelenítés ==> eseménykezelés ==> szünet
 
	SDL_FillRect(S,P,$00000000); // háttér kitöltése fekete színnel
 
    for I:=0 to 99 do begin // kis téglalapok rajzolása véletlenszerű színekkel
		R^.x:=random(sx)-50;
		R^.y:=random(sy)-50;
		R^.w:=random(100);
		R^.h:=random(100);
		C:=random($ffffffff);
		SDL_FillRect(S,R,C);
	end;
 
	//ide mégtöbb rajzolás kerülhet, pl. szöveg kiírása vagy akármi
 
    SDL_Flip(S); // elkészített kép megjelenítése a grafikus felületen 
 
    while SDL_PollEvent(E)>0 do // eseménykezelés - kilépés billentyűvel
		if E^.type_ = SDL_KEYDOWN then begin
			Quit:=True;
			Break;
		end;
 
	SDL_Delay(250); // szünet
 
  until Quit; // kilépési szándék figyelése
 
  SDL_Quit; // grafikus felület bezárása
 
end.
Szerk: sdl_ttf nincs használva
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64
Megköszönték: Magortaltos

SDL2 2021 jan. 14 21:36 #2411

  • Magortaltos
  • Magortaltos profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 18
  • Köszönetek: 0
Ó... nem erre gondoltam.
Hanem , hogy pl. egy négyzet kirajzolása miatt ne kelljen ezt a rengeteg kört - körbejárni. Nem 3D játékot írok.
Van rá mód, hogy egyből a látható képernyőre írjak?

program SDL_RectanglesScaling;

uses SDL2;

var
sdlWindow1: PSDL_Window;
sdlRenderer: PSDL_Renderer;
sdlSurface1: PSDL_Surface;
sdlTexture1: PSDL_Texture;
sdlRectangle: TSDL_Rect;

begin

if SDL_Init(SDL_INIT_VIDEO) < 0 then Halt;

if SDL_CreateWindowAndRenderer(500, 500, SDL_WINDOW_SHOWN, @sdlWindow1, @sdlRenderer) <> 0
then Halt;
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, 'nearest');

// prepare rectangle
sdlRectangle.x := 12;
sdlRectangle.y := 25;
sdlRectangle.w := 178;
sdlRectangle.h := 116;

// render texture
SDL_RenderCopy(sdlRenderer, sdlTexture1, @sdlRectangle, nil);
SDL_RenderCopy(sdlRenderer, sdlTexture1, nil, @sdlRectangle);

SDL_RenderPresent(sdlRenderer);
SDL_Delay(2000);

// clear memory
SDL_DestroyTexture(sdlTexture1);
SDL_FreeSurface(sdlSurface1);
SDL_DestroyRenderer(sdlRenderer);
SDL_DestroyWindow (sdlWindow1);

SDL_Quit;

end.

SDL2 2021 jan. 14 08:23 #2408

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
A modern (multitasking/többfolyamatos) operációs rendszereken a felhasználói szoftverek nem férhetnek hozzá közvetlenül a gép alkatrészeihez (csak meghajtószoftveren keresztül), így a video memóriához se.
Ha kicsit részletesebben leírod (lehetőleg a hibát bemutató kódrészlettel), hogy mi a jelenség ami gondot okoz akkor talán többet is tudunk segíteni.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

SDL2 2021 jan. 13 22:12 #2407

  • Magortaltos
  • Magortaltos profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 18
  • Köszönetek: 0
Van arra lehetőség, hogy egyből a látható képernyőre rajzoljak és ne kelljen mindig renderelni?

  • Oldal:
  • 1