AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez
 

 updateFromVelocity - Déplacements pour 2D platformer

Aller en bas 
AuteurMessage
onilink_
Modérateur
onilink_

Messages : 9088
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 - 15: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


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

Messages : 9088
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 - 14: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
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 EmptyMer 13 Jan 2016 - 23: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 U3dfr2 l'antique http://www.membres.lycos.fr/thedarkminousite/updateFromVelocity - Déplacements pour 2D platformer Sign
Bienvenue au 2543eme utilisateur : bibi1992 !
Revenir en haut Aller en bas
http://www.tdms.fr
onilink_
Modérateur
onilink_

Messages : 9088
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 - 9: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
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
-
» question sur les déplacements pour un serpent.
» Projet mini-bibliothèque en centre de loisirs pour enfants
» Cherche lieu pour mariage
» Combien d'impot pour 20 000 clair (ou +)
» la 1.5 pour les nuls (et les traitres)

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