AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -40%
-40% sur le Pack Gaming Mario PDP Manette filaire + ...
Voir le deal
29.99 €

 

 updateFromVelocity - Déplacements pour 2D platformer

Aller en bas 
2 participants
AuteurMessage
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

updateFromVelocity - Déplacements pour 2D platformer Empty
MessageSujet: updateFromVelocity - Déplacements pour 2D platformer   updateFromVelocity - Déplacements pour 2D platformer EmptyMer 12 Fév 2014 - 16:50

Voici un script qui permet de gérer les collisions au pixel près en fonction d'une vélocité horizontale et verticale.
Gère aussi les vélocités non entières (dernière partie du code), et permet de savoir s'il y a eu collision ainsi que de quel coté.

Code:
/*
    updateFromVelocity()
    Par onilink_
    http://cbna.forumactif.com/
    Déplacements au pixel près en fonction d'une velocité (vx, vy)
    Si une/des collision(s) detectee(s), la/les renvoie(s) dans:
        collisionRight
        collisionLeft
        collisionTop
        collisionBottom
*/
var xvelocity, yvelocity;

collisionRight = false
collisionLeft = false

if(vx > 0) xvelocity = floor(vx)
else xvelocity = ceil(vx)

if(vy > 0) yvelocity = floor(vy)
else yvelocity = ceil(vy)

if(xvelocity > 0) {
for(i=0; i<xvelocity; i+=1) {
    if(place_free(x+1, y)) x+=1
    else {
        xvelocity = 0
        collisionRight = true
        break
    }
}
}
else if(xvelocity < 0) {
for(i=0; i<-xvelocity; i+=1) {
    if(place_free(x-1, y)) x-=1
    else {
        xvelocity = 0
        collisionLeft = true
        break
    }
}
}

collisionTop = false
collisionBottom = false


if(yvelocity > 0) {
for(i=0; i<yvelocity; i+=1) {
    if(place_free(x, y+1)) y+=1
    else {
        yvelocity = 0
        collisionBottom = true
        break
    }
}
}
else if(yvelocity < 0) {
for(i=0; i<-yvelocity; i+=1) {
    if(place_free(x, y-1)) y-=1
    else {
        yvelocity = 0
        collisionTop = true
        break
    }
}
}

if(place_free(x+frac(vx), y))
{
    x += frac(vx)
}
if(place_free(x, y+frac(vy)))
{
    y += frac(vy)
}


Pour l'utiliser, le plus efficace et de créer un objet qui sera le parent de tous les objets 'physiques'.
Genre Dynamic:
#create
Code:
vx = 0
vy = 0

#end step
Code:
updateFromVelocity()

Vous pouvez maintenant utiliser vx et vy de la même manière que hspeed et vspeed, sauf que dans ce cas les collisions seront automatiques avec les objets solides.

Pour les jeux un peu complexes il est conseillé de remplacer le code précédent par:
Code:
/*
    Par onilink_
    http://cbna.forumactif.com/
    Deplacements au pixel près en fonction d'une velocité (vx, vy)
    Si une/des collision(s) detectee(s), la/les renvoie(s) dans:
        collisionRight
        collisionLeft
        collisionTop
        collisionBottom
*/
var xvelocity, yvelocity;

collisionRight = false
collisionLeft = false

xvelocity = floor(vx)
yvelocity = floor(vy)

if(xvelocity > 0) {
for(i=0; i<xvelocity; i+=1) {
    if(placeFree(x+1, y)) x+=1
    else {
        xvelocity = 0
        collisionRight = true
        break
    }
}
}
else if(xvelocity < 0) {
for(i=0; i<-xvelocity; i+=1) {
    if(placeFree(x-1, y)) x-=1
    else {
        xvelocity = 0
        collisionLeft = true
        break
    }
}
}

collisionTop = false
collisionBottom = false


if(yvelocity > 0) {
for(i=0; i<yvelocity; i+=1) {
    if(placeFree(x, y+1)) y+=1
    else {
        yvelocity = 0
        collisionBottom = true
        break
    }
}
}
else if(yvelocity < 0) {
for(i=0; i<-yvelocity; i+=1) {
    if(placeFree(x, y-1)) y-=1
    else {
        yvelocity = 0
        collisionTop = true
        break
    }
}
}


if(placeFree(x+frac(vx), y))
{
    x += frac(vx)
}
if(placeFree(x, y+frac(vy)))
{
    y += frac(vy)
}
et de définir une fonction placeFree.

Si vous n'arrivez pas a utiliser ce script, n'hésitez pas a demander un exemple.
Je vous le ferais dans la soirée.

_________________
updateFromVelocity - Déplacements pour 2D platformer Runningpotato1updateFromVelocity - Déplacements pour 2D platformer TvF6GED updateFromVelocity - Déplacements pour 2D platformer MdetltS


Dernière édition par onilink_ le Mer 9 Juil 2014 - 18:57, édité 1 fois (Raison : Correction floor)
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

updateFromVelocity - Déplacements pour 2D platformer Empty
MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   updateFromVelocity - Déplacements pour 2D platformer EmptyDim 3 Jan 2016 - 15:22

Sur la demande d'un user, quelques petits platform engines qui utilisent le script pour l'exemple.

Sans prise en compte de delta time: http://host-a.net/u/onilink_/base.gm6
Avec: http://host-a.net/u/onilink_/baseplustime.gm6

En utilisant l'integration de verlet: http://host-a.net/u/onilink_/physics_verlet.gm6

_________________
updateFromVelocity - Déplacements pour 2D platformer Runningpotato1updateFromVelocity - Déplacements pour 2D platformer TvF6GED updateFromVelocity - Déplacements pour 2D platformer MdetltS
Revenir en haut Aller en bas
[TheDarkTiger]
Modérateur
[TheDarkTiger]


Messages : 7420
Localisation : Essonne

updateFromVelocity - Déplacements pour 2D platformer Empty
MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   updateFromVelocity - Déplacements pour 2D platformer EmptyJeu 14 Jan 2016 - 0:25

Mon dieu, Onilink se remet au GML !

Par curiosité, qu'est-ce qu'un verlet ?

_________________
Bonne chance pour vos projets actuels ! Prêt à aider ceux qui en ont besoin ^^
updateFromVelocity - Déplacements pour 2D platformer U3dfr2updateFromVelocity - Déplacements pour 2D platformer Sign l'antique
Bienvenue au 2629eme utilisateur : Mike Jones !
Revenir en haut Aller en bas
http://www.tdms.fr
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

updateFromVelocity - Déplacements pour 2D platformer Empty
MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   updateFromVelocity - Déplacements pour 2D platformer EmptyJeu 14 Jan 2016 - 10:33

C'est juste une intégration très simple a utiliser :p

Sinon ces exemples sont assez vieux, j'ai juste fait quelques modifs x)

_________________
updateFromVelocity - Déplacements pour 2D platformer Runningpotato1updateFromVelocity - Déplacements pour 2D platformer TvF6GED updateFromVelocity - Déplacements pour 2D platformer MdetltS
Revenir en haut Aller en bas
Contenu sponsorisé





updateFromVelocity - Déplacements pour 2D platformer Empty
MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   updateFromVelocity - Déplacements pour 2D platformer Empty

Revenir en haut Aller en bas
 
updateFromVelocity - Déplacements pour 2D platformer
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Platformer en ligne
» pacman platformer
» Mechanic Infantry [Platformer]
» [Bêta / Jeu Indé] Dreamz : Platformer Sandbox
» Deplacements GML

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