Quelqu'un saurait comment réinitialiser la position de la souris sur un objet toutes les x secondes? J'ai vu que cette solution était souvent utilisé dans les jeux pour baisser la sensibilité du curseur (en créant un curseur virtuel qui va x% moins vite et en cachant le vrai qui revient toujours au centre).
Ici ça serait juste pour qu'il reste sur un objet, donc je voudrais que la souris soit bloqué sur un objet.
Tu dis qu'en temps normal ton curseur se draw au position de la souris:
if normal==1
{draw_sprite(spr,ima,mouse_x,mouse_y}
Et tu modifies la variable normal à 0 quand tu veux que ton curseur se bloque.
Tu définis l'objet sur le quel le curseur doit rester bloqué.
obj_bloquer=nom de l'objet
if normal==0
{draw_sprite(spr,ima,obj_bloquer.x,obj_bloquer.y}
J'ai oublié de préciser que je rend également le curseur invisible, en fait c'est pour éviter qu'il sorte de la fenêtre.
Du coup je devrais mettre quel commande? Car draw sprite n'est pas utile ici.
Tu veux empêcher mouse_x et mouse_y de se déplacer ?
Si c'est ça c'est impossible. Ce sont des variables qui ne dépendent pas de GM mais de windows. A part en utilisant une dll peut être...
Mais ya surement d'autres solution, pourquoi ne faut il pas que le curseur se déplace ?
Non en fait je contrôle un perso qui tombe à la souris. Cette dernière est invisible, mais le problème est qu'au bout d'un moment en la bougeant on peut sortir de la fenêtre ce qui est embêtant. J'aimerais donc faire en sorte que le curseur soit tout le temps remis sur le personnage, tout en pouvant le contrôler via la souris.
Une autre question, en gros je voudrais que quand on appuie sur Echap, on revienne au menu principale et que si on y est déjà, on quitte le jeu. Donc j'ai mis:
If previous room exit
----(start of a block)
----go to room accueil
----(end of a block)
else
----(start of a block)
----end the game
----(end of a block)
Le tout avec les bloccks, mais ça ne fonctionne pas. Quel est le problème?
En fait ça me renvoie à l'écran d'accueil quand je suis dans un niveau, mais si je rappuie rien ne se passe. De plus, depuis l'écran de sélection des niveaux ça ne fonctionne pas (le bouton retour créé spécialement pour revenir à l'écran d'accueil non plus).
Bon fausse alerte pour le bouton retour, juste un problème dans les événements
Sinon en gros le retour à l'accueil ne fonctionne quand dans un niveau, mais pas quand on est sur l'écran de sélection des niveaux (qui est la pièce juste après l'écran d'accueil)
Ok je comprend mieux.
Essaye ça:
im=300 //nombre de fois ou le programme va tester la position de x par rapport à mouse_x
v=10 // vitesse. Plus la valeur est proche de im plus x correspondra à mouse_x
// donc plus la vitesse serra grande
x_max=100 // bordure droite à ne pas dépasser
x_min=100 // bordure gauche à ne pas dépasser
for(i=0;i<im;i+=1)
{
if x<(view_xview[0]+view_wview[0])-x_max
and x>x_min
{
if x>mouse_x
{x-=v/im}
else
{x+=v/im}
}
if x>=(view_xview[0]+view_wview[0])-x_max
{x-=1}
if x<=x_min
{x+=1}
}
J'ai essayé mais ça ne fonctionne pas Je dois le mettre où? Car j'ai essayé de le mettre dans les événements create et step du personnage, mais ça ne fonctionne pas. En fait, le personnage est naturellement collé à la souris grâce à joueur_Obj.x=mouse_x;, mais pas sur le plan vertical, et si le perso est bloqué la souris continue. Le perso suit la souris, mais elle est libre.
Mais je m'aperçois que ce n'est pas un élément très important pour l'instant en fait. Il y a autre chose qui me gêne plus et que j'essaye de résoudre en ce moment. Au début des niveaux, le perso est arrêté, et il faut cliquer pour qu'il commencer à tomber. Le problème est que même arrêté, je peux contrôler son déplacement horizontal alors que je souhaiterais qu'il soit bloqué.
J'ai essayé plusieurs solutions, mais avec joueur_Obj.x=mouse_x; dans l'event step du perso, c'est difficile Des solutions?
Je peux poster le jeu si besoin.
En fait je pense que ce qu'il faudrait faire c'est quelque chose du genre "tant qu'on a pas cliqué -> mouvement 0". Mais je ne vois pas comment traduire un tant que avec une négation de ce genre
Petite question : Est-ce que les jeux android tournent sans lag ?
Les jeux fait sur game maker pour android?
Bon j'ai résolu mon problème précédant en utilisant un concept auquel j'avais déjà pensé mais que j'hésitait à appliquer: on ne contrôle le personnage que lorsqu'on clique. Du coup j'ai également rendu la souris visible parce que sinon ça devient embêtant
Il me reste donc un problème ( ). En gros, quand le perso meurt il se téléporte immédiatement au début du niveau. Sauf que j'ai ajouté un effet de particules quand on meurt, et j'aimerais que le joueur puisse en profiter . J'aurais bien utilisé le block "sleep", mais il n'est pas disponible dans game maker studio
J'ai essayé avec les alarmes, mais je veux que quand le perso touche un mur il s'arrête pendant x millisecondes pour admirer l'effet de particules puis se téléporte, or si je le fais s'arrêter au contact d'un mur il ne peut plus se téléporter tant qu'il touche ce mur Des solutions?
Tu le bloque avec une variable.
Je suppose que tu utilises encore le drag and drop ? avec le gml c'est plus simple.
En gros tu bloques les actions du joueur avec une variable qui te sert de condition.
exemple:
dans l'event mouse.
if bloquer==0
{
x=mouse_x
}
comme ça quand tu touche le mur bloquer=1 et le perso ne se déplace plus. Tu fais la même chose pour son déplacement vertical ou pour toutes les actions qu'il peut normalement faire.
Puis tu lance une alarme à la collision avec le mur:
if alarm[0]==-1
{
alarm[0]=60
}
Dans cette alarme tu renvois ton perso au début du niveau et bloquer=0
OhMyMom oui mais t'as intérêt à pas faire n'importe quoi avec l'optimisation.
Donc concrètement, je défini la variable bloquer à 1 dans l'event toucher le mur, puis dans l'event mouse je met:
if bloquer==0
{
joueur_Obj.x=mouse_x;
}
if bloquer==1
{
joueur_Obj.x=x; //c'est ça pour le l'arrêter?
joueur_Obj.y=y; //
}
et dans le if bloquer==1 je rajoute l'alarme. Je suis un peu fatigué donc je comprends pas tout en fait Il faut aussi que je me mette au gml, pour l'instant je n'y ai presque pas touché et je ne sais pas convertir tous les blocks en gml.
Déjà si tu veux modifier une variable appartenant au même objet dans lequel tu rentre le code tu n'a pas besoin de préfixes "obj." tu écrits simplement x
Si tu veux modifier le x d'un objet à partir d'un autre objet là tu dois spécifier au programme le nom de cette objet.
Et tu n'as pas besoin de dire:
"
if bloquer==1
{
joueur_Obj.x=x; //c'est ça pour le l'arrêter?
joueur_Obj.y=y; //
}
"
Le simple fait de dire que la position x n'est = à mouse_x seulement quand bloquer==0 suffit à faire s’arrêter le perso quand bloquer n'est plus = à 0
"et dans le if bloquer==1 je rajoute l'alarme. "
Non dans la collision avec le mur pareil pour bloquer =1.
collision mur:
bloquer=1
if alarm[0]==-1
{
alarm[0]=60
}
Ok merci je testerai demain, là je comprend plus rien je suis trop mort
Si t'es toujours là j'aurais une dernière question: j'ai un mode "level" qui fonctionne, où l'on fait le niveau sélectionné puis on retourne à l'écran de sélection, et je suis en train de mettre en place un mode survival où le but est de faire tous les niveaux à la suite.
A la fin de mes niveaux, j'ai un objet qui envoie le joueur à l'écran de sélection. Je veux donc faire en sorte qu'il ne le fasse qu'en cas de sélection du mode level, et qu'il enchaine sur le prochain niveau en cas de mode survival.
Pour ça j'ai créé une variable survival, mise à 1 si on sélectionne le mode et à 0 sinon. Quand le joueur touche l'objet de transition, il vérifie l'état de cette variable et décide quoi faire. Sauf qu'il me renvoie le message d'erreur suivant:
___________________________________________
FATAL ERROR in
action number 1
of Step Eventjoueur_Obj
for object end0_Obj:
Push :: Execution Error - Variable Get -1.survival(100001, -1)
at gml_Object_end0_Obj_Collision_0 (line 2) - __b__ = action_if_variable( survival, 1, 0 );
Je comprends pas vraiment ce que dit ce message, survival prend la valeur -1?
Bon je comprends un peu mieux le message d'erreur, apparemment un problème avec la variable. Voilà ce que j'ai fait:
Au lancement du jeu, je la met à 0. Quand on clique sur "level", set à 0 (relative), quand on clique sur "survival", set to 1 (relative). Puis quand on arrive à la fin d'un niveau, si survival_v = 1, on passe au niveau suivant, sinon on revient à l'écran de sélection.
J'ai également appliqué la variable à l'objet du personnage, c'est sûrement ça qui pose problème. Mais il n'y a aucun objet commun à toutes les salles. Je devrais peut être en mettre un sans sprite qui sert juste à contenir la variable...
Je viens d'essayer, non ça marche toujours pas