Page 3 sur 3

Publié : lun. 19/janv./2009 9:17
par kelebrindae
Houà, plein de réponses pendant le week-end... Bon, alors:

@HuitBit, LSI:
Merci! :D
En fait, c'est surtout de la 2D (l'axe Y n'est jamais pris en compte): il n'y a que l'affichage qui est en 3D "pour faire joli".

@Beauregard:
avec tout ces trucs en assembleur ?
Oh, il n'y a que Atan2 en assembleur; le reste, c'est du PB classique.
Sinon, bravo pour la texture! (une petite remarque toutefois: les roues ont une texture à part; tu ne verras pas le petit logo PureBasic sur les enjoliveurs)

@Comtois:
Ah oui, pour les ElseIf, tu as raison. Je n'y avais pas pensé non plus (décidément...)
Pour ta remarque sur la difficulté de contrôler la voiture: je me suis dit que c'était peut-être dû à la trop grande sensibilité des contrôles; la voiture braque trop vite, ce qui oblige à tourner par petites "touches" rapides du clavier.
En réduisant cette sensibilité:

Code : Tout sélectionner

    ; LEFT / RIGHT = steering  
    If KeyboardPushed(#PB_Key_Right)
      car(1)\steerangle-(#PI/32)*(speedFactor/80) ; 80 (ou plus) au lieu de 40
      If car(1)\steerangle < -#PI/4.0 
        car(1)\steerangle = -#PI/4.0 
      EndIf
    ElseIf KeyboardPushed(#PB_Key_Left)
      car(1)\steerangle+(#PI/32.0)*(speedFactor/80) ; 80 (ou plus) au lieu de 40
      If car(1)\steerangle > #PI/4.0 
        car(1)\steerangle = #PI/4.0 
      EndIf
    Else ...
Ce sera peut-être plus jouable...

----------------------------------------------------------------------------------
J'ai apporté quelques modifs' au code:
- Suppression des "findFreeMesh" et consorts au profit de "#PB_any" (merci Comtois!)
- Clarification du code du clavier à l'aide de "ElseIf" (bis!)
- J'ai corrigé (je pense) le bug "Ogre Assertion Failed" dû au timer haute-résolution. Dans certains cas, ce bug se produisait quand le timer revenait à zéro => j'obtenais alors un valeur négative et trop grande. Mais dans certains autres cas, j'obtenais une valeur trop grande et positive (peut-être que j'interprète mal les "LARGE_INTEGER" en sortie du timer :? ). Bref: j'ai géré ce cas-là aussi et je n'ai pas revu le bug depuis.

J'ai mis à jour le code dans le premier Post et l'archive .zip.
http://keleb.free.fr/codecorner/downloa ... hysics.zip
J'ai aussi ajouté dans l'archive le .EXE et le tutorial de Marco Monster, pour ceux qui veulent aller plus loin.

A+ :wink:

Publié : lun. 19/janv./2009 14:09
par comtois
Je viens de prendre le temps de regarder pourquoi la caméra était aussi rigide derrière le véhicule... et en fait il faut que tu inverses les paramètres 'actuelle' et 'cible' dans la procédure CurveValue() !

et d'autre part, j'ai fait la même erreur dans mes derniers codes, pour un angle , il faut utiliser une autre procédure, sinon en vue de dessus , tu pars en vrille si tu fais un tour complet.

Et j'ai changé la valeur de Pv=90 dans la procédure manageCamera()
pour voir un effet.

Code : Tout sélectionner

Procedure.f curveValue(actuelle.f, Cible.f, P.f)
  If P > 1000.0
    P = 1000.0
  EndIf
  ProcedureReturn (actuelle + ( (Cible - actuelle) * P / 1000.0))
EndProcedure
Procedure.f WrapValue(angle.f); <- wraps a value into [0,360) fringe
   !fild dword[@f] ; <- now i have 360 into st0
   !FLD dword[p.v_angle]
   !FPREM
   !FADD st1,st0
   !fldz
   !fcomip st1
   !fcmovnbe st0,st1
   !FSTP st1
   ProcedureReturn
   !@@:dd 360
EndProcedure 
Procedure.f EcartAngle( Angle1.f , Angle2.f )
  Delta.f=Angle2-Angle1
  If Delta>180
    ProcedureReturn Delta-360
  ElseIf Delta<=-180
    ProcedureReturn Delta+360
  Else
    ProcedureReturn Delta
  EndIf   
EndProcedure
Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f )
  ;Calcule un angle progressif allant de la valeur actuelle à la valeur cible
  Delta.f = EcartAngle( Actuelle , Cible )
  If P > 1000 : P = 1000 : EndIf
  Valeur.f = Actuelle + ( Delta * P / 1000 )
  ProcedureReturn WrapValue( Valeur )
EndProcedure  

Publié : lun. 19/janv./2009 14:32
par beauregard
kelebrindae a écrit :@Beauregard:
avec tout ces trucs en assembleur ?
Oh, il n'y a que Atan2 en assembleur; le reste, c'est du PB classique.
Sinon, bravo pour la texture! (une petite remarque toutefois: les roues ont une texture à part; tu ne verras pas le petit logo PureBasic sur les enjoliveurs)
oui, j'ai depuis relativisé comme on dit et merci :) Pour les roue je l'avais remarqué aussi...

Publié : lun. 19/janv./2009 16:56
par kelebrindae
@Comtois:
Ah oui, c'est mieux comme ça!

J'ai corrigé le zip et le code dans le premier post, et au passage j'ai rajouté un petit truc qui ne sert pas à grand-chose mais qui est amusant: En appuyant sur F2, on peut maintenant faire passer la caméra du joueur au ghost et inversement... Vous pouvez donc admirer votre meilleure course sous tous les angles 8).

Publié : lun. 19/janv./2009 20:22
par comtois
pas mal le F2 :)

J'ai l'impression que je ne t'ai pas donné la bonne procédure pour CurveAngle(), va falloir que je fouille mieux mes codes ! ou alors j'ai une fonction qui merdouille depuis toujours ? :oops:

J'ai remplacé ma fonction par celle de Cpl.Bator et apparemment, ça fonctionne mieux, sinon avec la mienne sous certains angles , ça partait en vrille :?

Code : Tout sélectionner

Procedure.f curveangle(oldangle.f,newangle.f, increments.f)
  If increments>1
    If (oldangle+360)-newangle<newangle-oldangle
      oldangle=360+oldangle
    EndIf
    If (newangle+360)-oldangle<oldangle-newangle
      newangle=360+newangle
    EndIf
    oldangle=oldangle-(oldangle-newangle)/increments
  EndIf
 
  If increments<=1
    ProcedureReturn newangle
  EndIf
  ProcedureReturn oldangle
EndProcedure 

Publié : ven. 23/janv./2009 18:18
par kelebrindae
@Comtois:
Désolé d'avoir mis du temps à répondre, j'ai été un peu occupé...

Petite mise à jour du code dans le premier post et de l'archive:
http://keleb.free.fr/codecorner/downloa ... hysics.zip

Contenu:
- J'ai intégré ta correction sur le curveAngle;
- j'ai aussi apporté une petite modif' pour tenter de réduire les saccades du ghost : concrètement, j'avais une variable en int au lieu de float, ce qui devait réduire la précision de la mesure du temps (avec le timer hi-def seulement). Ce n'est pas encore parfait, mais là j'abandonne; je ne comprends pas pourquoi il reste des saccades de temps à autres...

[EDIT]
Râaah, non, la modif que j'ai faite n'a quasiment aucun effet sur les saccades; je dois me planter quelque part dans l'interpolation. :x Je laisse tomber! :x