AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
-28%
Le deal à ne pas rater :
Brandt LVE127J – Lave-vaisselle encastrable 12 couverts – L60cm
279.99 € 390.99 €
Voir le deal
Le Deal du moment : -39%
Pack Home Cinéma Magnat Monitor : Ampli DENON ...
Voir le deal
1190 €

 

 équivalent collision + start moving in a direction

Aller en bas 
3 participants
AuteurMessage
Black_cat
Bonne participation
Black_cat


Messages : 71
Projet Actuel : https://www.youtube.com/playlist?list=PLrJ_sOwnC_FmBql7bimmXplsVcyDbZCVh

équivalent collision + start moving in a direction Empty
MessageSujet: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction EmptyMer 19 Fév 2014 - 16:00

Bonjour à tous,

après un long moment sans problème sur mon jeu, me voici confronté à un problème qui devrait être simplicime, et me pose pourtant bien problème.
En effet, j'ai une caisse qui peut être déplacée par le joueur (déplacement de 64px en 64px uniquement) dans toute les directions, et se trouve être arrêté par les objets du décors (certains seulement que j'ai sélectionné).

Jusque là, j'avais fait ça rapidement via l'interface graphique puisque ça ne nécessitait pas forcément de passer par le code.
Dans mes Events, je choisissais donc "Collision", et j'allais chercher un objet de mon décors.
Puis dans mes Actions, je choisissais "Start moving in a direction", je n'indiquait aucune direction spécifique, et je laissais le "Speed" à 0.
L'effet était simple, lorsque la caisse avait un objet indiqué en face d'elle, elle ne pouvait plus bouger dans cette direction, mais pouvait continuer à être déplacée dans une direction non bloquante.

Le soucis, c'est que je commence à avoir un certain nombre d'objet, et lorsque j'en ajoute un, je dois le définir dans une pléthore de fichiers (le moteur de jeu devenant de plus en plus complexe avec l'avancement du projet). j'ai donc fait une table avec tous mes objets, et tous mes fichiers font maintenant référence à cette table pour les lister. Du coup, je me facilite la vie.
Le soucis, c'est que pour les caisses j'avais fait ça avec l'éditeur graphique, et là je suis incapable de trouver un équivalent en code...

En fait, je voudrai faire tout simplement la même chose en GML, sauf que j'ai l'impression que ça ne se fait pas simplement...
De toute évidence, il faudrait vérifier dans quelle direction se trouve l'obstacle, et selon cette direction, bloquer certains déplacement.
Rien de trop méchant évidemment, mais j'ai beaucoup de mal à croire qu'il faille faire quelque chose de si "complexe" (façon de parler) alors qu'en interface graphique c'est juste une action sans aucune configuration supplémentaire... :/

A mon avis, même en regardant bien la doc, je suis passé à côté d'un truc.
je cherche juste à avoir un équivalent à l'Event Collision jumelé à l'Action Start moving in a direction en GML, et là, c'est la catastrophe, je ne trouve pas.
Ca doit être tout con, mais je bloque...
Donc si vous pouviez me sortir du pétrin, ce serait avec grand plaisir!  gnii 
Revenir en haut Aller en bas
https://www.youtube.com/user/sundayindiegames
D-z
Utilisateur confirmé: Rang *****
D-z


Messages : 1611
Localisation : Montpellier

équivalent collision + start moving in a direction Empty
MessageSujet: Re: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction EmptyMer 19 Fév 2014 - 16:31

En GML il y a place_meetng() et place_free() pour la détection de collisions, et un simple speed = 0 pour stopper l'objet.
Cependant ce n'est pas la seule chose qu'il se passe dans un évènement de collision : si tes objets sont solides, le moteur physique de GM rajoute son grain de sel en empêchant les objets de s'interpénétrer, ce qu'il faut bien réécrire à la main si tu veux t'émanciper de l’évènement collision.

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Black_cat
Bonne participation
Black_cat


Messages : 71
Projet Actuel : https://www.youtube.com/playlist?list=PLrJ_sOwnC_FmBql7bimmXplsVcyDbZCVh

équivalent collision + start moving in a direction Empty
MessageSujet: Re: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction EmptyMer 19 Fév 2014 - 17:01

Merci pour ta réponse D-z.
En fait ça à l'air d'être une sacré galère...

En fait j'avais bien un :

Code:
if place_meeting(x,y,obj_mur_01)
{
    speed = 0;
}

Sauf que ça ne se comporte pas de la même manière, car il y a comme tu dis l'histoire de l'interpolation entre les pixels des deux objets. Si bien que pour reproduire exactement le même comportement, c'est l'enfer.
Surtout que d'après ce que j'ai pu lire à droite et à gauche, l'exécution du code ne se fait pas au même moment entre un step, et un Event de collision, ce qui fait que le comportement n'est de toute façon jamais exactement le même.
Enjoy...

Donc bon, je crois que j'irai tout aussi vite à rajouter mes objet de collision à la main dans mon objet "caisse".
C'est quand même rageant, j'ai réussi à tout optimiser pour n'avoir qu'à rajouter un objet dans un tableau pour que ce soit ajouté partout, et là je suis bloqué sur un truc complètement con de collision impossible de faire proprement sans interface graphique.
Pour le coup ça me frustre... :/
Revenir en haut Aller en bas
https://www.youtube.com/user/sundayindiegames
chopsuey
Utilisateur confirmé: Rang ***
chopsuey


