Page 1 sur 1

Sprite et Rotation

Publié : mer. 25/oct./2006 0:42
par frank
Salut,

Voilà je bloque sur ça :

j'ai voulu créer un tank vu de dessus en 2D.

Lorsque j'avance et je recule ( tiens une chanson ) le tank à l'écran monte bien et descend bien, mais là où je pige pas c'est quand pour les actions droite gauche j'affecte une rotation du sprite, je ne sais pas comment faire avancer le sprite dans l'axe de rotation...

Merci.

Publié : mer. 25/oct./2006 7:53
par Anonyme
Salut , le top aurait été un code.

Télécharge ceci :
File:1->MyWork.rar
Image
dedans tu as un dossier 01 ou p01 avec un exe et des chars en 2D fait par mes soins, (pour changer de tank page up & down)

Sinon pour ton problème, c'est simple :

Code : Tout sélectionner

Tank_X + Vitesse * Cos( Tank_RadAng / #pi * 180)
Tank_Y + Vitesse * Sin( Tank_RadAng / #pi * 180)

Ensuite tu fait une rotation de ton sprite avec Tank_RadAng, si ton char part a la perpendiculaire tu fait :

cos/sin((Tank_RadAng+90)/#pi*180)

plus ou moins 90 , ca dépend.


@++

Publié : mer. 25/oct./2006 7:56
par comtois
je réponds trop tard mais tant pis, il y a d'autres tuts

voila un exemple
http://www.games-creators.org/wiki/Pure ... t_Sprite3D

Publié : mer. 25/oct./2006 21:27
par frank
Merci pour vos réponses.

En fait je pensais qu'il fallait utiliser RotateSprite3D, ce n'est pas le cas dans ton .exe Cpl.Bator ?

Je mets mon code de débutant lol :

If InitSprite() And InitKeyboard() And OpenScreen(1024,768,32,"") And InitSprite3D()
x=500
y=500

cd=0 ; Couleur Ecran Départ
c=0 ; Couleur Ecran Jeu

angle=1

LoadSprite(0, Path$+"Sprite.bmp", #PB_Sprite_Texture)
CreateSprite3D(1,0)
Start3D()
ClearScreen(cd)

Repeat

FlipBuffers()
ExamineKeyboard()

If KeyboardPushed(#PB_Key_Escape) ; press Esc to quit
End
EndIf

If KeyboardPushed(#PB_Key_Right)

ClearScreen(c)
RotateSprite3D(1, angle, 1)
DisplaySprite3D(1, x, y, 255)

EndIf

If KeyboardPushed(#PB_Key_Left)

ClearScreen(c)
RotateSprite3D(1, -angle, 1)
DisplaySprite3D(1, x, y, 255)

EndIf

If KeyboardPushed(#PB_Key_Up)

ClearScreen(c)
y=y-1
DisplaySprite3D(1, x, y, 255)

EndIf

If KeyboardPushed(#PB_Key_Down)

ClearScreen(c)
y=y+1
DisplaySprite3D(1, x, y, 255)

EndIf

ForEver

Stop3D()

EndIf
---------------------------------------------------------------

Publié : jeu. 26/oct./2006 8:15
par Anonyme
Salut Frank!
j'ai corrigé ton code.
Regarde la différence tu verras :D
Oui , j'utilise aussi rotatesprite3D() dans mon code.

Code : Tout sélectionner

If InitSprite() And InitKeyboard() And OpenScreen(1024,768,32,"") And InitSprite3D() 
x.f=500 
y.f=500 

cd=0 ; Couleur Ecran Départ 
c=0 ; Couleur Ecran Jeu 

angle.f=0
Vitesse.f 
VitesseMax.f = 1.5

; --------------------------------------------
;Remplace par loadsprite()
CreateSprite(0,64,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
    Ellipse(32,32,24,32,RGB(0,128,255))
    LineXY(32,0,32,64,RGB(255,0,0))
    Circle(32,10,10,RGB(255,0,0))
StopDrawing()
; --------------------------------------------

CreateSprite3D(1,0) 


ClearScreen(cd) 

Repeat 
ClearScreen(c) 
ExamineKeyboard() 

;Affichage
Start3D() 
 RotateSprite3D(1,angle,0)
 DisplaySprite3D(1,x,y)
Stop3D()

;Rotation
If KeyboardPushed(#PB_Key_Right) : angle + 0.5 : EndIf 
If KeyboardPushed(#PB_Key_Left) : angle - 0.5 : EndIf 


;Deplacement 
If KeyboardPushed(#PB_Key_Up) : Vitesse+0.01     
 x + Vitesse * Cos((90+angle)*#PI/180)
 y + Vitesse * Sin((90+angle)*#PI/180)
EndIf

If KeyboardPushed(#PB_Key_Down)  : Vitesse+0.01  
 x - Vitesse * Cos((90+angle)*#PI/180)
 y - Vitesse * Sin((90+angle)*#PI/180)
EndIf             

;Verouillage de la vitesse
If Vitesse=>VitesseMax 
Vitesse = VitesseMax
EndIf




;Sortie
If KeyboardPushed(#PB_Key_Escape) : End :EndIf 

FlipBuffers() 
ForEver 

EndIf 

Publié : jeu. 26/oct./2006 15:44
par frank
Salut Cpl.Bator et merci :)

Je cerne un peu mieux les lacunes de mon "code".

Sinon j'ai encore des points d'ombre comme ceci :

--> x - Vitesse * Cos((90+angle)*#PI/180)

Le fait de multiplier par PI puis de diviser par 180 degré, est ce juste une astuce pour exprimer la valeur en radian car le basic ne comprendrait que les radians ?

et deuxième point que j'arrive pas à visualiser c'est qu'il faille multiplier le pas (Vitesse) par l'angle pour obtenir le résultat espéré. J'arrive pas à me représenter ce concept, mais ça va peut être faire un déclic dans ma tête à force d'essayer de comprendre lol.
Encore merci pour ton aide.

Publié : jeu. 26/oct./2006 15:58
par Anonyme
x - Vitesse * Cos((90+angle)*#PI/180)

Si la vitesse est à 0 alors X-0*angle = X, donc on ne bouge pas
(90+angle) sert juste à mettre dans le bon sens l'angle suivant le sprite
(*#pi / 180) sert a convertir en radian si je ne me trompe pas
cela s'apelle les coordonées sphérique si je ne me trompe toujours pas.

Le fait de multiplier est logique, fait une addition a la place en virant le cos() et le sin() tu iras beaucoup plus vite et tu n'auras que 8 directions, la, le cos() et le sin() font varier le pas en X & Y se qui donne un rayon d'action de 360 degrés.

si tu fait x + vitesse et y + vitesse tu iras vers le bas droit de l'écran
si tu fait x - vitesse et y + vitesse tu iras vers le bas gauche de l'écran
bref avec sa , tu n'a que 8 possibilitées.

Tandis que :
x + vitesse*cos(angleRad)
Suivant ton angle , vitesse ne sera pas multiplier par le meme facteur (cos(AngleRad)) , je te rapelle que les multiplications sont prioritaire au additions.

j'éspère avoir été compréhensible :D

Publié : ven. 27/oct./2006 0:58
par frank
Oui c'est compréhensible :) le ciel s'éclaircit :) A force de décortiquer le code les zones d'ombres se dissipent...
Encore merci.

Au fait ils sont jolis tes tanks, c'est toi qui les a dessinés ?

Publié : ven. 27/oct./2006 7:21
par Anonyme
Tant mieux si tu comprends :D
Oui, c'est moi qui les ai dessiner ^^

@++