Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags
0
Members

Manipuler les acteurs liés à un textrenderer

A topic by Uranne created Jan 14, 2016 Views: 584 Replies: 8
Viewing posts 1 to 2

Hello hello

Je suis en train de faire un petit jeu pour me roder au système et je pêche sur l'affichage du scoreboard.

Pour moi, en terme de code, le scoreboard est un actor attaché à un textrenderer. Je n'arrive pas à l'afficher malgré l'implémentation dans la Scene, et je n'arrive pas à modifier le texte. J'imagine sur le moyen le plus conventionnel et de créer un Behavior ScoreBoard à attacher à l'actor, mais dans ce cas je n'arrive pas à lancer la fonction que je met dans le behavior ^^


Merci d'avance pour votre aide.

Moderator

Salut!

Pour modifier le texte en code, voilà comment tu peux faire:

let monActeur = Sup.getActor("Scoreboard");
monActeur.textRenderer.setText(maVariableDeScore);

Si tu veux le faire depuis une Behavior attaché à ton acteur, ça serait comme ça:

this.actor.textRenderer.setText(maVariableDeScore);

En espérant que ça t'aide!

Merci de t'intéresser à mon cas déjà :)

Du coup, j'avais déjà essayé de faire les deux méthodes que tu me proposes, fort de l'intellisens de l'EDI.

Dans le premier cas, le débug m'annonce ne pas connaitre l'actor instancié (alors qu'il est présent dans la "Scene" le même nom, au caractère près.

Dans le deuxième cas : je n'ai pas pu testé. Je ne sais pas comment accéder a la fonction présente dans la behavior par un événement distant. Je précise mon cas : le score change quand il y a collision entre deux de mes actors. L'un des deux, le receveur en quelque sorte, renvoie l'instruction "changer le score" quand il est "touché". Je ne sais pas comment envoyer cet ordre. Ou alors il faut d'amblé que je me lance dans la mise en place d'évènements et que je mette un listener à disposition de mon scoreboard ?

Moderator

Mais c'est normal de s'y intéresser ;)

Alors pour le premier cas, tu peux poster le bout de code histoire de voir un peu mieux ? Une idée à priori c'est que ton code se fait exécuter avant la création de ton acteur ? Autre chose peut être, dans Sup.getActor(...), tu dois passer le nom de l'acteur et c'est pas possible de donner un "chemin" du style Sup.getActor("Camera/Hud/Scoreboard"). Si c'est ta situation, ce qu'il est possible de faire c'est plutot Sup.getActor("Camera").getChild("Hud/Scoreboard"). Le getChild permet de récupèrer un enfant de ton acteur et cette fonction supporte un chemin.

Pour le deuxième cas, tu peux accéder à un behavior (et donc à ses attributs) sur un acteur comme ceci:

Sup.getActor("Scoreboard").getBehavior(ScoreboardBehavior).setScore(variableDeScore);

// En imaginant avoir la fonction setScore définit sur ton Behavior
class ScoreboardBehavior extends Sup.Behavior {
awake() { } update() { } setScore(score: number) { this.actor.textRenderer.setText(score); } } Sup.registerBehavior(ScoreboardBehavior);

En fait le Actor est dans une Scene, il n'est jamais déclaré autrement que dans cette scene. Hors la scène, je dois la load uniquement à la fin. Je dois déclarer mon actor ailleurs ?


Un bout de code :

//en haut de mon code, déclaration des variables :
let Score = Sup.getActor("Score");

//Behavior de l'élément qui déclenche le changement :
class BalleBehavior extends Sup.Behavior {
update(){
if (this.actor.getX() > 3.5){
//...
Player2Score ++;

TexteScore = Player1Score.toString + " : " + Player2Score.toString;

Sup.getActor("ScenePong/Score").getBehavior(ScoreBehavior).modifierScore(TexteScore); //testé aussi: //Score.textRenderer.setText(Player1Score.toString + " : " + Player2Score.toString);

} }

Moderator(+1)

Donc plusieurs choses.

Déjà comme j'ai essayé d'expliquer de facon sans doute peu claire, tu ne peux pas faire Sup.getActor("ScenePong/Score"). Tu dois sois faire Sup.getActor("Score") avec le risque d'avoir un conflit si il y a plusieurs acteurs avec ce nom. Soi tu peux faire Sup.getActor("ScenePong").getChild("Score")

Ensuite, ta première ligne let Score = Sup.getActor("Score") ne peut pas fonctionner si ce code est appelé avant le chargement de la scène. Tu pourrais faire let Score: Sup.Actor; juste pour déclarer la variable. Et après le chargement de la scène, via un awake d'un behavior par exemple, tu pourrais faire Score = Sup.getActor("Score");

J'ai mal recopié mon texte, le "scenepong" était en trop par rapport à un test désespéré de ma part. :)

Je ne comprends pas trop, j'ai tenté le

Sup.getActor("ScenePong").getChild("Score")

Sans succès (au passage je ne savais pas que les scenes étaient des acteurs également), il ne trouvait pas l'actor (null).

Puis j'ai effacé pour avoir :

Sup.getActor("Score")

Et ça a marché. C'est bizarre parce que c'est mot pour mot ce que j'avais d'écrit avant de modifier.

En tout cas merci bien, tu m'as bien aidé.

Je garde le principe de l'awake de côté :)

Moderator

Alors c'est sans doute pas trop clair. Une scène n'est pas un acteur. Si "ScenePong" c'est le nom de ta scène alors mon code était complètement faux...

(+1)

J'aurais eu le mérite d'essayer des trucs !