.[ ČeskéHry.cz ].
unit Graph a uzivatelsky vstup
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 21. červenec 2014, 08:43:24    Předmět: unit Graph a uzivatelsky vstup Odpovědět s citátem

Nazdar lidi, potřeboval by jsem poradit. Začal jsem využívat v pascalu unitu graph, našel jsem si na to návody (http://home.pf.jcu.cz/~edpo/program/kap20.html) ale mám jeden problem, vždy se mi otevřou dvě okna, jedno je normální příkazový řádek a druhé je grafický výstup. Problem je, že když chci požít funkci readkey (například jsem chtěl udělat, aby se objekt posouval podle toho, jakou mačkám klávesu) tak musím prvně překliknout do příkazového řádku, potom zmáčknu klávesu a pak zase překliknu do grafického výstupu a tam už jsou provedené změny. Neví někdo, jak to udělat bez překlikávání, aby jsem měl na obrazovce grafický výstup a načítalo to stisknuté klávesy?
Díky za každou radu.


Naposledy upravil skála dne 4. srpen 2014, 10:29:13, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 21. červenec 2014, 09:46:23    Předmět: Odpovědět s citátem

rozdeleno
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 751
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 21. červenec 2014, 09:57:14    Předmět: Odpovědět s citátem

Ten terminal se ti otevira nejspis proto, ze aplikaci kompilujes jako "konzolovou". Nekde v nastaveni projektu (pripadne v parametrech prekladace) to pujde zmenit.

Ale jinak se obavam, ze v readkey pro cteni z grafickeho okna stejne pouzit nepujde, protoze jde (slo) o funkci pro cteni z terminalu. Ale uprimne, ta unit graph vypada trochu jako zombie z dob DOSu, kdy bezela vzdy jen jedna aplikace a ridila jak obrazovku, tak vstup, a ktera vznikla spis proto, aby sly zkompilovat stare programy. A uz v te dobe ji skoro nikdo na vaznou praci nepouzival, protoze byla neskutecne pomala.

Pro moderni hry by ses mel podivat po necem modernejsim, treba po SDL2, ktere obsahuje prakticky vsechno, co potrebujes pro tvorbu hry, tedy funkce pro (rychlou!) grafiku, vstup (klavesnice, mys a joystick) i audio a funguje celkem dobre na Windows, Macu i Linuxu.

Pri rychlem googleni Pascalu a SDL jsem nasel par odkazu, co by se ti mohly hodit:
http://www.freepascal-meets-sdl.net/
http://sourceforge.net/projects/sdl2fpc/
http://www.pascalgamedevelopment.com/
Ovsem za funkcnost nerucim, v Pascalu jsem naposledy programoval v dobe, kdy se unit graph pouziva Smile

Pripadne, kdybys chtel pro zacatek neco jednodussiho, tak se podivej na GLUT nebo GLFW: http://wiki.freepascal.org/OpenGL_Tutorial - to jsou jednoduche frameworky nad OpenGL, ktere maji funkce pro praci s okny, mysi a klavesnici.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 26. červenec 2014, 11:06:09    Předmět: Odpovědět s citátem

Díky za radu. Tím rychlá grafika myslíš rychlejší vykreslování? S tou rychlostí unity graph máš pravdu, udělal jsem objekt 300*300 pixelů a chtěl ho nechat animovaně posouvat po obrazovce, ale byl problem, že se posouval rychlostí 3 posunutí za vteřinu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 26. červenec 2014, 12:43:27    Předmět: Odpovědět s citátem

Na nativní jednotky typu Graph se vykašli.

Zkus ZenGL (http://zengl.org/), jednoduché, rychlé, skvěle navržené a umí spoustu věcí. Sice je pozastavený vývoj, ale autor na to úplně nezanevřel, poradí a opravuje závažné bugy stále.

A případně jako kompiler místo Delphi použít Lazarus/Freepascal (který je Delphi kompatibilní, tedy až na některé nové funkce).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 26. červenec 2014, 13:08:09    Předmět: Odpovědět s citátem

Já používám Lazarus. V Delphi jsem jenom začínal. Mě stačí jakákoliv unita, která zvládne rychlejší vykreslování grafiky. Hry co chci programovat budou přibližně na úrovni starých plošinovek (mario a podobně).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 26. červenec 2014, 16:15:22    Předmět: Odpovědět s citátem

Záleží co vše chceš dělat sám, klidně můžeš využít jen podporu grafiky. Patchtit se základy jako je ovládání je docela ztráta času, jelikož se stejně dopracuješ k tomu jak to je dělané v těchto knihovnách. Lepší je věnovat čas samotné hře a ZenGL nabízí celou herní smyčku.

Grafika se vykresluje pomocí OpenGL takže s rychlostí nejsou problémy. Jsou tam základy pro práci s texturami, sprity, vykreslování textu, ovládání (myš, klávesnice, joystick), kamery, zvuky, timery, kolize.. a pak trošku pokročilejší věci.

Případně další herní knihovny najdeš na fóru http://pascalgamedevelopment.com/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 31. červenec 2014, 08:08:03    Předmět: Odpovědět s citátem

Stáhnul jsem si ten zenggl, prohlídl si ty jejich dema a trochu to zjednodušil. Mám ale 2 dotazy, 1. Jak to, že mi to běží neustále ve smyčce, když tam žádnou funkci repeat nemám. 2, jak můžu požít proceduru pr2d_pixel normálně ve zdrojovým kodu, mě to funguje jen v tý proceduře draw (tam totiž bylo kreslení už v tom demu, já to jen upravil). Když to napíšu normálně do kodu, tak to nic nedělá. Kod je tady:
kód:
program pokus1;

{$I zglCustomConfig.cfg}

{$IFDEF WINDOWS}
  {$R *.res}
{$ENDIF}

uses
  {$IFDEF USE_ZENGL_STATIC}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_keyboard,
  zgl_fx,
  zgl_render_2d,
  zgl_primitives_2d,
  zgl_math_2d,
  zgl_font,
  zgl_text,
  zgl_utils, crt
  {$ELSE}
  zglHeader
  {$ENDIF}
  ;

procedure Draw;
  var
    i,ii: Integer;
begin
  for i:=1 to 800 do begin
  for ii:=1 to 600 do begin
  pr2d_Pixel(i,ii,random(255255255));
  end; end;
  end;

Begin
  randomize;
  {$IFNDEF USE_ZENGL_STATIC}
  if not zglLoad( libZenGL ) Then exit;
  {$ENDIF}
  zgl_Reg( SYS_DRAW, @Draw );

  wnd_ShowCursor( TRUE );

  zgl_Init();
End.

Jinak, díky za předchozí rady, zenggl je mnohem rychlejší než graph.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 31. červenec 2014, 13:58:37    Předmět: Odpovědět s citátem

1) Smyčka je ve zdrojácích knihovny. Pokud se nepletu tak v - unit zgl_application; a procedura app_MainLoop; Nikdy jsem se ale v tom moc nehrabal.

2) Tak by to mělo mít, procedura DRAW; má nejvyšší prioritu, takže pokud chceš něco kreslit piš kód sem. Výpočty je dobré mít oddělené, aby se zbytečně nezpomalovalo vykreslování a běh aplikace a udělat třeba timer - timer_Add( @Proc, 16 ); pro jednoduchou aplikaci nebo použít systémový update pokud se jedná o něco komplexnějšího:

