BUBBLES : SPRITES TBITMAP

Signaler
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
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

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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.
Messages postés
50
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 mai 2009

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
Messages postés
50
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 mai 2009

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;
Messages postés
50
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 mai 2009

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.

@+
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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.