f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 22 févr. 2006 à 09:13
haha!
bon, si tu veux tout de suite un truc qui poutre avec de multiple possibilitée et notement la gestion des transparence, tu as plusieurs solution :
utilisation du format ICO ou mieux PNG!
sinon, utilisation de GLScene (en mode 2D) ou autre api bien aboutie qui permet de faire ce genre de chose.
je pense que la GDI va vite ramer en chargeant de plus en plus la scene.
passer par OpenGL ou DirectX vas te permettre d'utiliser pleinement les ressources de la carte graphique et non du CPU.
ACHPI32
Messages postés50Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention 9 mai 2009 21 févr. 2006 à 16:38
C'est bon pb corrigé...
Quel *bip censuré* je suis des fois...
Javais omis d'ajouter la méthode
procedure CreateSprite(var bmp : tbitmap; const W,H : integer);
begin
if not assigned(bmp) then begin
bmp := tbitmap.Create;
bmp.Width := W;
bmp.Height:= H;
end;
end;
1000 excuses
@pluche
ACHPI32
Messages postés50Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention 9 mai 2009 21 févr. 2006 à 11:42
Il y a apparement un petit soucis ici...
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
CreateSprite(sprite1,321,241);
CreateSprite(sprite2,321,241);
CreateSprite(sprite3,321,241);
end;
ACHPI32
Messages postés50Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention 9 mai 2009 21 févr. 2006 à 11:18
Merci, pour ta participation à l'amelioration de ce code,
Je n'avais jamais utilisé de TPoint.
Je pense que ton nettoyage de code sera utile pour la suite car cela risque de s'encrasser (ah bah ça quand on fait des essais et qu'on ne connais pas toutes les fonctions).
Pour maintenant, ce qu'il faudrait :
Dans un premier temps :
-Améliorer la transparence : effet quand un sprite croise un autre, il se produit un effacement du sprite placé en fond.
-Voir pour une méthode alternative d'affichage (vitesse et eventuellement correction du problème mentionné ci-dessus).
Par la suite :
-Faire scroller le fond c'est a dire avec une image tres longue ou un autre moyen, faire defiler un paysage.
-pouvoir controller le sous marin (clavier ou joystick)
Et plus tard... :
-Ajouter du son (Fmod)
-Système de collision
-Utilisation DirectX ou OpenGL.
Le but Realiser un projet pas a pas (j'insiste sur ce point) qui lors d'une evolution majeure sera posté dans un nouveau topic :
Genre (en gros) :
Bubbles : Sprites Tbitmap (le projet en cours)
Bubbles v2 : Sprites et interactions
Bubbles v3 : L'environnement sonore
Bubbles final : DirecT X et OpenGL
Donc si quelqu'un est motivé dans ce sens n'hesitez pas, je pense que ce projet peut être interessant.
@+
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 21 févr. 2006 à 06:03
c'est plutot comme petit exemple ... rigolo.
coté code, c'est propre mais j'aurais deux ou trois conseil a te refiler :
pour X,Y,X1,Y1 ect... utilise plutot les structure TPoint.
comme ce la tu obtient :
ces structure trés pratique permettent d'ameliorer la lecture du code.
pour definir X et Y en une seule ligne il suffit de faire :
P1 := Point(10,50);
modification en consequance :
procedure XYGenerator;
begin
SM.X := SM.X-1;
If SM.X = -70 then SM.X := 320;
P1.Y := P1.Y - 3;
If P1.Y < -20 then begin
P1 := point(Random(15)*Random(25),241);
If P1.X < 2 then P1.X := 100+Random(100);
If P1.X > 320 then P1.X := 160;
end;
P2.Y := P2.Y - 2;
If P2.Y < -20 then begin
P2 := point(Random(5)*Random(35),241);
If P2.X < 2 then P2.X := 200+Random(10);
If P2.X > 320 then P2.X := 160;
end;
P3.Y := P3.Y - 1;
If P3.Y < -20 then begin
P3 := point(Random(5)*Random(35),241);
If P3.X < 2 then P3.X := 100+Random(100);
If P3.X > 320 then P3.X := 160;
end;
end;
procedure SpriteUpdate;
begin
// grace a "with mainform do" on allege le code
with MainForm do begin
Sprite1.Canvas.Draw(0,0,Bubble1.picture.Bitmap);
Sprite2.Canvas.Draw(0,0,Bubble2.picture.Bitmap);
Sprite3.Canvas.Draw(0,0,Submarine.picture.Bitmap);
// idem on allege encore le code
with ANMBitmap.Canvas do begin
Draw(P1.X+35, P1.Y, Sprite1);
Draw(P3.X, P3.Y, Sprite1);
Draw(P2.X+5, P2.Y, Sprite2);
Draw(P3.X+30+random(2),P3.Y,Sprite2);
Draw(SM.X, SM.Y, Sprite3);
end;
end;
end;
pour la creation des objets Sprite1 2 et 3 on crée une petite methode sympa :
procedure CreateSprite(var bmp : tbitmap; const W,H : integer);
begin
if not assigned(bmp) then begin
bmp := tbitmap.Create;
bmp.Width := W;
bmp.Height:= H;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
CreateSprite(sprite1,321,241);
CreateSprite(sprite2,321,241);
CreateSprite(sprite3,321,241);
end;
finalization
// au lieu de FreeAndNil() on utilise les destructeurs des objets
Sprite1.Free;
Sprite2.Free;
Sprite3.Free;
end.
et enfin le dernier conseil, le timer n'a pas besoin d'etre si rapide pour ce genre de chose.
a 15ms on obtient 66.67 traitement par secondes (~66 Tps)
donc il faut le regler entre 40 et 60ms pour obtenir etre dans un interval 25 a 16 Tps ce qui est largement raisonnable.
aprés ce seras a toi de definir les valeurs de mouvement pour gerer la rapiditée de deplacement des sprites.
22 févr. 2006 à 09:13
bon, si tu veux tout de suite un truc qui poutre avec de multiple possibilitée et notement la gestion des transparence, tu as plusieurs solution :
utilisation du format ICO ou mieux PNG!
sinon, utilisation de GLScene (en mode 2D) ou autre api bien aboutie qui permet de faire ce genre de chose.
je pense que la GDI va vite ramer en chargeant de plus en plus la scene.
passer par OpenGL ou DirectX vas te permettre d'utiliser pleinement les ressources de la carte graphique et non du CPU.
21 févr. 2006 à 16:38
Quel *bip censuré* je suis des fois...
Javais omis d'ajouter la méthode
procedure CreateSprite(var bmp : tbitmap; const W,H : integer);
begin
if not assigned(bmp) then begin
bmp := tbitmap.Create;
bmp.Width := W;
bmp.Height:= H;
end;
end;
1000 excuses
@pluche
21 févr. 2006 à 11:42
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
CreateSprite(sprite1,321,241);
CreateSprite(sprite2,321,241);
CreateSprite(sprite3,321,241);
end;
21 févr. 2006 à 11:18
Je n'avais jamais utilisé de TPoint.
Je pense que ton nettoyage de code sera utile pour la suite car cela risque de s'encrasser (ah bah ça quand on fait des essais et qu'on ne connais pas toutes les fonctions).
Pour maintenant, ce qu'il faudrait :
Dans un premier temps :
-Améliorer la transparence : effet quand un sprite croise un autre, il se produit un effacement du sprite placé en fond.
-Voir pour une méthode alternative d'affichage (vitesse et eventuellement correction du problème mentionné ci-dessus).
Par la suite :
-Faire scroller le fond c'est a dire avec une image tres longue ou un autre moyen, faire defiler un paysage.
-pouvoir controller le sous marin (clavier ou joystick)
Et plus tard... :
-Ajouter du son (Fmod)
-Système de collision
-Utilisation DirectX ou OpenGL.
Le but Realiser un projet pas a pas (j'insiste sur ce point) qui lors d'une evolution majeure sera posté dans un nouveau topic :
Genre (en gros) :
Bubbles : Sprites Tbitmap (le projet en cours)
Bubbles v2 : Sprites et interactions
Bubbles v3 : L'environnement sonore
Bubbles final : DirecT X et OpenGL
Donc si quelqu'un est motivé dans ce sens n'hesitez pas, je pense que ce projet peut être interessant.
@+
21 févr. 2006 à 06:03
coté code, c'est propre mais j'aurais deux ou trois conseil a te refiler :
pour X,Y,X1,Y1 ect... utilise plutot les structure TPoint.
comme ce la tu obtient :
var
MainForm: TMainForm;
P1 {X,Y} ,P2 {X1,Y1},P3 {X2,Y2}, SM {SMX,SMY} : TPoint;
Sprite1, Sprite2, Sprite3 : Tbitmap;
ces structure trés pratique permettent d'ameliorer la lecture du code.
pour definir X et Y en une seule ligne il suffit de faire :
P1 := Point(10,50);
modification en consequance :
procedure XYGenerator;
begin
SM.X := SM.X-1;
If SM.X = -70 then SM.X := 320;
P1.Y := P1.Y - 3;
If P1.Y < -20 then begin
P1 := point(Random(15)*Random(25),241);
If P1.X < 2 then P1.X := 100+Random(100);
If P1.X > 320 then P1.X := 160;
end;
P2.Y := P2.Y - 2;
If P2.Y < -20 then begin
P2 := point(Random(5)*Random(35),241);
If P2.X < 2 then P2.X := 200+Random(10);
If P2.X > 320 then P2.X := 160;
end;
P3.Y := P3.Y - 1;
If P3.Y < -20 then begin
P3 := point(Random(5)*Random(35),241);
If P3.X < 2 then P3.X := 100+Random(100);
If P3.X > 320 then P3.X := 160;
end;
end;
procedure SpriteUpdate;
begin
// grace a "with mainform do" on allege le code
with MainForm do begin
Sprite1.Canvas.Draw(0,0,Bubble1.picture.Bitmap);
Sprite2.Canvas.Draw(0,0,Bubble2.picture.Bitmap);
Sprite3.Canvas.Draw(0,0,Submarine.picture.Bitmap);
// idem on allege encore le code
with ANMBitmap.Canvas do begin
Draw(P1.X+35, P1.Y, Sprite1);
Draw(P3.X, P3.Y, Sprite1);
Draw(P2.X+5, P2.Y, Sprite2);
Draw(P3.X+30+random(2),P3.Y,Sprite2);
Draw(SM.X, SM.Y, Sprite3);
end;
end;
end;
pour la creation des objets Sprite1 2 et 3 on crée une petite methode sympa :
procedure CreateSprite(var bmp : tbitmap; const W,H : integer);
begin
if not assigned(bmp) then begin
bmp := tbitmap.Create;
bmp.Width := W;
bmp.Height:= H;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
CreateSprite(sprite1,321,241);
CreateSprite(sprite2,321,241);
CreateSprite(sprite3,321,241);
end;
et enfin dans initialization et finalization :
initialization
Randomize;
P1 := point(160,240);
P2 := point(160,240);
SM := point(320,120);
finalization
// au lieu de FreeAndNil() on utilise les destructeurs des objets
Sprite1.Free;
Sprite2.Free;
Sprite3.Free;
end.
et enfin le dernier conseil, le timer n'a pas besoin d'etre si rapide pour ce genre de chose.
a 15ms on obtient 66.67 traitement par secondes (~66 Tps)
donc il faut le regler entre 40 et 60ms pour obtenir etre dans un interval 25 a 16 Tps ce qui est largement raisonnable.
aprés ce seras a toi de definir les valeurs de mouvement pour gerer la rapiditée de deplacement des sprites.