kód:

procedure Update( dt : Double );
begin
// Vypocty
end;   

zgl_Reg( SYS_UPDATE, @Update )
;


Já u tohoto členění zůstal, přijde mi to přehledné. Navíc se stejně musí inicializovat aplikaci a nastavit např. rozlišení, takže se použije INIT; a pro ukončení QUIT a tam např. uvolnit paměť pokud je potřeba.

Pokud teda si to nechceš psát celé sám a vymyslet jinou strukturu.

Jinak v tom kódu je zbytečně moc begin a end;, stačilo by:
kód:
procedure Draw;
  var
    i,ii: Integer;
begin
  for i:=1 to 800 do
   for ii:=1 to 600 do
     pr2d_Pixel(i,ii,random($FFFFFF));
   end;


další begin jen při více řádcích:
kód:
procedure Draw;
  var
    i,ii: Integer;
begin
  for i:=1 to 800 do
   for ii:=1 to 600 do begin
     pr2d_Pixel(i,ii,random($FFFFFF));
     pr2d_Pixel(i,ii,random($FFFFFF));
     pr2d_Pixel(i,ii,random($FFFFFF));
    end;
   end;


A co se týče barev tak ty jsou hexadecimálně, 255255255 není RGB

Nemáš zač, poradím rád a jsem rád, že nejsem sám kdo něco kuchtí v Pascalu Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 1. srpen 2014, 21:29:28    Předmět: Odpovědět s citátem

Ještě dotaz, do tý procedury update dám napříkald přepočítávání polohy nebo tak něco?