Messages : 523
Localisation : saint etienne
Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...

équivalent collision + start moving in a direction Empty
MessageSujet: Re: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction EmptyMer 19 Fév 2014 - 17:55

Ce que tu peux faire sinon c'est éviter les collisions en gérant ça directement depuis ta façon de déplacer ton objet à l'aide d'une boucle.

for (i=0;i<vitesse_max;i+=1)
{
if ! place_meeting(x+1,y,objet)
{x+=vitesse_droite/vitesse_max}
if ! place_meeting(x-1,y,objet)
{x-=vitesse_gauche/vitesse_max}}
if ! place_meeting(x,y+,objet)
{y+=vitesse_bas/vitesse_max}}
if ! place_meeting(x,y-1,objet)
{y-=vitesse_haut/vitesse_max}}
}  

A toi de définir tes variables vitesse, exemple:

acceleration=0.3
deceleration=0.4

if keyboard_check(vk_right)
{vitesse_droite+=acceleration}
else
{vitesse_droite-=deceleration}

if keyboard_check(vk_left)
{vitesse_left+=acceleration}
else
{vitesse_left-=deceleration}

if keyboard_check(vk_down)
{vitesse_bas+=acceleration}
else
{vitesse_bas-=deceleration}

if keyboard_check(vk_up)
{vitesse_haut+=acceleration}
else
{vitesse_haut-=deceleration}

if vitesse_droite>vitesse_max{vitesse_droite=vitesse_max}
if vitesse_droite<0{vitesse_droite=0}
if vitesse_gauche>vitesse_max{vitesse_gauche=vitesse_max}
if vitesse_gauche<0{vitesse_gauche=0}
if vitesse_bas>vitesse_max{vitesse_bas=vitesse_max}
if vitesse_bas<0{vitesse_bas=0}
if vitesse_haut>vitesse_max{vitesse_haut=vitesse_max}
if vitesse_haut<0{vitesse_haut=0}


Si t'as trop d'objets, tu peux pour plus de visibilités utiliser des scripts:

scr_test_place:

if ! place_meeting(x+1,y,argument0)
{x+=vitesse_droite/vitesse_max}
if ! place_meeting(x-1,y,argument0)
{x-=vitesse_gauche/vitesse_max}}
if ! place_meeting(x,y+,argument0)
{y+=vitesse_bas/vitesse_max}}
if ! place_meeting(x,y-1,argument0)
{y-=vitesse_haut/vitesse_max}}

dans step:

for (i=0;i<vitesse_max;i+=1)
{
scr_test_place(objet_1)
scr_test_place(objet_2)
scr_test_place(objet_3)
scr_test_place(objet_4)
}

_________________
Spoiler:
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
D-z


Messages : 1611
Localisation : Montpellier

équivalent collision + start moving in a direction Empty
MessageSujet: Re: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction EmptyMer 19 Fév 2014 - 22:48

Hum, ma réponse était concise limite incomplète. J'ai omis de préciser que speed fait aussi partie du moteur physique (d'où sa coloration spéciale). D'où peu de contrôle, et obligation de faire du pétassage au scotch si tu veux modifier son comportement.
C'est a priori le moment de faire ton propre moteur, histoire de savoir ce qu'il se passe quand. Suggestion :
1) Utiliser tes propres variables hvel et vvel (ou comme tu le sens) au lieu de hspeed et vspeed (réservées)
3) Code équivalent (si je ne m'abuse) à la gestion d'une collision de GM :
Code:
if(abs(hvel) > 0 || abs(vvel) > 0) {
    if(place_meeting(x + hvel, y + vvel, ...)) {
        hvel = 0;
        vvel = 0;
    } else {
        x += hvel;
        y += vvel;
    }
}
4) ???
5) PROFIT!

Note que l'objet n'est pas plaqué à l'obstacle qu'il rencontre, mais ça n'a pas l'air de te poser de problème avec le moteur built-in.

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
chopsuey
Utilisateur confirmé: Rang ***
chopsuey


Messages : 523
Localisation : saint etienne
Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...

équivalent collision + start moving in a direction Empty
MessageSujet: Re: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction EmptyMer 19 Fév 2014 - 23:09

"4) ???
5) PROFIT!"

équivalent collision + start moving in a direction 50354_52868089380_8800_n

 gnii

_________________
Spoiler:
Revenir en haut Aller en bas
Contenu sponsorisé





équivalent collision + start moving in a direction Empty
MessageSujet: Re: équivalent collision + start moving in a direction   équivalent collision + start moving in a direction Empty

Revenir en haut Aller en bas
 
équivalent collision + start moving in a direction
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Résolu]Aller dans la direction opposé de la collision
» Collision avec un objet qui bouge dans les 4 direction ...
» Script de détection de collision avec une direction HBGD
» [Tout mes projets] Zombie Kebab, Eskiv, Moving System ...
» D-START, Un nouveau remplaçant du menu démarrer

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Entraide débutants-
Sauter vers: