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

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
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

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

Oui, c'est moi qui les ai dessiner ^^
@++