Ještě mam takový problem, jak uložím, stisknutou klávesu. Chci do textového souboru uložit a, pokud stisknu klávesu a. (já zatím zkouším jenom takový ty základy, takže ty mí rogramy nemají žádný význam,
kód:
program pokus3;

{$I zglCustomConfig.cfg}

{$IFDEF WINDOWS}
  {$R *.res}
{$ENDIF}

uses
  {$IFDEF USE_ZENGL_STATIC}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_keyboard,
  zgl_fx,
  zgl_render_2d,
  zgl_primitives_2d,
  zgl_math_2d,
  zgl_font,
  zgl_text,
  zgl_utils, crt
  {$ELSE}
  zglHeader
  {$ENDIF}
  ;

var
x,k,b:integer;
z:char;
f:textfile;
userInput  : UTF8String;
trackInput : Boolean;
inputRect  : zglTRect;

procedure Draw;
begin
  pr2d_Pixel(1,1,b);
 end;

Begin
  assignfile(f,'P:\grafika\nevim.txt');
  {$IFNDEF USE_ZENGL_STATIC}
  if not zglLoad( libZenGL ) Then exit;
  {$ENDIF}
  zgl_Reg( SYS_DRAW, @Draw );

    key_BeginReadText( userInput, 24 );
    trackInput := TRUE;
   if key_Press( K_a ) Then
    begin
    trackInput := FALSE;
    userInput := key_GetText();
    rewrite(f);
    writeln(f,userinput);
    close(f);
    b:=b+80;
    key_ClearState;
    end;

  wnd_ShowCursor( TRUE );

  zgl_Init();
End.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 2. srpen 2014, 10:16:30    Předmět: Odpovědět s citátem

Ano, přepočítávání polohy, fyziku, kolize, AI, ale může tam být i ovládání.

Kód, který začíná po Begin je už mimo smyčku, takže se to spustí jen při startu programu. Mělo by to být nějak takhle:

Enter uloží stisknutý klávesy do souboru. Pokud bys chtěl monitorovat stisk kláves a ukládat to do logu tak bys na to musel trošku jinak. Viz. google, lazarus nebo zengl fora, wiki.

kód:
program pokus3;

{$I zglCustomConfig.cfg}

{$IFDEF WINDOWS}
  {$R *.res}
{$ENDIF}

uses
  {$IFDEF USE_ZENGL_STATIC}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_keyboard,
  zgl_fx,
  zgl_render_2d,
  zgl_primitives_2d,
  zgl_math_2d,
  zgl_font,
  zgl_text,
  zgl_utils,
  zgl_file
  {$ELSE}
  zglHeader
  {$ENDIF}
  ;

var
b          : longword;
userInput  : UTF8String;

Procedure Savefile( filename : UTF8String );
 var
  i: integer;
  f: zglTFile;

begin
  file_Open(f , filename, FOM_CREATE);
  file_write(f, userInput[1], SizeOf(Char)*length(userInput));
  file_Close(f);
end;

procedure Proc;
begin

  if key_Press( K_ENTER ) Then
   begin
    userInput := key_GetText();
    Savefile( 'nevim.txt' );
    b := random( $FFFFFF );
   end;

  key_ClearState;
end;

procedure Draw;
begin
  pr2d_Pixel(1,1, b);
end;

Begin
  {$IFNDEF USE_ZENGL_STATIC}
   if not zglLoad( libZenGL ) Then exit;
  {$ENDIF}

  key_BeginReadText( userInput, 24 );

  timer_Add( @Proc, 16 );
  zgl_Reg( SYS_DRAW, @Draw );

  wnd_ShowCursor( TRUE );

  zgl_Init();
End.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 4. srpen 2014, 10:43:02    Předmět: Odpovědět s citátem

Nazdar, mám jenom ještě pár krátkých dotazů.
1, Jde nějak nastavit barva pozadí aniž by jsem ji musel vykreslovat pixel po pixelu.
2, Je nějaká funkce pro nakreslení kruhu, já našel jen na kružnici, takže kruh kreslím tak, že kreslím kružnici za kružnicí a každá má o 1 menší poloměr.
3, Jak můžu natočit elipsu, zatím jsem kreslil jen elipsy, které měly osy rovnoběžné se souřadnicovými osami.
4, Kam mám napsat příkazy na vykreslení, pokud je chci požít jen jednou. Například chci vykreslit pozadí a to potom animovat něco okolo ale když to dám do funkce draw, tak se to bude vykreslovat pokaždé.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 4. srpen 2014, 20:26:10    Předmět: Odpovědět s citátem

Ahoj,

1) nakresli obdelník přes celou obrazovku - pr2d_Rect
2) stačí přidat parametr pr2d_fill => pr2d_Circle( 150, 150, 100, $FFFFFF, 255, 32, pr2D_FILL );
3) v základu nejde s primitivy rotovat, musel by sis to dopsat. Nejspíše klasické OpenGL glrotate a gltranslate
4) nevím přesně jak to myslíš, ale měl bys mít hru rozdělenou na scény (stavy) a mezi nimi přepínat. Např. ve scéne MENU se ti zobrazuje jen menu, ve scéně HRA běží aktuální level atd. A nejde jen o zobrazování, ale i o výpočty a ovládání. Řešilo se to např. zde - http://www.ceske-hry.cz/forum/viewtopic.php?t=3959

pokud ti jde třeba jen o úvod typu stmívání obrazovky nebo úvodní obrázek, tam si vystačíš s timery nebo jednoduchým počítadlem i := i + 1; a až uběhne (i > 1000) tak přestaneš ty věci kreslit. Je to i v demech.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
skála



Založen: 07. 07. 2014
Příspěvky: 22
Bydliště: Klatovy

PříspěvekZaslal: 12. srpen 2014, 19:16:26    Předmět: Odpovědět s citátem

Nazdar, sorry že zase otravuju, ale potřeboval by jsem poradit, jak používat v zenggl datové soubory.
Díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JC



Založen: 06. 10. 2007
Příspěvky: 137

PříspěvekZaslal: 13. srpen 2014, 14:55:27    Předmět: Odpovědět s citátem

Ahoj,

moc neurčitý dotaz Smile Co myslíš konkrétně ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Delphi / Pascal Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna