Home Tutorials Download Beta Store Forum Documentation KnowledgeBase Wiki Blog

ShiVa3D

Return to Game programming

simple déplacement

All about the StoneScript

Re:simple déplacement

Postby kilik » 01 Nov 2007, 00:14

if ( kKeyCode == input.kKeyDown) and (tx > 10) then
j'ai essayé de limité en rajoutant une condition sur l'axe x mais comme je suis pas dans l'ia de l'object
donc j'arrive pas défénir en variable la position de l'object!


quand je fait un while true do
while true do
if ( kKeyCode == input.kKeyDown) then
...
end
ca fait boum !

sinon j'essaie d'utiliser hObject = scene.createRuntimeObject ( hScene, sModel )
sans succès(;-
il faut que hObject sois une variable? faire un local ?

dites moi quand je brule je pense pas être loin :)
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby philip » 01 Nov 2007, 09:10

Bonjour Kilik,

le Ston3D engine est un moteur a base d'AIModel, ca tu le sais, et les AIModels sont des FSM.
C'est a dire des machines à états finis.
C'est à dire qu'a chaque frame, chaque fois qu'on affiche une image, on appel les AIModels pour leur faire faire ce qu'elles ont a faire.
On affiche donc l'image après le traitement de l'intelligence, qui est sensé faire du traitement et du décisionnel.

Donc si durant ce traitement, qui est sensé être rapide, tu fais un 'while true do', c'est que tu va arrêter l'AIModel en l'empêchant de finir son traitement, et donc tu vas 'freezer' le moteur.

En gros le 'while true do' de l'affichage, c'est nous qui le faisons, et on te donne la possibilité de faire des choses via les AIModels.

Je sais pas si je suis assez clair, car les FSM demande un minimum d'expérience informatique pour capter leur logique.
Mais en gros, ne fait plus de 'while true do', ça casse tout.

sinon translateTo, déplace un objet de la ou il est vers x,y,z, dans le repère global, avec un facteur X, c'est à dire que tu multiplie le vecteur déplacement par le facteur et tu obtient ta translation finale.
alors que setTranslation, position l'objet en x,y,z dans le repère global.

Quand tu utilises des variables d'IA, utilise this.maVariable (), car le StoneScript est un langage pseudo objet. en l'occurrence tu as du avoir une erreur de compilation...

le createRuntimeObject nécessite une scène et un nom de modèle en paramétre.
la scène est quasiment toujours la scène courante que tu peux obtenir via: application.getCurrentUserScene( )
le nom du modèle est donc une chaine de caractère (car c'est un nom), elle représente le nom du model que tu souhaites créer, ce modele, pour pouvoir être créer, doit avoir été référencé dans l'onglet Models, du Game Editor.
Et son nom est le nom qu'il porte dans cet onglet (c'est son nom de model, sans le suffixe)
Pour pouvoir utiliser cet objet créé ailleurs, je te conseil de le stocker dans une variable de type object, ainsi tu pourras le récupérer quand tu en auras besoin. (genre this.monObject ( hObject ) pour le setter et this.monObject() pour le getter )

Pour gérer les collisions, je te conseil de faire et refaire le tutoriel sur les colliders.

En espérant avoir pu t'aider un peu :-)
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:simple déplacement

Postby kilik » 01 Nov 2007, 21:41

ok Merci philip bien sur que ca m'aide bcp y voir plus clair !

alors pour avancez dans mon déplacement de personnage !
qui est toujours bloqué au stade du tutorial ;-(

j'ai essayé de rajouté dans le handler onbas

if (this.tz() < this.tz (5)) then

else
this.tz( this.tz()+1)
end

et la booum quand j'appuie sur bas il a la vitesse de l'eclair en tz5

bien sur je comprend pas pourquoi mais j'ai quand même réussit ce que je voulait faire cad limité le déplacement
ce qui est un grand pas pour mon cube lol !!

j'ai aussi testé avec un elseif if (this.tz() > this.tz (5)) then ce qui change rien!<br><br>Message édité par : kilik, à : 01-11-2007 à 22:42
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby philip » 02 Nov 2007, 16:44

En fait Kilik,

en écrivant:
if (this.tz() < this.tz (5)) then

tu commet une erreur basique du à notre format de gestion des variables d'AIModel
en gros
this.tz() renvois la valeur de tz
donc tu peux faire a = this.tz() ou encore if (this.tz() < 5 ) then

maintenant si tu écris:
this.tz(5) cela met la valeur 5 dans la variable tz et ne renvois rien
donc quand tu écris:
if (this.tz() < this.tz (5)) then

tu commet 2 erreurs:
tu compares tz a rien et tu assigne 5 à tz

attention donc a bien prendre le coup de manipulation des variables d'AIModel.

Phil.
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:simple déplacement

Postby kilik » 02 Nov 2007, 22:02

en fait j'avais copier des tutorials de programation lua pour psp !
il semblerait que le lua de shiva marche pas pareil autant pour moi !

c'est manifique ca marche ! B)

j'ai testé le tutorial collision quand je rédémare il me dis une eureur mais quand je lance ca marche lol!

}---------------------------------------------------------------
}AI Runtime error : Bad argument count
}---------------------------------------------------------------
}AI Stack Traceback :
} [Internal] : Function 'getBounce'
} [Line 18] : Function 'setupDynamics'
} local 1 o
} [Line 10] : Function
}---------------------------------------------------------------

