Je savais bien qu'il fallait laisser la lumière ouverte !
Les method say cool.
Heheh, je vais mettre le post à jour pour la forme. Laisse moi réécrire ça. Par contre ce sera toujours un timer par slide parce que bon, j'ai pas envie de m'embêter avec. On a la place. _________________
Plutôt des changements sur la forme que sur le fond, mais voilà :
Secret:
Code:
library CircleSlide requires TimerUtils
//*********************************************************************
//Méthode principale :
//static method create takes unit whichUnit,
// real speed,
// real aroundX,
// real aroundY,
// real duration,
// real offset
// returns circleslide
//
//whichUnit est l'unité qui va tourner autour du point.
//speed est la vitesse linéaire de l'unité, en distance par seconde. Valeur positive pour tourner dans le sens trigonométrique, négative pour le sens horaire.
//aroundX et aroundY sont les coordonnées du point autour duquel l'unité va tourner
//duration est la durée du mouvement.
//offset est la vitesse à laquelle l'unité va s'éloigner du point. Valeur négative pour l'en approcher.
//
//*********************************************************************
//
//Getters :
//method getUnit takes nothing returns unit
//method getSpeed takes nothing returns real
//method getCenterX takes nothing returns real
//method getCenterY takes nothing returns real
//method getRemainingTime takes nothing returns real
//method getOffset takes nothing returns real
//
//Setters :
//method setUnit takes unit newUnit returns boolean
//method setSpeed takes real newSpeed returns boolean
//method setCenterX takes real newAroundX returns nothing
//method setCenterY takes real newAroundY returns nothing
//method setRemainingTime takes real newDuration returns boolean
//method setOffset takes real newOffset returns boolean
//Les méthodes renvoyant un booléen indiquent si l'opération n'a pas détruit la struct et donc arrêté le mouvement.
//
//*********************************************************************
globals
private constant real FLUID_VIS_PERIOD = 0.027
//Fluid-Visual Period. Ce temps séparera chacun
//des mouvements effectués de façon à ce que le
//résultat final paraisse fluide.
endglobals
struct circleslide
private unit whichUnit //Unité en mouvement
private timer whichTimer
private real speed //Vitesse linéaire de l'unité
private real aroundX //Coordonnées du centre du cercle
private real aroundY
private real duration //Temps restant
private real offset //L'unité s'éloigne du centre à cette vitesse chaque occurrence.
//Getters
method getUnit takes nothing returns unit
return this.whichUnit
endmethod
method getSpeed takes nothing returns real
return this.speed
endmethod
method getCenterX takes nothing returns real
return this.aroundX
endmethod
method getCenterY takes nothing returns real
return this.aroundY
endmethod
method getRemainingTime takes nothing returns real
return this.duration
endmethod
method getOffset takes nothing returns real
return this.offset
endmethod
//Setters
method setUnit takes unit newUnit returns boolean
local boolean b = (whichUnit != null)
if (b) then
set this.whichUnit = newUnit
else
call this.destroy()
endif
return b
endmethod
method setSpeed takes real newSpeed returns boolean
local boolean b = (newSpeed == 0 and this.offset == 0)
set this.speed = newSpeed
if (b) then
call this.destroy()
endif
return (not b)
endmethod
method setCenterX takes real newAroundX returns nothing
set this.aroundX = newAroundX
endmethod
method setCenterY takes real newAroundY returns nothing
set this.aroundY = newAroundY
endmethod
method setRemainingTime takes real newDuration returns boolean
local boolean b = (newDuration >= FLUID_VIS_PERIOD)
if (b) then
set this.duration = newDuration
else
call this.destroy()
endif
return b
endmethod
method setOffset takes real newOffset returns boolean
local boolean b = (this.speed == 0 and newOffset == 0)
set this.offset = newOffset
if (b) then
call this.destroy()
endif
return (not b)
endmethod
private static method cycle takes nothing returns nothing
local circleslide this = GetTimerData(GetExpiredTimer())
//Calcul de la nouvelle position
local real dx = GetUnitX(this.whichUnit) - this.aroundX
local real dy = GetUnitY(this.whichUnit) - this.aroundY
local real distance = SquareRoot((dx * dx) + (dy * dy)) + this.offset //distance du centre
local real angle = Atan2(dy,dx) + Atan2(this.speed,distance)
local real x = this.aroundX + distance * Cos(angle)
local real y = this.aroundY + distance * Sin(angle)
//Réglage de la nouvelle position
call SetUnitX(this.whichUnit,x)
call SetUnitY(this.whichUnit,y)
//Fin du cycle ?
set this.duration = this.duration - FLUID_VIS_PERIOD
if (this.duration <= 0) then
call this.destroy()
endif
endmethod
static method create takes unit whichUnit, real speed, real aroundX, real aroundY, real duration, real offset returns circleslide
local circleslide this = 0
//Vérification que les paramètres sont corrects.
if (whichUnit == null) then
debug call BJDebugMsg("circleslide.create() : L'unité donnée n'existe pas. Le mouvement a été annulé. Merci de signaler ce problème au développeur.")
return 0
endif
if (duration < FLUID_VIS_PERIOD) then
debug call BJDebugMsg("circleslide.create() : La durée donnée est trop courte. Le mouvement a été annulé. Merci de signaler ce problème au développeur.")
return 0
endif
//Setting struct
set this = circleslide.allocate()
set this.whichUnit = whichUnit
set this.whichTimer = NewTimer()
set this.speed = speed * FLUID_VIS_PERIOD
set this.aroundX = aroundX
set this.aroundY = aroundY
set this.duration = duration
set this.offset = offset * FLUID_VIS_PERIOD
Les commentaires sont passés en français et les membres en privé (avec setters et getters associés) - et c'est tout en méthode. Aussi, fait non négligeable, le code marche. Hrm. Je mettrais ça en première page après approbation / relecture. _________________
Y'a jamais eu vraiment de système d'approbation ici, tu postes ton code et on prie pour que ca fonctionne, stou
Bah, je voulais être sûr que ce soit pas trop moche quoi.
Première page mise à jour, et il semblerait que la balise JASS n'aime pas les if (b) then. C'est pas un nom très évocateur mais je ne m'en sers que pour des fonctions courtes. _________________
Une petite relecture m'a fait remarquer que (1) j'acceptais une vitesse nulle à la création, (2) je stockais la vitesse après l'avoir multiplié par FLUID_VIS_PERIOD mais renvoyais la vitesse telle qu'elle était stockée et donc pas par second et (3) les méthodes setSpeed et setOffset ne multipliaient pas la vitesse par FLUID_VIS_PERIOD. Je suis un peu trop flemmard avec tout ces machins et je les teste pas comme il faut Je vais mettre la première page à jour. _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page Précédente1, 2
Page 2 sur 2
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum