Aide pour Game-Maker.

Démarré par HCkev, 23 Mai 2007 à 03:32

0 Membres et 1 Invité sur ce sujet

23 Mai 2007 à 03:32 Dernière édition: 21 Juin 2007 à 09:22 par Octorok
Bon, alors une autre question concernant Game Maker(en fait, deux questions :P). Je N'ai pas trouvé de solution nulle part :( (en fait, si, mais c'était des fichier GM d'ancienne version qui n'étaient pas compatible, comme GM4)

La première:
Est-il possible de mettre des arrière-plan animés ? J'ai essayé quelques bidouilles en changeant d'ime d'arrière plan à toutes les frames, avec background_replace() mais on dirait que le fonction est ignorée... :(

La deuxième: Comment faire pour que L'Arrière-plan bouge lentement lorsque l'écran bouge ? En gros, comme dans Super mario world, si mario avance de 4 pixels, par exemple, l'arrière-plan recule de 2 pixels.

J'ai bidouillé quelque chose qui fonctionne, mais qui a un petit défaut...

Voici ce que j'ai fait(code dans End step):
background_x[0] = floor(view_xview/1.5);
background_y[0] = floor(view_yview/1.5);
background_x[1] = floor(view_xview/3);
background_y[1] = floor(view_yview/3)+220;
background_x[2] = floor(view_xview/6);
background_y[2] = floor(view_yview/6)+302;



Donc j'ai 3 arrières-plans différents qui bougent à des vitesses différentes(pour créer un effet de perspective, l'arrière-plan le plus au fond doit bouger plus lentement ;)). Ça fonctionne, mais... Vous avez probablement remarqué que je me sert de la position actuelle de la vue... sauf qu'aparemment, la vue est centrée sur le personnage qu'après l'exécution de tous les codes. Alors l'arrière-plan ne bouge qu'a la prochaine frame... Ça fait un effet saccadé assez désagréable. Y a-t-il un moyen d'éviter ce problème ? :o

Voilà, merci d'avance :P

Pour un background animée, essaye plutôt avec un step et des sleep  ;)
Quand au déplacement, je te conseille de fixer le background a l'endroit au est situé l'objet a centré au chargement de la room. Le "Creation Code" s'execute avant les objets.

23 Mai 2007 à 12:46 #2 Dernière édition: 23 Mai 2007 à 12:48 par Octorok
background_x[0] = view_xview[0]/3;
Je te conseille plutot ça pour un déplacement du background. :P Ca effectue un petit déplacement quand l'écran bouge, mon exemple est valable uniquement horizontalement.
Pour créer un effet de perspective, je pense qu'il suffit d'utiliser un code du genre :

background_x[0] = view_xview[0]/4;
background_x[1] = view_xview[0]/3;
background_x[2] = view_xview[0]/2;

Ainsi les différents backgrounds se déplacent à une vitesse différente.


Pour les backgrounds animés, je croyais que c'était fait par défaut mais non. Tu peux faire comme Neo a dit, ou avec des alarmes, ce qui me parait plus facile. :)

Citation de: Octorok le 23 Mai 2007 à 12:46
background_x[0] = view_xview[0]/3;
Je te conseille plutot ça pour un déplacement du background. :P Ca effectue un petit déplacement quand l'écran bouge, mon exemple est valable uniquement horizontalement.
Pour créer un effet de perspective, je pense qu'il suffit d'utiliser un code du genre :

background_x[0] = view_xview[0]/4;
background_x[1] = view_xview[0]/3;
background_x[2] = view_xview[0]/2;

Ainsi les différents backgrounds se déplacent à une vitesse différente.
En fait, c'est exactement ça que j'ai fait, sauf que j'ai mis un floor(qui arrondi à l'entier inférieur) pour éviter de bouger le fond de .5 pixels par exemple(ce qui rend le fond flou) ;) Donc ça reste que le fond bouge une frame en retard :(

Citation
Pour les backgrounds animés, je croyais que c'était fait par défaut mais non. Tu peux faire comme Neo a dit, ou avec des alarmes, ce qui me parait plus facile. :)
En fait, je ne connais vraiment pas ce système d'alarmes... Je débute encore avec GM (C'est pourquoi que je fais un petit jeu sans prétention :D)

Il vaut mieu déplacé les backgrounds d'un seul pixel, plûtot que de 5.
Un petit code fait rapidos :

if (keyboard_check(vk_left) {
        background_x[0] = background_x[0] + 1;
        bgmove = bgmove + 1;
        if (bgmove = 3) {
                background_x[1] = background_x[1] + 1;
        }
}

Je n'ai pas eu le temps de le tester car je n'ai pas encore ré installé Game Maker (reformatage il y a pas longtemps), mais je pense que ça marche.
Donc en gros, le fonctionnement :
- Si la touche gauche est pressé, le background se décale d'1 pixel vers la droite, et la variable "bgmove" augmente de 1.
- Si la variable "bgmove" est a 3, alors le second background se décale d'1 pixel vers la droite.
Voila  ;)

Bon, pour les backgrounds animés, j'ai trouvé une solution, il suffit d'utiliser background_index[id] pour définir un nouveau fond. :)


Pour ce qui est des arrières plans défilants, je cherche toujours une solution... J'ai bidouillé pleins de trucs, mais même si ça marcheais plus ou moins, le fond a tendence à "sauter".. :\
Citation de: Neo2 le 24 Mai 2007 à 11:31
Il vaut mieu déplacé les backgrounds d'un seul pixel, plûtot que de 5.
Un petit code fait rapidos :

if (keyboard_check(vk_left) {
        background_x[0] = background_x[0] + 1;
        bgmove = bgmove + 1;
        if (bgmove = 3) {
                background_x[1] = background_x[1] + 1;
        }
}

Je n'ai pas eu le temps de le tester car je n'ai pas encore ré installé Game Maker (reformatage il y a pas longtemps), mais je pense que ça marche.
Donc en gros, le fonctionnement :
- Si la touche gauche est pressé, le background se décale d'1 pixel vers la droite, et la variable "bgmove" augmente de 1.
- Si la variable "bgmove" est a 3, alors le second background se décale d'1 pixel vers la droite.
Voila  ;)
Je ne pense pas que ce soit une bonne solution.. premièrement le fond défile beaucoup trop vite (car il faut le faire bouger de L'autre sens, le but étant de ralentir le mouvement du fond et non l'accélérer). Mais en le fasiant bouger dans l'autre sens, c'est beaucoup trop lent, et les autres fonds, qui bougent à chaque 3 steps, c'est hyper saccadé(ça bouge donc avec une belle vitesse de... 10 fps...). De plus, le fond bouge même si la vue ne bouge pas. Enfin, merci quand même ^_^



Sinon, je vais utiliser le même topic pour poser d'autres questions concernant GM; j'ai une autre question.


J'ai du mal à faire un HUD. Je pense que c'est composé de divers objets, et pour les chiffres par exemple, on change le sprite d'un objet en question. Pour ça, il n'y a pas de problème. Mais comment fait-on pour garder le HUD fixe, pour pas qu'il ne bouge avec la Map lorsque la vue bouge ? Je n'ai pas trouvé de moyen... Le seul moyen que j,ai trouver est en utilisant la méthode actuelle utilisés  pour les fonds; lorsque l'on bouge à droite par exemple, le HUD se décale vers la gauche et se replace quand on arrête de bouger...

En gros, je veux positionner le HUD par rapport à la vue, bref l'écran (et non la map) et que celui-ci reste fixe. J'ai fait de nombreuses recherches sur internet, et j'ai fait une grosse recherche sur le forum de gameMaker sans avoir de réponse à ma question :(

Au nombre de personnes faisant un Zelda amateur avec GM, je pense que beaucoup de monde vont pouvoir me répondre ^_^

Merci d'avance à ceux qui pourront m'éclaircir ^_^



PS: Si un modo peut bien changer le titre en "Aide pour Game maker" ou quelque chose du genre, ça serait plus approprié maintenant :)

21 Juin 2007 à 09:21 #6 Dernière édition: 21 Juin 2007 à 09:23 par Octorok
Pour le Hud c'est assez simple. Il faut utiliser l'évenement "view". Il suffit d'utiliser un script et de s'aider des variables suivantes :
view_xview
view_yview

Ces 2 variables désignent en quelques sortes l'origine de la vue, le point tout en haut à gauche. Pour fixer un hud, tu peux utiliser ces variables et y ajouter une valeur qui désignera un décalage en pixels.
Par exemple : view_xview[0] + 200, le[0] désignant le numéro de la vue utilisée. ;)


EDIT : Je renomme le topic au passage.

Citation de: Octorok le 21 Juin 2007 à 09:21
Pour le Hud c'est assez simple. Il faut utiliser l'évenement "view". Il suffit d'utiliser un script et de s'aider des variables suivantes :
view_xview
view_yview

Ces 2 variables désignent en quelques sortes l'origine de la vue, le point tout en haut à gauche. Pour fixer un hud, tu peux utiliser ces variables et y ajouter une valeur qui désignera un décalage en pixels.
Par exemple : view_xview[0] + 200, le[0] désignant le numéro de la vue utilisée. ;)


EDIT : Je renomme le topic au passage.
C'est ce que j'utilise; mais la vue est mise à jour après les events End Step, ce qui fait que le HUD bouge à la prochaine frame, et donc se décale et saute de tous les côtés :unsure:

Si tu mets dans l'event "view" un truc du genre :
self.x = view_xview + 200
self.y = view_yview + 25

Alors normalement il n'y a pas de décalage, le hud se décalera en même temps que la vue, logique, et tout sera fluide. :)

Il n'y a pas d'évènement view, enfin, je suis sur GM 6.1, ça peut-être été ajouté dans la version 7 ? Dans ce cas je pense que je devrais passer au 7 :unsure:

Sinon, on peut y lire dans la changelog:
Citation- Changed the way an object is followed by a view (only position, no longer taking sprite into account). This avoids a lot of jitter problems, but might require slightly larger border settings.

Donc... peut-être qu'en passant à GM7, ça peut régler le problème?

Autant pour moi, ce n'est pas l'évent view mais l'évent draw. ^^ Je viens de vérifier, je m'étais basé sur des souvenirs et j'ai confondu les deux. ^^ Moi même je suis sur GM6, donc à mon avis GM7 n'apporte pas de résolution. C'est bel et bien l'évent draw, je m'étais trompé. ;)

21 Juin 2007 à 23:07 #11 Dernière édition: 21 Juin 2007 à 23:29 par Linkdu83
Perso, pour mon HUD, je n'utilise pas un objet avec un sprite. Utilises un objet qui n'a pas de sprite, puis tu crées un évenement DRAW : draw_sprite et tu mets pour les coordonnées des view_xview et view_yview. Et tu te débrouille avec les sprites pour faire un HUD et c'est la classe et c'est pas sacadé !

EDIT pour en dessous : Tout à fait d'accord !

21 Juin 2007 à 23:17 #12 Dernière édition: 21 Juin 2007 à 23:24 par Link 57
En général, le HUD change en fonction de l'avancement de la quête, des changements d'objets, etc.

Le mieux est donc de faire draw_sprite(sprite_index,image_index,view_xview,view_yview) dans le draw de l'objet, puis d'utiliser des sprite_index et des variables dans le step de l'objet qui changeront l'apparance de ce HUD en fonction des variables.

A partir de ça, le HUD s'affichera toujours en fonction de tes variables (activées ou non). Je pense que c'est l'une des meilleures méthodes. ^^

Pour le fond, j'ai essayé avec l'evenement Draw, ça fait exactement la même chose, à l'exeption que l'onjet devient invisible...

J'en ai marre, je vais faire mon propre système de vue, ce sera moins compliqué qu'utiliser celui par défaut...



Pour le HUD, merci de vos indications, je vais me pencher sur ça! :)