Italian community of Lazarus and Free Pascal

Programmazione => Graphics => Topic aperto da: nomorelogic - Maggio 09, 2012, 09:22:56 am

Titolo: OOPpizzazione...
Inserito da: nomorelogic - Maggio 09, 2012, 09:22:56 am
sto "traducendo" in OOP il sorgente con cui facevamo le prove con zengl
così è molto più leggibile secondo me però...
il movimento, sia della nave che dei nemici, non mi sembra più fluido come prima: ora va un po' a scatti

magari ho toppato da qualche parte... se avete modo dategli un'occhiata che magari riuscite a vedere qualcosa che io non vedo :=)
Titolo: Re:OOPpizzazione...
Inserito da: Microges2000 - Maggio 09, 2012, 02:37:24 pm
Riscrivi solo le procedure che modifichi. Mi spiego....

in usprite hai ridefinito  OnDraw, OnProc e OnFree (che non fanno nulla se non richiamare quella del parent); stessa cosa in uspriteenemy ed in uspritenave. Tieni presente che FPC manda una cascata di call (TSpriteNave.OnProc chiama TSprite.InProc che chiama zglCSprite2D.OnProc e cosi' via per le altre) e questo consuma codice.

Altra cosa... se ti serve velocità non usare una cosa tipo
 if X > 750 then  X := 750;
 if X < 0 then  X := 0;
 if Y > 550 then  Y := 550;
 if Y < 0 then  Y := 0;

ma metti gli else

 if X > 750
 then 
 X := 750
else
 if X < 0 then  X := 0;
 
if Y > 550
then 
  Y := 550
else
 if Y < 0 then  Y := 0;

ultima cerca sempre di lavorare con numeri interi e, se possibile con multipli di 2 (i calcoli float occupano una marea di risorse e le multiplicazioni e divisioni con multipli di 2 sono trasformati in shift con una velocità molto maggiore del calcoli standard)

Truccaccio (usato multo pero') se devi usare i numeri in virgola mobile e ci devi fare molte operazioni usa la trasformazione in intero:

Per esempio ho le coordinate X, Y, Z in virgola mobile e devo eseguire le operazioni di rotazione sugli assi X, Y, Z...

Var
  X1, Y1, Z1 : Integer;
Begin
  X1 := Round(X*1000);
  Y1 := Round(Y*1000);
  Z1 := Round(Z*1000);

  RotazioneInX(X1, Y1, Z1);
  RotazioneInY(X1, Y1, Z1);
  RotazioneInZ(X1, Y1, Z1);

  X := X1 / 1000;
  Y := Y1 / 1000;
  Z := Z1 / 1000;
End;

in questo caso gli unicio calcoli con virgola mobile sono la trasformazione in intero (ho usato la precisione all 3a cifra decimale con quel 1000), tutti gli altri alcoli sono effettuati tra interi.

bye
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 10, 2012, 09:18:27 am
in effetti non è che mi sono regolato più di tanto con le ereditarietà :)
spero presto di poter fare le ottimizzazioni anche se il problema me lo da anche con 1 solo sprite e quindi la magagna probabilmente sarà anche da qualche altra parte.

cmq appena sistemo posto i risultati
Titolo: Re:OOPpizzazione...
Inserito da: Stilgar - Maggio 10, 2012, 09:21:53 am
Forse non ho capito il problema, ma sul mio Windows7Ent il codice corre senza andare a scatti. :(
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 10, 2012, 11:49:09 am
fai questa prova
1) porta l'astronave all'estrema sx dello schermo
2) schiaccia e tieni premuto il tasto freccia dx fino a raggiungere il lato opposto

dovresti vedere che, ad intervalli regolari, l'astronave fa una specie di scatto per poi riprendere fluidamente lo spostamento
sugli sprite "nemici" la cosa si nota molto meno

questo me lo fa su linux 64 bit

Edit:
stavo pensando se non fosse che, nella matrice di disegni (nel .png) non ci sia un qualche disallineamento...
magari ho toppato di qualche pixel... lavorando di notte può capitare :D
appena posso provo senza far girare i frame ma lasciandone uno sempre fisso
Titolo: Re:OOPpizzazione...
Inserito da: Stilgar - Maggio 10, 2012, 12:41:55 pm
Non è l'immagine ;)
Ho allineato tutte le astronavi in alto a sinistra dei vari frame (con GIMP e la sua griglia).
Lo scatto che dici effettivamente si percepisce.
Titolo: Re:OOPpizzazione...
Inserito da: Stilgar - Maggio 10, 2012, 04:58:46 pm
Ciao,
 il mio approccio a ZenGL è ancora più radicale ;)
Lo stavo riscrivendo ad oggetti ;)
Ho qualche problemino con l'impostazione del contesto OpenGL con le finestre di Freepascal ;)

EDIT:
Secondo me potrebbe essere impostato in questo modo un progetto multipiattaforma. Il minor numero di ifdef possibile ;) , sicuramente è migliorabile, ma è sempre un inizio :D
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 10, 2012, 07:31:24 pm
Non è l'immagine ;)
Ho allineato tutte le astronavi in alto a sinistra dei vari frame (con GIMP e la sua griglia).
Lo scatto che dici effettivamente si percepisce.