j'ai vérifier plusieur fois il me semble avoir bien copier l'exemple :sick:

ok un encore un truc ou j'ai du mal a faire la différence entre un this.chose et un local = et un local this!
mdr! :silly: :blink:

par contre comme j'ai plus le droit de torturé shiva avec des whiles
j'ai pas d'idée pour faire un déplacement continue ;(-
faut me donner un indice!:):woohoo:

Message édité par : kilik, à : 02-11-2007 à 23:03

Message édité par : kilik, à : 03-11-2007 à 00:44<br><br>Message édité par : kilik, à : 03-11-2007 à 00:53
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby philip » 03 Nov 2007, 01:21

Salut Kilik,

alors voici voila quelque explication:
le langage s'appelle le StoneScript.
il est effectivement basé sur du lua, mais il inclut beaucoup de concepts et fonctionnalités supplémentaires, qui en font un langage différent.

D'ailleurs c'est la même chose pour la quasi majeure partie de tous les moteurs utilisant le lua.

par conséquent tu n'apprendras rien d'autre programme basé sur du lua, d'autant que les seules capacités que nous utilisons sont:
- if () then else end || conditionnalité
- while do end, for i do end || boucle
- les appels aux API StoneScript

alors non pas que je te déconseille de chercher a comprendre les autres appli en lua (au contraire même! l'apprentissage et l'expérience, y a que ca de vrai) mais chercher a t'en inspirer serai te retarder dans la compréhension en profondeur des concepts de production de ShiVa. Utilise plutot les exemples, les framework et les tutoriels.

Continuons, quand tu utilises this.maVariables ( ), tu utilises des variables d'AIModel, dont tu as certainement besoin.
quand tu utilises local maVariable, tu crées une variable local au script dans lequel tu codes.
par conséquent, quand le script se termine, la variable disparait.
une variable local, par exemple, c'est la variable qui va stocker temporairement les résultats des calculs du script, etc. pas besoin de variable d'AIM pour ça...

Enfin, l'idée ce n'est pas que tu n'a pas le 'droit' d'utiliser des 'while' (sinon il n'existerait pas) mais il s'agit plutôt de comprendre comment se passe les choses et donc comment interagir avec.

Comment faire un déplacement interpolé sympa:
dans le onLoop de ton State courant, tu fais déplacer ton objet de sa position courante PLUS un facteur de déplacement (qu'on pourrait appeler vitesse :D ) qui serai (je te le conseil vivement) dépendant du framerate (temps de rendu de la frame précédente) qui s'obtient par un :
application.getLastFrameTime ( ) - ou un truc du genre

si tu veux du code pour le faire, suffit de regarder le début de ce post pour en trouver.

J'espère toujours avoir été assez clair :-)
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:simple déplacement

Postby kilik » 03 Nov 2007, 14:25

pour l'instant dans le onloop j'en suis la

object.translateTo( this.getObject( ), this.tx(), this.ty(), this.tz(), object.kGlobalSpace, application.getLastFrameTime ( ) )
sois j'ai juste viré le *5

ou

local frame = application.getLastFrameTime ( )
object.translateTo( this.getObject( ), this.tx(), this.ty(), this.tz(), object.kGlobalSpace, frame )

ce qui change rien ! du coup j'ai un déplacement mou du genou qui se fini qq sec apres que j'ai lacher le bouton

dans le fpsdémo ce que j'ai compris du déplacement
y'a des variables pour boolen pour comparé si la touche est enfoncé ou laché
a chaque fois qu'on appuie sur une touche bCaptureInput resest sur false
donc si on change de touche la derniere touche est pris en conte



dans l'enter frame on lance la fonction updatevision et l'updatedynamic
-- Position
--
local x, y, z = object.getTranslation ( d, object.kGlobalSpace )

object.translateTo ( o, x, y + 0.75, z, object.kGlobalSpace, 10 * dt )
-- la je supose que c'est pas pour faire beau(?)

donc si j'ai compris le déplacement ce fait dans la dynamic par vector en condition this.bMoveForward ( )

je supose aussi qui a pas besoin de donner distance comme dans this.tz( this.tz()+distance)
----------------
-- fx, fy, fz = math.vectorNormalize ( fx, 0, fz )
-- fx, fy, fz = math.vectorScale ( fx, 0, fz, 5000 )
--------------------
ou c'est peu etre ca !


oula faut que je marque une pause avant d'avoir mal la tête !<br><br>Message édité par : kilik, à : 03-11-2007 à 17:54
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby kilik » 04 Nov 2007, 16:52

ok petit problème du jour !
j'ai suprimé un objet tagé j'en est rajouté un nouveau objet je voulais lui donner le même tag
il me dis que ce tag est déja utilisé alors que je les suprimé

j'ai trouvé la solution il suffit de quitter le game et de relancé:=)


en suite j'ai rajouté 3 variable rx ry rz

local x, y, z = object.getRotation ( this.getObject("tag"), object.kGlobalSpace )
this.rx(x)
this.ry(y)
this.rz(z)
dans le onenter

object.rotateTo ( this.getObject( ), this.rx(), this.ry(), this.rz(), object.kGlobalSpace, application.getLastFrameTime ( ) )
dans le onloop

}AI Runtime error : Bad argument type #3
}---------------------------------------------------------------
}AI Stack Traceback :
} [Internal] : Function 'rotateTo'
} [Line 15] : Function
} local 1 frame
}---------------------------------------------------------------

hum je cherche encore !

pour ce qui est du speed
j'ai rajouté une variable
dans le onloop
local speed = 1
object.translateTo( this.getObject( ), this.tx(), this.ty(), this.tz(), object.kGlobalSpace, frame + speed )

le problème c'est que j'ai toujours pas trouvé l'histoire du déplacement continue donc je suis toujours au même.
ca commence a me rendre fou je vais être contraint d'abandonné:(<br><br>Message édité par : kilik, à : 04-11-2007 à 19:21
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby philip » 04 Nov 2007, 19:28

Salut salut Kilik,

pour faire simple, ShiVa est quand même un outil dédié aux professionnels, ce qui explique qu'il faut une certaine expérience des outils de développement pour en intégrer facilement tous les concepts.

Cela dit, j'ai envie de lutter pour que tu intègres tout ça, alors allons y.

Un moteur 3D est une boucle 'infinie' dans laquelle on effectue certain traitement, parmi ceux la:
- gestion des traitements des scripts
- calcul et affichage de l'image résultante

donc si tu fais une boucle infinie dans un de tes scripts, forcément tu n'afficheras jamais l'image qui est sensé être calculée et affichée après le lancement des scripts.

Ca explique aussi pourquoi, jamais, dans aucun des scripts tu ne va demander la génération de l'image a l'écran, ca c'est le rôle du moteur.

Ainsi, si tu veux déplacer un objet de manière agréable a l'écran, il te faut déplacer un petit peu par un petit peu pour chaque image, afin que l'animation résultante soit agréable.
Ce qui induit que tu dois déplacer tes objets 'un peu' a chaque fois qu'une image est affiché.
et comme a chaque fois qu'une image est affiché, avant on a lancé les scripts, il te suffit de faire, dans un script, ton décalage (je t'avoue qu'après ça je sais plus comment l'expliquer...)

Pour faire un déplacement 'temps réel', c'est à dire lié au temps qui passe - et qui devient donc indépendant de ton fps - je te conseil d'utiliser l'information de temps de calcul de la trame précédente (application.getLastFrameTime() ).
comme ça, le déplacement sera identique sur une pauvre bécane a 5fps, comme sur une grosse bécane a 120fps...

les scripts qui sont lancés à chaque trame sont les onLoop des States courant et les onEnterFrame.
c'est donc dans ces scripts la que tu vas faire 'bouger' tes objets, c'est à dire que c'est dans ces scripts que tu vas faire des 'setTranslation' ou des 'translateTo' de tes objets.
A toi donc de déterminer de combien est le décalage, car de cela dépends la vitesse.

Si tu arrives pas faire bouger ton objet comme ca... ben la je peux plus rien...
Faut savoir aussi que c'est la méthode que flash et shockwave... donc bon a un moment aussi faut que tu essayes d'intégrer des concepts qui n'ont rien de 'magique' :-)

Sinon, il y a une autre 'technique', c'est d'utiliser le moteur de physique et le laisser se charger du déplacement des objets:

alors c'est simple, bon d'abord fo créer un controleur de dynamike via dynamics.createBallBody par exemple.
de là ben fo pas le mettre en collider déjà pour commencer l'objet
collider == static
ensuite fo pas utiliser des translate mais des dynamics.addForce !
pour des forces de déplacement sur plusieurs trames (haut/bas/gauche/droite) et dynamics.addImpulse pour des truc sur une trame (saut typikement ou explosion)
voila koi

discussion reprise de multiple posts ici présent.

Je rajouterai juste qu'il s'agit de comprendre les concepts, la vision. c'est donc une réflection conceptuelle que tu dois avoir et pas chercher a obtenir un code à copier coller que tu continueras à ne pas comprendre. Car ShiVa n'est pas un FPS maker ou un RTS maker ou n'importe quel autre outil pour faire des jeux à style unique (et donc très simple à faire), il s'agit la d'un outil complexe parce que ouvert et sans limite. il ne s'agit plus de 'mods' ou de customisations mais bien de faire un jeu depuis l'origine.

Je suis convaincu qu'une fois que tu auras intégré les quelques principes de bases tu te sentiras vraiment libre et efficace, alors ta créativité sera profondément boostée.

J'espère que toutes ces précisions t'aiderons à voir plus clair ;-)

Phil.
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:simple déplacement

Postby kilik » 05 Nov 2007, 01:53

Bonsoir philip ! Merci de me répondre un dimanche soir j'en demande pas autant ! allez op +1 au karma !

ok j'avoue je suis pas un pro mais j'espère bien le devenir !

j'avais aussi compris que faire des copier coller m'aiderais pas comprendre le stonescipt
la preuve je suis toujours bugé sur le hud!

c'est dans cette optique je post mon avancé pour mieux comprendre mes eureurs:)
en même temps j'espère aidez les prochains shivamateur
et surtout je donne vie au forum (c'est pas rien de donner la vie)

bonne nouvelle a ce propos j'ai réussit a donner l'oriantation du personnage en fonction du déplacement!

maitenant je suis en train de testé un states dans le start ai
alors j'ai crée une variable boolean (bas) false par défault
je mets true a cette variable quand j'appuie sur bas false quand keyup
et dans le onloop si bas est vraie je send l'event!
et ben ca marche! :woohoo: alors ca ! je m'attendais avoir un blue screen comme on dis chez nous!
je suis sur le cul (normal je suis assis )
comme quoi le simple fait d'espliquer ce que je fait ou essaie de faire m'aide a avancez:)

bon!bien sur le résultat est encore loin de ce que je souhaite obtenir mais on avance !!

alors pour l'instant le perso avance et continue a avancer quand je lache la touche
pourtant comme j'ai dans onKeyboardKeyUp un false si la touche et up
si mes calcul sont bon il devrais s'arretez
je supose que c'est du au fait que le boucle tourne plus vite que la frame.
Bingo c t bien ca! j'ai juste frame + 0.1 et du coup ca marche

je vais essayé de crée le déplacement des diagonals dans la foulé comme ca restera plus que les collisions!

j'avais testé ca
elseif ( this.droite() == true ) and ( this.bas() == true )then send event est il ce passé rien
donc j'ai testé en if et ca marche pourquoi je sais pas ! rock and roll comme dis le proverbe!
alors le truc c'est quand dans mon handler diagonal j'ai par exemple
this.tz( this.tz()-0.1)
this.tx( this.tx()+0.1)
donc mon déplacement en diagonal est plus rapide et qui l'est pas a 45° mais plutot a 25 hum
si on suis la logique je pense que ca vient du fait que j'appuie pas sur les 2 touche en même temps
mais l'une apres l'autre. dans le jargon je crois qu'on appelle ca du strafing
dans le même exemple j'ai rajouté rotateto pour mes diagonals et même combat!
j'ai eu une fois dans mes phases test une rotation a sur un axe a 45° donc y'a de l'espoir!:)

Merci pour les esplications sur le déplacement dynamic je verrais ca bientot pour un prochain jeu :)

je voulais aussi m'escusez pour mon francais plus que pitoyable<br><br>Message édité par : kilik, à : 05-11-2007 à 04:30
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby kilik » 05 Nov 2007, 17:17

j'ai essayé
if ( kKeyCode == input.kKeyDown )and ( kKeyCode == input.kKeyRight) then
this.basdroite (true )
end
ca donne rien ;(-
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby NiCoX » 05 Nov 2007, 17:23

Hello,

si ( mon_fruit == une_banane ) et ( mon_fruit == une_pomme )
alors
je_le_mange ( )
fin

C'est en gros ce que tu as écrit... tu vois le problème ? ;)
User avatar
NiCoX
Platinum Boarder
Platinum Boarder
 
Posts: 5652
Location: France

Re:simple déplacement

Postby philip » 05 Nov 2007, 17:41

Salut kilik,

Effectivement ton égalité ne peut en aucun cas être vrai.

Cependant je crois que le problème que tu as es un peu plus technique qu'il n'y parait.

kKeyCode est le paramètre de ton handler onKeyboardKeyDown (ou Up au choix)
il indique le code de la touche qui vient d'être appuyé.
En effet lorsqu'une touche est appuyée, cela génère un évènement système qui est envoyé aux Handler qui le capture.
Donc lorsque le script d'un onKeyboardKeyDown est lancé s'est que l'on vient de recevoir un évènement qu'une touche vient d'être appuyée.
onKeyboardKeyDown sera appelé autant de fois que des touches seront appyées.
dans ton cas, bas-droite n'est pas une touche mais 2 touches.
ce qui induit que tu aura onKeyboardKeyDown qui sera appelé 2 fois (et pas une) et a chaque fois avec le paramètre kKeyCode qui représente la touche appuyé.

Car, tu dois savoir, qu'il est impossible d'appuyer sur 2 touches simultanément, il y en a toujours une avant l'autre.

Bref tu dois d'abord capturer que tu as une des touches qui a été frappée, puis l'autre, tout simplement.

Pour cela, je te propose de créer des variables (boolean?) qui représente quelle touche a été frappée (haut, bas, gauche, droite)
et de les mettre a vrai quand elles sont down et a faut quand elles sont up.
ensuite, a tout instant dans tes scripts tu test quelles variables sont à vraies ou faux et tu en déduis ce qu'est en train de faire ton utilisateur avec ses touches.
Et biensur, si bas == true et droite == true, alors il est en bas droite... etc.

Voila :-)

Phil.
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:simple déplacement

Postby kilik » 05 Nov 2007, 18:21

yé c'est que j'ai fait hier

if ( this.droite() == true ) and ( this.bas() == true )then
object.sendEvent ( hObject, "move", "onbasdroite")

le hic c'est que dans le onbasdroite
j'ai object.rotateTo qui est pas pris en conte car j'ai pas la bonne condition dans if this.bas
donc j'ai essayé if ( this.bas() == true ) and ( this.basdroite ( ) == false) then

la du coup mon perso ce déplace plus vers le bas
pourtant basdroite est false par défault

donc pour les fruits l'idée c'est
if ( kKeyCode == input.kKeyDown +input.kKeyRight) then
this.basdroite (true )
end
devrais marcher ou pas

toujours sur mon déplacement latéral
this.tz( this.tz()-0.1)
this.tx( this.tx()-0.1)
me donne un déplacement a 25° alors que j'éspéré un déplacement a 45° j'ai réduit de moitié la
force et pourtant ca va quand même plus vite !(-;<br><br>Message édité par : kilik, à : 06-11-2007 à 05:00
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

Re:simple déplacement

Postby kilik » 07 Nov 2007, 02:13

ok j'ai crée un dummy
je voulais utiliser un object.matchTranslation avec mais ca a pas l'air de marcher
j'ai du faire une eureur je cherche je cherche je trouve rien c'est la grosse panique !
alors je me suis dis que le dummy était peu être pas considéré comme un object?

j'ai trouvé pourquoi le test collision donner une eureur j'avais inversé setBounce par getBouce:)

du coup j'ai commencé a édité mes collision pour essayé de faire qq chose...

mais je me suis retrouvé avec une eureur bizzare
[+ Alerte ] {Load/Save }Could not load script 'colli_Function_setupDynamics'
[+ Alerte ] {Load/Save }Cannot load Resource 'colli_Function_setupDynamics'

j'arrive plus a ouvrir la fonction<br><br>Message édité par : kilik, à : 07-11-2007 à 13:02
User avatar
kilik
Expert Boarder
Expert Boarder
 
Posts: 158

PreviousNext

Return to Game programming