Questions en vrac

Bonjour à tous !

Voici une série de petites questions pour lesquelles, j’espère, vous pourrez m’aider :slight_smile:
D’avance merci !

1/ Objet global :

Lorsque l’on transforme un “objet local” en “objet global”, ses variables (et variables d’instances) deviennent elles globales ?
(d’après les test que j’ai fait, la réponse est non, mais j’aimerais une confirmation)

Est il possible d’avoir des variables d’objets globales ?

2/ Événements externes :

Au sujet de la première ligne “éditer comme si les événements étaient inclus à la scène :”.
(A noter que la page wiki des événements externes ne fonctionne plus). La question est donc la suivante :

Si dans ce champ, je choisi une scène, quel sera le comportement réel de lecture du programme ?

  • la scène sera lue, puis lorsque qu’il y a le lien vers l’élément externe, la lecture de l’événement externe démarre, mais la lecture du programme scène est mise en pause pendant ce temps là ?
    ou
  • la scène sera lue, puis lorsque qu’il y a le lien vers l’élément externe, la lecture de l’événement externe démarre, mais la lecture du programme scène continue pendant ce temps là ?

Qu’en est il si à la question “éditer comme si les événements étaient inclus à la scène”, je choisi “aucune scène” : quel sera le comportement réel de lecture du programme ?

3/ Compte à rebours

J’ai créé un compte à rebours basé sur l’horloge de l’ordinateur grâce à la fonction Time(). A chaque que ce compte à rebours arrive à zéro, je désire que tout les objets présents dans le magasin se renouvellent. Cependant, ce compte à rebours doit tourner en permanence (et non pas seulement lorsque la scène ou évén ext est actif). Il faudrait, en quelques sortes, que le compte à rebours tourne “en tâche de fond”.
La seule solution que j’entrevois actuellement, est de le mettre sur une page “événement externe”, et de faire un lien vers cet “événement externe” depuis toutes les autres scènes du jeu. Je trouve que ça fait un peu bricolage comme solution et ai peur que ce soit générateur de bugs.
Y aurait il une meilleure solution ?

Par ailleurs, si l’horloge de l’ordinateur est modifiée, le compte à rebours s’en trouve également modifié : y a t’il un moyen d’éviter ceci ?

4/ Structure parent/enfants/sous-enfants

Une structure parent/enfants/sous-enfants est utilisée pour définir toutes les caractéristiques de chaque objet (pouvant être équipés au héro) suivant le principe suivant : Caracteristiques[“Item”+ToString(Variable(compteur-item))].materiau (par exemple)

Est il possible d’avoir une “structure parent/enfants/sous-enfants” globale ?

Voili Voilou !
Merci beaucoup de votre aide ! :slight_smile: :slight_smile:

A bientôt !

Ludo

Non, parce que les variables d’objets sont des variables qui existent pour chaque instance de l’objet (comprend par là « objet placé sur la scène »). Avoir un objet global permet juste de pouvoir l’utiliser sur plusieurs scène, placer des instances de ce dernier sur plusieurs scène sans copier-coller ce dernier.

Ce champ ne sert « à rien ». Il permet juste de faire « comme si », permettant à GDevelop de te proposer la liste des objets, des variables, … de la scène sélectionnée pour faciliter l’édition de la feuille d’événements externes. Pour vraiment utiliser les événements externes, il faut ajouter dans la ou les scènes souhaités un lien vers cet événement externe (événement de type « lien »).

Tu as fait un bon choix en faisant cela dans un événement externe, cela te permet de réutiliser le/les événements dans toutes les scènes. Néanmoins, sache que les variables se comportent comme si elles étaient dans la scène (donc, les variables de scène utilisées dans un événement externe sont les mêmes que celles de la scène qui exécute l’événement externe : les variables d’un événement externe ne sont pas partagées entre tous les endroits où est utilisé l’événement externe).

Par conséquent, il faut stocker le compte à rebours dans une variable globale. Ensuite, je te conseille, pour faire le comptage du temps, d’incrémenter tout le temps (événement sans condition), ta variable globale de compte à rebours par TimeDelta().

Cette expression retourne le temps passé depuis la dernière frame du jeu. En le faisant à chaque frame ( = tout le temps
), tu auras bien le temps accumulé indépendamment de l’horloge du PC.

Tout à fait.

Bonjour Victor,

Merci pour toutes tes réponses :slight_smile: et désolé de ne pas être revenu vers toi plus tôt ^^ l’été était là, peu de temps à consacrer a la programmation :slight_smile:

J’ai néanmoins encore 2 questions par rapport à tes réponses :

1/ Pour le chrono, si j’utilise TimeDelta(), le chrono va t’il continuer à tourner même lorsque le jeu est fermé ? je ne pense pas… Dans quel cas quelles solution avons nous ? Est ce possible d’aller cherche le temps sur une horloge sur internet ? :confused:
ou peut être faut il faire un mixe entre TimeDelta() et Time(), dans quel cas as tu quelques pistes de réflexion ?