infatti non è l'immagine ho controllato anche io
ti dirò di più...
se recuperi il sorgente originale della demo e commenti la rotazione della camera e lo spostamento del frame come sotto

Codice: [Seleziona]
procedure Timer;
  var
    i : Integer;
begin
  INC( time, 2 );

  //camMain.Angle := camMain.Angle + cos( time / 1000 ) / 10;

  (*
  for i := 0 to 20 do
    begin
      INC( tux[ i ].Frame );
      if tux[ i ].Frame > 20 Then
        tux[ i ].Frame := 2;
    end;
  *)
  for i := 0 to 9 do
    begin
      tux[ i ].Pos.X := tux[ i ].Pos.X + 1.5;
      if tux[ i ].Pos.X > 864 Then
        tux[ i ].Pos.X := -96;
    end;
  for i := 10 to 19 do
    begin
      tux[ i ].Pos.X := tux[ i ].Pos.X - 1.5;
      if tux[ i ].Pos.X < -96 Then
        tux[ i ].Pos.X := 864;
    end;

  if key_Press( K_ESCAPE ) Then zgl_Exit();
  key_ClearState();
end;

vedrai che anche i tux fanno il loro piccolo scatto...
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 10, 2012, 07:36:56 pm
Ciao,
 il mio approccio a ZenGL è ancora più radicale ;)
Lo stavo riscrivendo ad oggetti ;)
Ho qualche problemino con l'impostazione del contesto OpenGL con le finestre di Freepascal ;)

ho visto anche se sotto linux non posso compilare
(ho capito... mi devo installare lazarus anche sotto win :P)
però così credo che la prendiamo un po' alla larga che dici? ;)
Titolo: Re:OOPpizzazione...
Inserito da: Stilgar - Maggio 10, 2012, 08:34:18 pm
Non puoi compilare per il fatto che per Linux non ho preparato nulla.
Si tratta di prendere il codice di Zen e riempire le cose che mancano.

Prenderla alla larga, forse. Come dicevi, da soli è un bagno di sangue, in team si semplifica di molto ;)

Quello che aspiro ad ottenere è una piena compatibilità con Lazarus ;)

ZenGL è una sorta di GLUT scritto in Pascal. Come i vari GLUT non è ad oggetti.
Quello che sto cercando di mettere in piedi è un glut ad oggetti, un vero FW ad oggetti per la creazione di applicazioni 3d. Che siano giochi o altro ;)
Magari un giorno potresti vedere un tuo programmino in 3d ;)
Ad esempio il gioco per imparare ad usare la tastiera, in 3d avrebbe un appeal migliore :D
Titolo: Re:OOPpizzazione...
Inserito da: Legolas - Maggio 10, 2012, 09:13:22 pm
Interessante  :D

Per compilare mancano gli sprites, giusto? Dove li pesco? Vorrei provare a buttare un occhio a zenGL (ho trascorsi con DelphiX, avevo fatto un giochino di carri armati, mai completato...)
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 11, 2012, 08:37:46 am
ciao Legolas

gli sprite e gli sfondi li trovi qua

http://www.lazaruspascal.it/index.php?topic=307.msg2056#msg2056 (http://www.lazaruspascal.it/index.php?topic=307.msg2056#msg2056)
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 11, 2012, 08:46:16 am
Quello che aspiro ad ottenere è una piena compatibilità con Lazarus ;)
ZenGL è una sorta di GLUT scritto in Pascal. Come i vari GLUT non è ad oggetti.
Quello che sto cercando di mettere in piedi è un glut ad oggetti, un vero FW ad oggetti per la creazione di applicazioni 3d. Che siano giochi o altro ;)

se si prende questa strada di limitarsi al giochino non ne vale la pena (era in questo senso "alla larga" ;)). scrivendo dei controlli 3D multipiattaforma per la LCL... "toccherà" dar vita ad un progettino ampio giusto per seguire l'esempio di fpGUI (anche se non l'ho mai usato), giusto per far concorrenza a FireMonkey e giusto per fare delle applicazioni un sacco fighe :D
Titolo: Re:OOPpizzazione...
Inserito da: Stilgar - Maggio 11, 2012, 09:29:31 am
 lazarus/examples/openglcontrol/openglcontrol_demo.lpi.

EDIT:
Forse la stavamo prendendo veramente troppo larga ;)
Titolo: Re:OOPpizzazione...
Inserito da: nomorelogic - Maggio 11, 2012, 10:47:24 am
allora la versione 2 del gioco la facciamo 3D?
Titolo: Re:OOPpizzazione...
Inserito da: Stilgar - Maggio 11, 2012, 11:00:17 am
Già abbiamo problemi con la grafica e i suoni ;)
Per il 3d ci vuole un modellatore ....
Rimarrei sul 2d ;)
Immagini PIXEL ART e passa la paura ;)