Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 23/09/12 18:25 Sujet du message: [vjass] Sinusoïdale moving
Nom de la fonction : SinusoidaleMoving Créateur : Fulldragon
Fonctions requises : librarie TimerUtilsEx
Code :
Jass:
//===================================================================================
// Sinusoidale moving by Fulldragon
//===================================================================================
//
// API :
//
// if you choose time = 0, the snake won't auto remove.
// call create(player owner, integer type_unit, integer nb_unit, real x1, real y1, real x2, real y2, real amplitude, real nb_oscillation, real period_time, real time)
// call destroy()
//
// Requires :
//
// TimerUtilsEx
//
// Commentary
//
// You can use it without credits. it's totaly free.
//
//===================================================================================
// gl & hf
//===================================================================================
library SinusoidaleMoving uses TimerUtils
globals
private timer T = CreateTimer()
private integer L = 0
private Snake array Sn
endglobals
struct Snake
integer nb_unit
real amplitude
real speed
real angle
real coef
//if you want more than 200 units, change all theese array.
real array compteur[200]
real array pos_X[200]
real array pos_Y[200]
unit array u[200]
private static method MovingSnake takes nothing returns nothing
local integer i = 0
local integer j
local Snake s
local real x = 0
local real X
local real y
local real Y
loop
exitwhen i == L
set s = Sn[i]
set j = 0
loop
exitwhen j > s.nb_unit
set s.compteur[j] = s.compteur[j] + s.speed
set y = s.amplitude * SinBJ(s.coef * s.compteur[j])
set X = x * CosBJ(s.angle) - y * SinBJ(s.angle)
set Y = x * SinBJ(s.angle) + y * CosBJ(s.angle)
method destroy takes nothing returns nothing
local integer i = 0
loop
exitwhen i > this.nb_unit
call RemoveUnit(this.u[i])
set i = i + 1
endloop
set i = 0
loop
exitwhen this == Sn[i] or i == L
set i = i + 1
endloop
call Snake.deallocate(this)
set L = L - 1
set Sn[i] = Sn[L]
endmethod
private static method RemoveSnake takes nothing returns nothing
local thistype this = GetTimerData(GetExpiredTimer())
call this.destroy()
endmethod
static method create takes player owner, integer type_unit, boolean is_multicolor, integer nb_unit, real x1, real y1, real x2, real y2, real amplitude, real nb_oscillation, real period_time, real time returns Snake
local integer i = 1
local real dx = x2 - x1
local real dy = y2 - y1
local real angle = bj_RADTODEG * Atan2(dy, dx)
local real lenght = SquareRoot(dx * dx + dy * dy)
local real longueur_onde = lenght / (nb_oscillation / 2)
local real dist_between_unit = lenght / I2R(nb_unit)
local thistype this = thistype.allocate()
local real x = 0
local real X
local real y = 0
local real Y
local real coef = 360 / longueur_onde
local timer t = NewTimer()
set Sn[L] = this
set Sn[L].nb_unit = nb_unit
set Sn[L].amplitude = amplitude
set Sn[L].speed = 0.01 * longueur_onde / period_time
set Sn[L].coef = coef
set Sn[L].angle = angle
set Sn[L].u[0] = CreateUnit(owner, type_unit, x1, y1, angle)
set Sn[L].pos_X[0] = GetUnitX(Sn[L].u[0])
set Sn[L].pos_Y[0] = GetUnitY(Sn[L].u[0])
if is_multicolor then
call SetUnitColor(Sn[L].u[0], GetPlayerColor(Player(GetRandomInt(0, 11))))
endif
loop
exitwhen i > nb_unit
set x = x + dist_between_unit
set X = x * CosBJ(angle) - y * SinBJ(angle)
set Y = x * SinBJ(angle) + y * CosBJ(angle)
set Sn[L].u[i] = CreateUnit(owner, type_unit, X + GetUnitX(Sn[L].u[0]), GetUnitY(Sn[L].u[0]) + Y, angle)
set Sn[L].pos_X[i] = GetUnitX(Sn[L].u[i])
set Sn[L].pos_Y[i] = GetUnitY(Sn[L].u[i])
set Sn[L].compteur[i] = i * dist_between_unit
if is_multicolor then
call SetUnitColor(Sn[L].u[i], GetPlayerColor(Player(GetRandomInt(0, 11))))
endif
set i = i + 1
endloop
if time > 0 then
call SetTimerData(t, Sn[L])
call TimerStart(t, time, false, function Snake.RemoveSnake)
endif
set L = L + 1
if L == 1 then
call TimerStart(T, 0.01, true, function Snake.MovingSnake)
endif
return Sn[L-1]
endmethod
endstruct
endlibrary
Utilisation : Dans un slide, si vous voulez un passage en ligne droite avec des patrols bien ordonnées en rythme sur un léger décalage réglable, vous pouvez.
techniquement cela crée une droite animé d'un mouvement sinusoïdale.
Copyright : c'est libre de droit
Remarques : on ne peut pas dépasser 200 unités, mais cette limite est modifiable facilement (même si je vous le déconseille, c'est déjà beaucoup)
Pour utiliser cette fonction il vous faut la dernière version de jngp. _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Dernière édition par kungfu-sheep le 29/07/14 15:10; édité 6 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 24/09/12 17:59 Sujet du message:
Déjà, faudrait enlever cette constante "MOB" et la remplacer par un argument.
Ensuite, il n'y a aucun moyen de récupérer la structure "Snake" hors de cette librairie et donc aucun moyen de la détruire.
Après, tu demandes 2 rects en argument alors que tu n'utilises que leurs centres.
Enfin, je n'ai réussi à utiliser des ordres de grandeurs qui marchent, pour les arguments, qu'après avoir tâtonné (l'exemple que tu m'as donné me faisait juste lagger et ne marchait plus après avoir réduit le nombre d'unités).
C'est vraiment pas du vJass très propre. Dis-toi que si tu posts une librairie ici, son utilisation doit être simple. _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 24/09/12 19:14 Sujet du message:
Tirlititi a écrit:
Déjà, faudrait enlever cette constante "MOB" et la remplacer par un argument.
argl j'oublie toujours une de mes constantes désolé --"
Citation:
Ensuite, il n'y a aucun moyen de récupérer la structure "Snake" hors de cette librairie et donc aucun moyen de la détruire.
oui j'y avais pensé après coup quand j'l'ai utilisé, j'l'ai modifié sur un autre forum mais j'ai oublié ici apparemment.
Citation:
Après, tu demandes 2 rects en argument alors que tu n'utilises que leurs centres.
quand t'es sur le terrain de ta map, pour savoir où placer ton snake c'est plus simple de mettre des régions que d'utiliser des coordonnées réelles. et c'est plus propre de mettre juste une région que "GetRectCenterX(...)" dans les paramètres de ta fonction.
Citation:
Enfin, je n'ai réussi à utiliser des ordres de grandeurs qui marchent, pour les arguments, qu'après avoir tâtonné (l'exemple que tu m'as donné me faisait juste lagger et ne marchait plus après avoir réduit le nombre d'unités).
ah ? j'ai eu aucun problème de lag, j'ai testé avec 200 unités pourtant oO.
Citation:
C'est vraiment pas du vJass très propre. Dis-toi que si tu posts une librairie ici, son utilisation doit être simple.
tu entends quoi par simple ? tu parles du tâtonnement que tu as du faire ? :/ perso moi aussi j'ai tâtonné pour utiliser, mais j'arrive pas à faire mieux... _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 24/09/12 19:45 Sujet du message:
J'ai testé sur mon portable, qui lag très vite.
Déjà, je pense que tu devrais remplacer la ligne qui définit la vitesse de CreateSinusoidaleSnake :
Jass:
set Sn[L].speed = 0.01*360/speed
De cette façon, ton serpent fera 1 oscillation en "speed" secondes (tu peux renommer l'argument speed en period_time pour rendre ça plus explicite).
Faut au moins faire la conversion "secondes -> intervalle du timer" dans ce genre de fonctions.
Sinon, tu devrais renvoyer le serpent créé avec cette fonction à la place de mettre la variable Sn publique. C'est beaucoup plus logique et facile.
fulldragon a écrit:
tu entends quoi par simple ? tu parles du tâtonnement que tu as du faire ?
Oui, par exemple (même si je viens de t'en donner un autre ^^). _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 27/09/12 17:01 Sujet du message:
Tu devrais inclure tes fonctions de création/destruction dans ta structure. Ça serait plus logique, et actuellement, si quelqu'un crée un SinusoidaleMoving avec la méthode create, ou qu'il le détruit avec la méthode destroy, ça ferait des jolis bugs. _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 29/07/14 10:52 Sujet du message:
tirlititi je t'annonce officiellement que c'est à cause de toi si ma library ne fonctionnait pas :p
Tirlititi a écrit:
Déjà, je pense que tu devrais remplacer la ligne qui définit la vitesse de CreateSinusoidaleSnake :
Jass:
set Sn[L].speed = 0.01*360/speed
cette ligne est fausse en faite comme je veux aussi pouvoir régler le nombre d'oscillation de ma sinusoide, la longueur d'onde ne sera pas toujours de 360 (contrairement à celui d'un SinBJ(x) pour x réel)
et pour ça j'avais créé un coef. je multiplie x par ce coef en question et j'obtiens la longueur d'onde désiré.
pour le coup la vraie formule est :
Jass:
local real coef = 360 / longueur_onde
et va savoir pourquoi j'ai mi autre chose de super bizarre (ça m'a pris 30 minutes de savoir à quoi servait ce coef aujourd'hui, car la formule ne correspondait à rien oO)
donc si on y réfléchit, la plus grosse erreur vient de moi :p mais tu es responsable, disons à 5% pour m'avoir mal guidé et surtout tu avais tord :p et ça ça n'arrive pas souvent :p
bientôt une version révisé de ma library (je pense qu'elle vomira toujours à l'aspect, mais au moins elle fonctionnera) _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 29/07/14 12:12 Sujet du message:
Ha... Hahahaha.
Ma formule est tout à fait correcte, il fallait juste l'ajuster si tu voulais pouvoir faire des longueurs d'ondes différentes. Je te rappelle qu'au moment où je t'ai fait ce conseil, tu demandais à l'utilisateur de mettre un argument "speed" qui ne correspondait strictement à rien : il fallait tester différentes valeurs pour avoir le résultat voulu. Et c'était ça que je pointais du doigt.
Donc, ouais, ma formule était peut-être très épurée, mais si tu veux qu'on fasse tes librairies à ta place, tu risques pas de progresser.
(Après je comprend que tu cherches la moindre faille dans mes posts, mais je pense pas que ce sera pour cette fois :p) _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 29/07/14 15:12 Sujet du message:
j'avais pas testé le multi instance, et il s'avérait qu'il y avait un problème (à cause d'une erreur vraiment bizarre oO j'ai vraiment codé ça avec les orteils :p) + une erreur de couper coller qui faisait déconner la première unité spawnée.
bref, réparé. _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
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