2/ "Est il possible d’avoir une “structure parent/enfants/sous-enfants” globale ? tu me réponds : “Tout à fait” :slight_smile: Super ! mais comment faire ? :slight_smile: je vais avoir beaucoup beaucoup beaucoup de variables parents/enfants, c’est un point crucial pour moi ^^

Merci de ton aide. :unamused:

En utilisant des variables globales (clic droit sur le projet).

Pas d’autres solutions ? :frowning:

Si tu souhaites une “structure parent/enfants/sous-enfants globale”, tu n’as pas vraiment le choix : tu peux utiliser des variables structures à n’importe quel “niveau” : variable d’objet, variable de scène ou variable globale ; seules les variables globales te permettront de stocker tes valeurs d’une scène à l’autre.

Éventuellement une solution possible, mais qui à mon sens complique, serait de stocker ta structure dans un fichier xml externe, mais ça ferait bcp de boulot et même dans l’absolu je ne pas que ce soit top, mieux faut garder tes valeurs en RAM avec les variables.

ok, merci Kink !

Je reviens sur le point du chrono : est il possible d’aller chercher l’heure sur internet afin que la modification de l’horloge de l’ordinateur n’influe pas sur le compte à rebour ?

Merci de votre aide !

A++

Ludo

C’est sans doute possible sur la plateforme HTML5 avec un peu d’huile de coude (et en éditant les sources du jeu compilé), ou peut-être grace à un petit script de rien du tout. En natif, je ne crois pas…

Il faudrait que je relise tout le topic pour me souvenir du contexte, mais c’est quoi ton souci de chronomètre ?? tu veux que le temps continue de s’écouler dans le jeu meme lorsqu’il est éteint ? A la façon de tous ces jeux mobiles où tu débloques des trucs toutes les X heures ?

Salut Kink,

Merci de ton retour. Mon est en “natif”.

Pour plus de clarté, voilà comment se présente mon inventaire actuellement (soyez indulgents, il n’est pas fini ! :smiley: )

Là ou il y a la flèche rouge, c’est le compte à rebours. Le but de ce compte à rebours, lorsqu’il arrive à zéro, est de renouveler automatiquement les objets du “Shop”.
C’est entre autres un moyen incitatif de faire revenir régulièrement le joueur, tout en étant généreux au niveau du nombre d’objets proposés dans le “shop”.

Ce compte à rebours décroit de 10min00sec à 00min00sec, en se basant sur l’horloge de Windows. C’est à dire que même lorsque le jeux est fermé ou l’ordinateur éteint , le compte à rebours continu de tourner : ceci est très bien, c’est exactement l’effet que je recherchais.

Cependant, une conséquence négative est que, si le joueur modifie l’heure de Windows, il pourra renouveler le “shop”. Et il peut il peut faire cette manip autant qu’il le désire… ce qui n’est évidement pas super au niveau du fairplay.

C’est pourquoi ma question était la suivante : y a t’il moyen de chopper l’heure sur internet afin de pouvoir remédier à cet inconvénient ?

Voili Voilou, merci de pour l’aide ! :slight_smile:

Et vive GDevelopp !

Hello,

Éviter que l’utilisateur ne modifie l’heure du système est possible, j’ai déjà réussi a le faire et je vais t’expliquer comment. Cependant note que cela ne fonctionne que quand le jeu est ouvert : une fois fermé, toutes les barrières tombent.

Note que théoriquement, et je reste bien théorique, il y a un autre moyen de faire qui permettrait d’éviter que le joueur ne triche qui peut fonctionner même une fois le jeu fermé : il faudrait, avec du code externe, aller consulter les journaux Windows pour vérifier si la gestion de l’heure est passée de automatique a manuelle récemment. Si tu as de nombreuses heures a perdre, je te souhaite bon courage. :smiley:

Pour en revenir a ma solution, elle consiste en un comparatif avec une horloge gérée en interne par le programme, et synchronisée à Windows au démarrage du jeu. En gros, tu as deux variables :

winhorloge = Time(hour)*3600 + Time(min)*60 + Time(sec)
refhorloge dont la valeur dépend de l’heure actuelle. Je m’explique.

winhorloge est actualisée tout le temps, sans conditions. Au lancement du jeu, tu fais refhorloge = winhorloge. Puis, sans conditions (=tout le temps), tu ajoute TimeDelta() à refhorloge.

Ensuite, tu compare les deux. Avec un petit intervalle du aux bugs ou ralentissements éventuels, ça se fait assez facilement :

SI winhorloge > refhorloge+2 ou winhorloge < refhorloge-2, ALORS “Vous avez triché”
Personnellement, j’ai ajouté un petit évènement derrière tout ça qui resynchronise régulièrement les deux horloges si rien de spécial n’est arrivé.

J’espère t’avoir aidé, n’hésite pas is tu as des questions :slight_smile:

Excellente idée ! :slight_smile:
merci !
je vais essayer de mettre ça en place et te tiendrais au courant :slight_smile:

ok, ca fonctionne :slight_smile: