Forums Développement Multimédia

Aller au contenu

deplacement sprite en group

Director

10 réponses à ce sujet

#1 Willy

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 144 messages

Posté 07 February 2014 - 10:40 AM

Bonjour à tous
Les messages sont de moins en moins frequents néanmoins je tente ma chance.

Le comportement suivant permet un déplacement groupé des sprites qui le contiennent quand elle sont sélectionnées.


-- Mon comportement GROUPING
property spriteNum
property pGroupName, pMouseLoc
on mouseDown me
  set pMouseLoc = point(the mouseH, the mouseV)
  add the actorList, me
end
on mouseUp me
  deleteOne the actorList, me
end
on mouseUpOutside me
  deleteOne the actorList, me
end
on stepFrame me
  if member("GroupEntree").text = "1" then
    pGroupName = "1"
    set lNewLoc = point(the mouseH, the mouseV)
    set lOffset = lNewLoc - pMouseLoc
    set pMouseLoc = lNewLoc
    sendAllSprites(#moveMyself_SGM, pGroupName, lOffset)
  else
    pGroupName = void
  end if
end
on moveMyself_SGM objRef, lPassedGroup, lOffset
  if lPassedGroup = pGroupName then
    set the loc of sprite spriteNum = (the loc of sprite spriteNum) + lOffset
  end if
end
 

mon souci est que je ne peux pas poser ce comportement sur des sprites car celles-ci sont crées dynamiquements.

Dès lors j'ai un peu cherché dans l'aide un moyen de contourner cela.
J'ai trouvé ceci qui permet d'affecter à un sprite un comportement et qui donc me conviendrait parfaitement :


  premier = the currentSpriteNum
  x = script("Grouping").new()
  sprite(premier).scriptInstanceList.add(x)
 

Hélas après avoir fait diverses manip à partir de ce script, ça ne fonctionne pas.

Si quelqu'un avait une idée pour m'aider à faire fonctionner tout ça.
Merci de votre aide

#2 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 07 February 2014 - 14:01 PM

Ci-joint un exemple. Par contre, la syntaxe que tu utilises est une vieille syntaxe (director 7 et moins). Elle est compatible avec les dernières versions. Mon exemple nécessite au moins director mx2004

Fichier(s) joint(s)



#3 Willy

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 144 messages

Posté 07 February 2014 - 14:12 PM

Salut Bubarnet
Ravi de te retrouver ici , ça me rappelle une bonne dizaine d'années en arrière ou déjà tu me dépatouillait pas mal :)

Hélas je ne peux pas l'ouvrir je suis toujours sous director 8 !!!

En fait mon erreur se situe au niveau de compréhension du numéro de sprite par le comportement.

Si le comportement est placé sur une sprite, ok ça fonctionne. Mais l'appeler avec x = script ("Grouping").new() je pense que du coup il ne sait pas quelle sprite traiter.

En test, J'ai essayer également une vieille manip avec scriptnum. Je place un comprtement pratiquement vide sur le sprite puis je le remplace avec scriptnum par le bon compotement ça ne marche pas non plus.
L'inverse par contre fonctionne.

merci beaucoup en tout cas

#4 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 07 February 2014 - 15:03 PM

c'est ce que je pensais pour le numéro de version.

Voici le code que j'utilise, mais que tu devras l'adapter à dir 8

Pour la création de sprite, j'utilise ça

--pour le sprite numéro i :
    _movie.puppetsprite(i,TRUE)
    sprite(i).member=member("test1")
    sprite(i).loc=point(random(500),random(500))
    sprite(i).scriptinstancelist.add(script("group_move").new(i,"group1"))
 

La dernière ligne est la plus importante. Je place sur le sprite un script "group_move" qui attend le numéro du sprite, et un nom de groupe.

Le script "group_move" :
Attention, ce script doit être de type "parent"


property pspr
property pGroupName, pMouseLoc

on new me,spr,groupName
  pspr=spr --stocke le numéro de sprite
  pGroupName=groupName
 
  return me
end

on mouseDown me
  pMouseLoc = point(the mouseH, the mouseV)
  add the actorList, me
end

on mouseUp me
  deleteOne the actorList, me
end

on mouseUpOutside me
  deleteOne the actorList, me
end

on stepFrame me
  lNewLoc = point(the mouseH, the mouseV)
  lOffset = lNewLoc - pMouseLoc
  pMouseLoc = lNewLoc
  sendAllSprites(#moveMyself_SGM, pGroupName, lOffset)
end

on moveMyself_SGM me, lPassedGroup, lOffset
  if lPassedGroup = pGroupName then
    sprite(pspr).loc=sprite(pspr).loc + lOffset
  end if
end
 


#5 Willy

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 144 messages

Posté 07 February 2014 - 16:04 PM

Merci Bubarnet
c'est niquel j'ai un peu remanié mais pas tant que cela finalement.


J'ai une condition pour le deplacement par groupe à savoir un champ qui contient la valeur 0 ou 1.
A 0 donc le deplacement par groupe n'est plus possible.
J'utilise pour cela

if member("GroupEntree").text = "0" then
        the actorList = []
  end if
 

J'ai fait quelques essais et le seul endroit pour que cela fonctionne correctement c'est de placer ce code dans un exitFrame.
J'ai peur que cela surcharge un peu.
Existe t'il un autre moyen sans l'utiliser dans un exitFrame ??

d'autre part lorsque je passe le champ à 1 je retrouve mon groupe de sprite. alors que je pensais que le groupe était détruit avec actorlist = [] ??
Du coup comment supprimer un groupe ?
Merci

#6 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 07 February 2014 - 20:08 PM

Pas de soucis avec ce genre de code dans exitframe, je fais largement pire :)

Quand tu fais
the actorlist=[], tu ne fais que vider la liste, tu ne détruis pas les objets créés. Pour cela il faut d'abord que tu les supprimes pour chaque sprite

if sprite(pspr).scriptinstancelist.count then
  --destruction simplifiée, je considère qu'il n'y a qu'un seul script inscrit
  sprite(pspr).scriptinstancelist.deleteat(1)
end if

MAIS

cela ne détruit pas tes objets, à nouveau cela ne fait que les supprimer de la liste scriptinstancelist. Il faut donc les détruire avant.

AVANT de les supprimer de la liste (avant car on ne les stocke pas dans une variable, juste dans la liste), on va les détruire. Pour cela, il faut légèrement modifier le code de l'objet "group_move" en ajoutant la fonction

on destructor me --destructor, c'est un nom à moi, tu peux écrire le nom de ton choix
  --ici on désalloue tout ce qui doit l'
être
  --propriétés instance, désinscription dans d'autres objets, fermeture de fichiers, ...
  --ici, il faut juste supprimer l'
objet de the actorlist
  (the actorlist).deleteone(me)
end
 

Il faut ensuite modifier le code qui détruit les sprites pour que chacun détruise l'objet "group_move" qu'il contient

--dans un script d'animation
on destructionsprite
 repeat with i=1 to dernier_sprite --à adapter à ton cas
   if sprite(i).scriptinstancelist.count then
         --destruction simplifiée, je considère qu'
il n'y a qu'un seul script inscrit
         sprite(i).scriptinstancelist[1].destructor()
         sprite(i).scriptinstancelist.deleteat(1)
   end if
 end repeat
end
 

Avec ces modifications, dans le exitframe tu appelles la fonction destructionsprite(). Il vaut d'ailleurs toujours mieux que les éléments qui s'inscrivent quelque part, se désinscrivent eux-même, et toujours dans l'ordre inverse de la création.

#7 Willy

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 144 messages

Posté 07 February 2014 - 22:58 PM

Ouf c'est beaucoup plus complexe que je me l'imaginais !
En tout cas merci beaucoup ça me permet de cerner un peu mieux ce genre de script.
J'ai fait des essais ça fonctionne nickel, je vais pouvoir poursuivre

merci une nouvelle fois de ton aide et bon week end.

a bientôt, William

#8 Willy

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 144 messages

Posté 08 February 2014 - 08:42 AM

J'ai oublié concernant :

on destructionsprite
repeat with i=1 to dernier_sprite --à adapter à ton cas
   if sprite(i).scriptinstancelist.count then
                 --destruction simplifiée, je considère qu'il n'y a qu'un seul script inscrit
                 sprite(i).scriptinstancelist[1].destructor()
                 sprite(i).scriptinstancelist.deleteat(1)
   end if
end repeat
end

Justement si mon anim contient d'autres scripts parents, comment différencier le bon actorlist à détruire ?
Je sais pas si je suis bien clair la,

#9 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 08 February 2014 - 14:21 PM

J'ai fait un raccourci en écrivant le script, ce qu'il ne faut normalement pas faire Image IPB

Il faut repenser un peu le programme, en ajoutant un script intermédiaire.
Pour schématiser, voilà ce qu'il faudrait faire
script général qui crèe les sprites -> crèe un objet "gestion_sprite" qui s'occupe d'un sprite -> crèe un objet "group_move" qui gère le déplacement

script général

--ici, on crèe les objets qui gèrent les sprites. Ces objets sont à stocker dans une variable (global ou property selon l''endroit où sont créés ces objets)
--je suppose qu''on est dans un script d''animation, donc variable global
global glogestionsprite
...
on fonctionquicreelessprites
  glogestionsprite=[]
  repeat with i=1 to 10 --à adapter
        glogestionsprite.add(script("gestion_sprite").new(i,"nom_du_groupe"))
  end repeat
end

on fonctionquidetruitlessprites
  repeat with o in glogestionsprite
        o.destructor()
        o=VOID
  end repeat
  glogestionsprite=VOID
end
 

script qui gère les sprites (script de type parent)

property pspr
property pnomgroupe
property pogroupmove --l''instance de l''objet "group_move"

on new me,numspr,nomgroupe
  pspr=numspr
  pnomgroupe=nomgroupe
  _movie.puppetsprite(pspr;TRUE)
  sprite(pspr).member=member("test1") --à changer avec le bon nom de membre
  sprite(pspr).loc=point(random(500),random(500)
  pogroupmove=script("group_move").new(pspr,pnomgroupe) --ici, on stocke l''instance dans une variable, plutôt que directement dans scriptinstancelist
  sprite(pspr).scriptinstancelist.add(pogroupmove)

  return me
end

on destructor me
  sprite(pspr).scriptinstancelist.deleteone(pogroupmove) --la fonction deleteone ne renvoit pas d''erreur si pogroupmove n''est pas défini ou si il n''est pas dans scriptinstancelist. Donc pas besoin de faire de test
  if ilk(pogroupmove)=#instance then
        pogroupmove.destructor()
        pogroupmove=VOID
  end if
  --mettre ici les autres éléments à détruire. Par ex :
  _movie.puppetsprite(pspr,FALSE)
end
 

L'objet group_move ne change pas.

Ainsi pour créer les sprites, il suffit d'appeler la fonction fonctionquicreelessprites(), qui crèe en cascade les sprites qui chacun, crèe une instance de l'obet group_move

Pour les détruire, il suffit d'appeler fonctionquidetruitlessprites()

Il s'agit de programmation objet de base, il faut arriver à décomposer ton programme pour arriver à quelque chose de ce genre. Ainsi le script de base qui crèe les sprites (fonction fonctionquicreelessprites()), n'a pas besoin de savoir comment ceux-ci sont gérés, ce n'est pas son problème. Il ne fait que créer les objets, à ceux-ci de faire leur boulot (puppetsprite, positionnement, création de l'objet "group_move").
De la même manière, ceux-ci ne s'intéressent pas à comment est gérer le déplacement, ils ne font que créer un objet pour cela (pogroupmove=script("group_move").new(pspr,pnomgroupe)) qui se débrouille tout seul pour faire son boulot

#10 Willy

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 144 messages

Posté 08 February 2014 - 17:58 PM

Merci beaucoup j'apprend énormément.
Juste un truc :
_movie.puppetsprite(pspr,FALSE)
dir 8 ne gère pas _movie ! je ne sais pas à quoi ça correspond et comment le remplacer
je vais creuser l'aide
merci

#11 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 09 February 2014 - 01:15 AM

set the puppetsprite of sprite i sans doute

Mais director 8 gère la notation pointée si je ne me trompe ? Dans ce cas, sprite(i).puppetsprite=TRUE

Je vois que director mx2004 utilise sprite(i).puppet=TRUE



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP