BUBBLES : SPRITES TBITMAP

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 21 févr. 2006 à 06:03
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 22 févr. 2006 à 09:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36160-bubbles-sprites-tbitmap

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
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és 50 Date d'inscription mercredi 2 avril 2003 Statut Membre Derniè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és 50 Date d'inscription mercredi 2 avril 2003 Statut Membre Derniè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és 50 Date d'inscription mercredi 2 avril 2003 Statut Membre Derniè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és 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
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 :

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.