Nom de la fonction : Recul Créateur : Bryce de Mouriès modifié par Rhadamante
Fonctions requises : la librairie TimerUtils, à copier dans le code script personnalisé ou un déclencheur vide.
Elle sert à éviter les problèmes liés à la destruction ou à la nullification de timer et surtout permet l'attachement de données. (Une librairie c'est un paquet de fonctions dont on veut être sûr qu'elle seront placées au début du script, avant d'autres fonctions qui y feraient appel)
Code : à copier dans le code script personnalisé
Jass:
library Recul needs TimerUtils
globals
private constant real TIMEOUT = 0.02
private constant integer TYPE = 'hpea'
private unit TEST = null
// TIMEOUT = l'intervalle de temps entre chaque déplacement, augmentez-le si ça lag
// TEST = unité qui va nous servir pour déterminer si le prochain déplacement est possible
// TYPE = le type d'unité qui sera utilisée pour déterminer si le prochain déplacement est possible
// plus la valeur de sa Taille Collision est faible, plus c'est joli, là c'est le paysan qui a une taille de 16.0
// le mieux est de mettre une unité personnalisée avec une taille de 8.0
endglobals
//==========================================================================================
// Permet de savoir si le prochain déplacement de l'unité est possible ou pas
private function IsPointPathableForUnit takes real x, real y, unit whichUnit returns boolean
local real tx = 0
local real ty = 0
call ShowUnit(whichUnit, false)
if TEST == null then
set TEST = CreateUnit(Player(15), TYPE, 0.0, 0.0, 0.0)
else
call ShowUnit(TEST, true)
endif
call SetUnitPosition(TEST, x, y)
set tx = GetUnitX(TEST)
set ty = GetUnitY(TEST)
call ShowUnit(TEST, false)
call ShowUnit(whichUnit,true)
return (x == tx and y == ty)
endfunction
//==========================================================================================
// Déclaration d'une struct, une sorte de "super" variable.
// On peut stocker plusieurs variables de plusieurs types dans une struct, puis l'utiliser comme n'importe quel autre type de variable.
struct recul_st
unit target
real angle
integer distance
integer vit
integer i
endstruct
// dans un trigger les membres d'une struct (les variables qui y sont stockées) sont désignées par nomdelastruct.nomdelavariable
// par exemple pour la variable target stockée dans la struct st ce serait st.target
//==========================================================================================
// fonction appelée à chaque fois que le timer de la fonction Recul expire
private function Action takes nothing returns nothing
local timer t = GetExpiredTimer() // on récupère le timer de la fonction Recul qui a expiré
local recul_st st = GetTimerData(t) // on récupère la struct attaché au timer qu'on vient de récupérer (via TimerUtils)
local real newX = GetUnitX(st.target) + st.vit*Cos(st.angle)
local real newY = GetUnitY(st.target) + st.vit*Sin(st.angle)
// tant que le nombre de déplacement ne dépasse le nombre fixé et si le pathing du terrain lui permet, on déplace l'unité
if (st.i < st.distance) and IsPointPathableForUnit(newX, newY, st.target) then
set st.i = st.i + 1 // on incrémente le compteur du nombre de déplacement
call SetUnitPosition(st.target, newX, newY) // on déplace l'unité
else // actions à effectuer dés que la distance de recul a été atteinte
call SetUnitPathing( st.target, true)
call ReleaseTimer(t) // correspond à la "libération" du timer, à son recyclage pour une utilisation ultérieure
call st.destroy() // on détruit la struct
endif
endfunction
//==========================================================================================
// la fonction que vous appellerez dans vos déclencheurs sous la forme
// call Recul(x, y, target, distance, vit)
// x et y = coordonnée X et Y du point d'origine du recul
// target = la cible visée par le recul
// distance = la distance de recul
// vit = la vitesse de recul (~20 pour un bon effet)
function Recul takes real x, real y, unit target, integer distance, integer vit returns nothing
local timer t = NewTimer() // création d'un nouveau timer
local recul_st st = recul_st.create() // création d'une struct du type recul_st déclarée plus haut
call SetUnitPathing( target, false)
set st.target = target // la cible du recul
set st.angle = Atan2(GetUnitY(target) - y, GetUnitX(target) - x) // l'angle selon lequel elle sera déplacée
set st.distance = distance/vit // le nombre de fois qu'elle sera déplacée
set st.vit = vit // la vitesse de ce déplacement
set st.i = 0 // on initialise le compteur du nombre de déplacement
call SetTimerData(t, st) // on stocke la struct en l'attachant au timer créé (via TimerUtils)
call TimerStart (t, TIMEOUT, true, function Action ) // on démarre le timer périodique qui lancera le déplacement autant de fois que prévu
endfunction
endlibrary
Utilisation : Éjecter ou Pousser des unités
Copyright : Tout le monde peut l'ajouter à sa map, pas besoin de crédit pour ça mais si on vous demande qui l'a créée dites pas que c'est vous
Remarques : nécessite le Jass NewGen Pack. _________________
Dernière édition par Rhadamante le 08/02/09 14:37; édité 6 fois
Il existe une meilleur méthode ? Si oui, je t'en prie ne te gêne pas (comme ça si j'en ai besoin je pourrai en profiter ). Je l'ai juste poster parce que je l'ai retrouvé perdu au fin fond d'un vieux dossier... _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 27/04/08 14:32 Sujet du message:
Rhadamante a écrit:
Il existe une meilleur méthode ? Si oui, je t'en prie ne te gêne pas (comme ça si j'en ai besoin je pourrai en profiter ). Je l'ai juste poster parce que je l'ai retrouvé perdu au fin fond d'un vieux dossier...
ouai mais bon c'est du vJass (la meilleure méthode) et il faut savoir que détruire un timer peut faire bugger, faut les recycler y'a une méthode toute simple pour cela.
Je te conseille de lire la doc du jassnewgenpack.
Faut utiliser une struct et un système d'attachement quelquonque.
Le plus simple est de stocker dans le cache l'index de la struct local ainsi crée (renvoie un entier) _________________
Mais comme blizzard ne tient pas au courant de ses modifications dans les patchs autres que les modifs de maps, peut être que depuis ce bug a été corrigé
Par recycler je veux dire au lieu de détruire un timer, le mettre en pause.
Quand on a besoin d'un timer, on réutilise un timer en pause (pas besoin de le unpause), si il n'y en a plus/pas de libre on en créé un autre _________________
Je te conseille de lire la doc du jassnewgenpack.
Faut utiliser une struct et un système d'attachement quelquonque.
Le plus simple est de stocker dans le cache l'index de la struct local ainsi crée (renvoie un entier)
Moi noob, moi besoin exemple pour comprendre, toi donner exemple, moi donner femme à toi, toi quoi dire ?
ps : désolé j'ai pas assez de café dans le sang... _________________
Je ne savais pas que le café avait une influence quelquonque sur la formulation de phrases.
Non, il a une influence sur mon état de veille, donc mes capacités de réflexion, donc ma capacité à formuler des phrases... mais pourquoi tu dis ça ? Elle avait quelque chose de bizarre ma phrase ?
Troll-Brain a écrit:
Ce que je dis :
Est t'elle consentante ?
Je sais pas je lui demanderais dés que je lui aurais enlever son baillon.
Troll-Brain a écrit:
Mais faut vraiment faire l'effort de lire la doc du pack ( dans le sous dossier jasshelper).
Ca y est a lu !
J'ai un truc à proposer, si c'est pas bon, pas taper siouplait !
J'utilise ça :
Jass:
library CSSafety
//===========================================================================
globals
private timer array T
private integer N = 0
endglobals
//===========================================================================
function NewTimer takes nothing returns timer
if (N==0) then
return CreateTimer()
endif
set N=N-1
return T[N]
endfunction
function ReleaseTimer takes timer t returns nothing
call PauseTimer(t)
if (N==8191) then
debug call BJDebugMsg("Warning: Timer stack is full, destroying timer!!")
//stack is full, the map already has much more troubles than the chance of bug
call DestroyTimer(t)
else
set T[N]=t
set N=N+1
endif
endfunction
endlibrary
function H2S takes handle h returns string
return I2S(H2I(h))
endfunction
Et le nouveau code serait quelque chose comme :
Jass:
struct recul_st
unit target
real angle
integer distance
integer vit
integer i
endstruct
//===========================================================================
function Recul_Action takes nothing returns nothing
local timer t = GetExpiredTimer()
local recul_st st = GetStoredInteger(udg_Spell,H2S(t),"timer")
local unit target = st.target
local real angle = st.angle
local integer distance = st.distance
local integer vit = st.vit
local integer i = st.i
if (i < distance) then
set st.i = st.i + 1
call SetUnitPosition(target, GetUnitX(target) + vit*Cos(angle), GetUnitY(target) + vit*Sin(angle))
else
call SetUnitPathing( target, false)
call ReleaseTimer(t)
call FlushStoredMission(udg_Spell,H2S(t))
call st.destroy()
endif
endfunction
function Recul takes real x, real y, unit target, integer distance, integer vit returns nothing
local timer t = NewTimer()
local recul_st st = recul_st.create()
call SetUnitPathing( target, true)
set st.target = target
set st.angle = Atan2(GetUnitY(target) - y, GetUnitX(target) - x)
set st.distance = distance/vit
set st.vit = vit
set st.i = 0
call StoreInteger(udg_Spell,H2S(t),"timer",st)
call TimerStart (t, 0.02, true, function Recul_Action )
endfunction
Je sais pas si c'est n'importe quoi, en tout cas en test j'ai l'impression que ça marche comme avant. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 27/04/08 21:44 Sujet du message:
clap clap clap, mes fécilitations tu as trés bien compris.
Juste une petite remarque dans la fonction Recul_Action t'aurais pu te passer de déclarer des locales qui utilisent les membres de ta struct recul_st
Et une autre remarque concernant le code de Bantas cette fois.
au lieu de H2S utilises plutôt directement I2S(H2I()).
tu gagnes ainsi un appel de fonction ce qui n'est pas négligeable dans un si faible périodique.
PS : pour la femme relache là, j'aime pas quand c'est gratuit _________________
Inscrit le: 13 Oct 2007 Messages: 994 Sujets: 25 Spécialité en worldedit: Codeur
Posté le: 28/04/08 08:49 Sujet du message:
C'est très intéressant ces histoires de timer. Mais est-ce qu'il y a des cas ou des bugs arrivent plus souvent que d'autres cas ? Parce que depuis le temps que j'utilise des timers en les détruisant de partout je n'ai jamais eu de problème :s
EDIT : Pour Rhadamante, n'hésite pas a commenter ton code. _________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 29/04/08 17:09 Sujet du message:
Citation:
Tu veux dire que je vire toute cette partie et que je peux les utiliser directement (en remplaçant les target par st.target, etc.) ?
Jass:
local unit target = st.target
local real angle = st.angle
local integer distance = st.distance
local integer vit = st.vit
local integer i = st.i
ouep
Citation:
Ah mais je la retiens pas prisonnière, c'est juste que le baillon c'est le seul moyen que j'ai trouver pour la faire taire.
c'est un des nombreux inconvénients d'une femme, ca vide aussi les bourses (tous les sens du terme)
Bon je pense qu'il est temps d'arrêter notre délire, je tombe dans la facilité, la misogénie vulgaire
Citation:
C'est très intéressant ces histoires de timer. Mais est-ce qu'il y a des cas ou des bugs arrivent plus souvent que d'autres cas ? Parce que depuis le temps que j'utilise des timers en les détruisant de partout je n'ai jamais eu de problème :s
jsé pas comme je l'ai dit je me suis contenté de lire
Citation:
EDIT : Pour Rhadamante, n'hésite pas a commenter ton code.
+1 (même si moi même je le fais rarement ) _________________
EDIT : Pour Rhadamante, n'hésite pas a commenter ton code.
Je veux bien commenter, mais franchement je sais pas quoi mettre. Je me dit que ceux qui serait intéressé par une telle fonction, soit utilise le Jass mais l'ont déjà (sous cette forme ou une autre), soit utilise le GUI et ne voudront pas l'utiliser.
Si tu me dis quel genre de commentaires je pourrais mettre, je les rajouterais sans problème. _________________
Inscrit le: 13 Oct 2007 Messages: 994 Sujets: 25 Spécialité en worldedit: Codeur
Posté le: 29/04/08 22:51 Sujet du message:
Jass:
//Structure contenant tous les paramètres d'un recul pour une unité.
struct recul_st
unit target //Unité gérée par la structure
real angle //Angle du recul
integer distance //Distance du recule
integer vit //Vitesse du reculle
integer i //Bah on n'en sais rien et sans commentaire faut tout se taper pour le savoir. C'est un compteur pour savoir combien de fois la structure a été utilisé, non ?
endstruct
//Actions appellés à intervalle régulier pour chaque structure à l'aide d'un timer périodique.
function Recul_Action takes nothing returns nothing
local timer t = GetExpiredTimer()
//On récupère la structure associée
local recul_st st = GetStoredInteger(udg_Spell,I2S(H2I(t)),"timer")
//Si la distance n'est pas atteinte on continue, sinon le recul s'arrète.
if (st.i < st.distance) then
set st.i = st.i + 1
call SetUnitPosition(st.target, GetUnitX(st.target) + st.vit*Cos(st.angle), GetUnitY(st.target) + st.vit*Sin(st.angle)) //Déplacement de l'unité selon l'angle et la vitesse.
else
//Arrêt du recul. On remet l'unité normal, le timer et la structure sont détruite.
call SetUnitPathing( st.target, false) //A quoi ça sert ?
call ReleaseTimer(t)
//La structure est retiré du gamecache.
call FlushStoredMission(udg_Spell,I2S(H2I(t)))
call st.destroy()
endif
endfunction
//Fonction qui poussera une unité dans une direction.
//@x real : Coordonnée de départ sur l'axe X
//@y real : Coordonnée de départ sur l'axe Y
//@target unit : Unité qui sera poussée.
//@distance integer : Distance du trajet.
//@integer vit : Vitesse du déplacement.
function Recul takes real x, real y, unit target, integer distance, integer vit returns nothing
//Un timer associé à une structure son créés.
//L'unité sera déplacé petit à petit à chaque fin du timer.
local timer t = NewTimer()
local recul_st st = recul_st.create()
call SetUnitPathing( target, true) //A quoi ça sert ?
//Affectations des attributs de la structure
set st.target = target
set st.angle = Atan2(GetUnitY(target) - y, GetUnitX(target) - x)
set st.distance = distance/vit
set st.vit = vit
set st.i = 0
//La structure est ensuite stockée pour pouvoir transiter jusqu'aux actions du timer.
call StoreInteger(udg_Spell,I2S(H2I(t)),"timer",st)
call TimerStart (t, 0.02, true, function Recul_Action )
endfunction
Un code doit être compréhensible pour n'importe qui. Imagine un noob voudrait apprendre le vJass et prend comme exemple ta fonction.
C'est aussi utile pour toi-même. Tu viens de coder la fonction c'est normal que tu saches comment elle fonctionne, ce ne sera peut être pas le cas dans plusieurs mois si tu en as besoin. _________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2, 3Suivante
Page 1 sur 3
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