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
|
Zaslal: 21. červenec 2014, 08:43:24 Předmět: unit Graph a uzivatelsky vstup |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. červenec 2014, 09:46:23 Předmět: |
|
|
rozdeleno |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 21. červenec 2014, 09:57:14 Předmět: |
|
|
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
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 |
|
 |
skála
Založen: 07. 07. 2014 Příspěvky: 22 Bydliště: Klatovy
|
Zaslal: 26. červenec 2014, 11:06:09 Předmět: |
|
|
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 |
|
 |
JC
Založen: 06. 10. 2007 Příspěvky: 137
|
Zaslal: 26. červenec 2014, 12:43:27 Předmět: |
|
|
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 |
|
 |
skála
Založen: 07. 07. 2014 Příspěvky: 22 Bydliště: Klatovy
|
Zaslal: 26. červenec 2014, 13:08:09 Předmět: |
|
|
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 |
|
 |
JC
Založen: 06. 10. 2007 Příspěvky: 137
|
Zaslal: 26. červenec 2014, 16:15:22 Předmět: |
|
|
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 |
|
 |
skála
Založen: 07. 07. 2014 Příspěvky: 22 Bydliště: Klatovy
|
Zaslal: 31. červenec 2014, 08:08:03 Předmět: |
|
|
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 |
|
 |
JC
Založen: 06. 10. 2007 Příspěvky: 137
|
Zaslal: 31. červenec 2014, 13:58:37 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
skála
Založen: 07. 07. 2014 Příspěvky: 22 Bydliště: Klatovy
|
Zaslal: 1. srpen 2014, 21:29:28 Předmět: |
|
|
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 |
|
 |
JC
Založen: 06. 10. 2007 Příspěvky: 137
|
Zaslal: 2. srpen 2014, 10:16:30 Předmět: |
|
|
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 |
|
 |
skála
Založen: 07. 07. 2014 Příspěvky: 22 Bydliště: Klatovy
|
Zaslal: 4. srpen 2014, 10:43:02 Předmět: |
|
|
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 |
|
 |
JC
Založen: 06. 10. 2007 Příspěvky: 137
|
Zaslal: 4. srpen 2014, 20:26:10 Předmět: |
|
|
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 |
|
 |
skála
Založen: 07. 07. 2014 Příspěvky: 22 Bydliště: Klatovy
|
Zaslal: 12. srpen 2014, 19:16:26 Předmět: |
|
|
Nazdar, sorry že zase otravuju, ale potřeboval by jsem poradit, jak používat v zenggl datové soubory.
Díky |
|
Návrat nahoru |
|
 |
JC
Založen: 06. 10. 2007 Příspěvky: 137
|
Zaslal: 13. srpen 2014, 14:55:27 Předmět: |
|
|
Ahoj,
moc neurčitý dotaz Co myslíš konkrétně ? |
|
Návrat nahoru |
|
 |
|