Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 28/06/12 20:31 Sujet du message:
La loop tu la fais dans la fonction sur laquelle le timer expire. Elle te sert à parcourir toutes les instances de structure pour exécuter les actions correspondantes. _________________
La fonction cos du jass utilise déjà un tableau. Une fonction cos précise utilise des calculs complexes et est bien plus lourde qu'une multiplication, l'utilisation d'un tableau avec les valeurs précalculées a été pensé afin de mettre la fonction sur une calculatrice; les calculatrices actuelles utilisent toujours cette méthode, c'est seulement que le tableau est plus grand afin d'avoir des valeurs plus précises. _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 28/06/12 22:15 Sujet du message:
Jass:
//===================================================================================
// JumpingUnit by Fulldragon
//===================================================================================
//
// API :
//
// call JumpUnit(whichUnit, height, time)
//
// Requires :
//
// TimerUtils - Made by Vexorian
//
// Commentary
//
// You can use it without credits. it's totaly free.
//
//===================================================================================
// gl & hf
//===================================================================================
library JumpingUnit uses TimerUtils
globals
private timer T
private integer I = 0
private Parabole array P
endglobals
struct Parabole
unit u
real a
real b
real c
real incrementation
real x = 0
real max
static method Jumping takes nothing returns nothing
local integer i = 0
local Parabole p
local real a
local unit u
local real b
local real c
local real x
loop
exitwhen i == I
set p = P[i]
set x = x + p.incrementation
if x < p.max then
call SetUnitFlyHeight(u, a * Pow(x, 2) + b * x + c, 0)
set p.x = x
else
set I = I - 1
call SetUnitFlyHeight(u, 0, 0.01)
if I == 0 then
call ReleaseTimer(GetExpiredTimer())
endif
endif
set u = null
set i = i + 1
endloop
endmethod
endstruct
function JumpingUnit takes unit jumper, real height, real time returns nothing
local real a = 40;height * 4)/ 40;-1 * Pow40;time, 2))
local real b = -1 * a * time
local real c = GetUnitFlyHeight40;jumper41;
local Parabole p = Parabole.create40;41;
set P[I] = p
set T = NewTimer40;41;
set I = I + 1
set P[I].u = jumper
set P[I].a = a
set P[I].b = b
set P[I].c = c
set P[I].incrementation = 0.05
set P[I].max = time
if I == 1 then
call TimerStart40;T, 0.05, true, function Parabole.Jumping41;
endif
endfunction
endlibrary
voila ce que ça donne, mais du coup j'ai plus besoin de TimerUtils ??? _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 29/06/12 08:19 Sujet du message:
Oui, par contre quelques petits trucs :
Jass:
//===================================================================================
// JumpingUnit by Fulldragon
//===================================================================================
//
// API :
//
// call JumpUnit(whichUnit, height, time)
//
// Requires :
//
// TimerUtils - Made by Vexorian
//
// Commentary
//
// You can use it without credits. it's totaly free.
//
//===================================================================================
// gl & hf
//===================================================================================
library JumpingUnit uses TimerUtils
globals
private timer T = CreateTimer() // Créé ton timer ici plutôt d'en créer un à chaque fois, tu leakait d'un timer avant
private integer I = 0
private Parabole array P
endglobals
struct Parabole
unit u
real a
real b
real c
real incrementation
real x = 0
real max
static method Jumping takes nothing returns nothing
local integer i = 0
local Parabole p
local real a
local unit u
local real b
local real c
local real x
loop
exitwhen i == I
set p = P[i]
// Ici, je crois que tu t'es embrouillé avec les p.x, x et tout ça, non? Cette ligne arrêtera l'exécution du code, x n'ayant aucune valeur
// D'ailleurs il me semble que cette variable ne sert à rien puisque tu peux simplement utiliser p.x. Pareil pour a, b, c et le reste.
set x = x + p.incrementation
if x < p.max then
call SetUnitFlyHeight(u, a * Pow(x, 2) + b * x + c, 0)
set p.x = x
set i = i + 1 //Il ne faut ajouter 1 à i qu'ici pour que ce soit plus propre. Si cette instance avait été détruite, P[I-1] aurait pris sa place et n'aurait pas été énumérée
else
call p.destroy() // Libère l'instance de structure quand t'en as plus besoin
set I = I - 1 // La tu diminue le total, mais tu ne réindexes pas, il faut ajouter la ligne suivante :
set P[i] = P[I]
call SetUnitFlyHeight(u, 0, 0.01) // Tu n'as pas défini u, je crois que c'est plutôt p.u.
if I == 0 then
call PauseTimer(T) // Mieux vaut le mettre en pause que de le supprimer, sinon tu devras en créer à chaque fois que I == 1 dans JumpingUnit
endif
endif
set u = null
//set i = i + 1
//Cf plus haut
endloop
endmethod
endstruct
function JumpingUnit takes unit jumper, real height, real time returns nothing
local real a = 40;height * 4)/ 40;-1 * Pow40;time, 2))
local real b = -1 * a * time
local real c = GetUnitFlyHeight40;jumper41;
local Parabole p = Parabole.create40;41;
set P[I] = p
//set T = NewTimer() Tu leakais d'un timer là
set I = I + 1
set P[I].u = jumper
set P[I].a = a
set P[I].b = b
set P[I].c = c
set P[I].incrementation = 0.05
set P[I].max = time
if I == 1 then
call TimerStart40;T, 0.05, true, function Parabole.Jumping41;
endif
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 29/06/12 11:39 Sujet du message:
et voila, testé et approuvé
Jass:
library Jump uses TimerUtils
globals
private timer T = CreateTimer()
private integer I = 0
private Parabole array P
endglobals
struct Parabole
unit u
real a
real b
real c
real incrementation
real x = 0
real max
static method Jumping takes nothing returns nothing
local integer i = 0
local Parabole p
loop
exitwhen i == I
set p = P[i]
set p.x = p.x + p.incrementation
if p.x < p.max then
call SetUnitFlyHeight(p.u, p.a * Pow(p.x, 2) + p.b * p.x + p.c, 0)
set i = i + 1
else
call p.destroy()
set I = I - 1
set P[i] = P[I]
call SetUnitFlyHeight(p.u, 0, 0.01)
if I == 0 then
call PauseTimer(T)
endif
endif
endloop
endmethod
endstruct
function JumpUnit takes unit jumper, real height, real time returns nothing
local real a = (height * 4)/ (-1 * Pow(time, 2))
local real b = -1 * a * time
local real c = GetUnitFlyHeight(jumper)
local Parabole p = Parabole.create()
set P[I] = p
set P[I].u = jumper
set P[I].a = a
set P[I].b = b
set P[I].c = c
set P[I].incrementation = 0.05
set P[I].max = time
set I = I + 1
if I == 1 then
call TimerStart(T, 0.05, true, function Parabole.Jumping)
endif
endfunction
édit >> la balise ne bug même plus =) c'est un signe. _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 17/07/12 13:18 Sujet du message: Re: [vjass] JumpingUnit
fulldragon a écrit:
Nom de la fonction : JumpingUnit Créateur : Fulldragon
Fonctions requises : TimerUtils Code :
Jass:
//===================================================================================
// JumpingUnit by Fulldragon
//===================================================================================
//
// API :
//
// call JumpUnit(whichUnit, height, time)
//
// Requires :
//
// TimerUtils - Made by Vexorian
//
// Commentary
//
// You can use it without credits. it's totaly free.
//
//===================================================================================
// gl & hf
//===================================================================================
library JumpingUnit uses TimerUtils
globals
private timer T = CreateTimer()
private integer I = 0
private Parabole array P
endglobals
struct Parabole
unit u
real a
real b
real c
real incrementation
real x = 0
real max
static method Jumping takes nothing returns nothing
local integer i = 0
local Parabole p
loop
exitwhen i == I
set p = P[i]
set p.x = p.x + p.incrementation
if p.x < p.max then
call SetUnitFlyHeight(p.u, p.a * Pow(p.x, 2) + p.b * p.x + p.c, 0)
set i = i + 1
else
call p.destroy()
set I = I - 1
set P[i] = P[I]
call SetUnitFlyHeight(p.u, 0, 0.01)
if I == 0 then
call PauseTimer(T)
endif
endif
endloop
endmethod
endstruct
function JumpUnit takes unit jumper, real height, real time returns nothing
local real a = (height * 4)/ (-1 * Pow(time, 2))
local real b = -1 * a * time
local real c = GetUnitFlyHeight(jumper)
local Parabole p = Parabole.create()
set P[I] = p
set P[I].u = jumper
set P[I].a = a
set P[I].b = b
set P[I].c = c
set P[I].incrementation = 0.01
set P[I].max = time
set I = I + 1
if I == 1 then
call TimerStart(T, 0.01, true, function Parabole.Jumping)
endif
endfunction
endlibrary
Utilisation : Dans un escape poru sauter par dessus un obstacle.
Copyright : Totalement libre pas besoin de me citer où que ça soit.
Remarques : Attention SetUnitFlyHeight bug quelque peu sur la définition d'altitude. Il faut ajouter/enlever la compétence corbeau 'Amrf' pour pouvoir changer correctement la hauteur d'une unité lors de sa création.
_________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
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