Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=6e4d639ffd6d5037d4519150c546d49cMédailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

[vjass] Sinusoïdale moving

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Fonction Jass
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 23/09/12 18:25    Sujet du message: [vjass] Sinusoïdale moving Citer

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)
                   
                    call SetUnitX(s.u[j], s.pos_X[j] + X)
                    call SetUnitY(s.u[j], s.pos_Y[j] + Y)
                   
                    set j = j + 1
                endloop
               
                set i = i + 1
            endloop
           
        endmethod
       
       
       
        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
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 24/09/12 17:59    Sujet du message: Citer

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.
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 24/09/12 19:14    Sujet du message: Citer

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
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 24/09/12 19:45    Sujet du message: Citer

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 ^^).
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 24/09/12 20:09    Sujet du message: Citer

aussi tôt dit aussi tôt fait Smile
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Sapeur-Goblin
Floodeur prématuré


Inscrit le: 14 Oct 2009
Messages: 719
Sujets: 40
Spécialité en worldedit: Les bugs
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 27/09/12 17:01    Sujet du message: Citer

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.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 27/09/12 18:36    Sujet du message: Citer

c'est pourquoi j'ai fait une fonction et que je dis de passer par la Surprised
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 29/07/14 10:52    Sujet du message: Citer

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 Wink 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é Wink 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
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 29/07/14 11:45    Sujet du message: Citer

mise à jours du snake. testé et fonctionnel.
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 29/07/14 12:12    Sujet du message: Citer

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)
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 29/07/14 12:49    Sujet du message: Citer

tu aurais pu donner la formule générale Wink c'est pour cette raison que je t'accuse qu'à 5% :p
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 29/07/14 15:12    Sujet du message: Citer

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
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Fonction Jass Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com