AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 équivalent collision + start moving in a direction

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Black_cat
Bonne participation
avatar

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

MessageSujet: équivalent collision + start moving in a direction   Mer 19 Fév 2014 - 15: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 *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: équivalent collision + start moving in a direction   Mer 19 Fév 2014 - 15: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
avatar

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

MessageSujet: Re: équivalent collision + start moving in a direction   Mer 19 Fév 2014 - 16: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 ***
avatar

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
...

MessageSujet: Re: équivalent collision + start moving in a direction   Mer 19 Fév 2014 - 16: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 *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: équivalent collision + start moving in a direction   Mer 19 Fév 2014 - 21: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 ***
avatar

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
...

MessageSujet: Re: équivalent collision + start moving in a direction   Mer 19 Fév 2014 - 22:09

"4) ???
5) PROFIT!"



 gnii

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




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

Revenir en haut Aller en bas
 
équivalent collision + start moving in a direction
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Onomatopées! (l'équivalent)
» JDA 2010/2011 DIRECTION LA PRO B
» [RECH] Pièce plastique de colone de direction électrique
» Secrétaire de direction
» Dramatique collision entre un roulier et un porte-conteneurs

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: