AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 updateFromVelocity - Déplacements pour 2D platformer

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
onilink_
Modérateur
avatar

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

MessageSujet: updateFromVelocity - Déplacements pour 2D platformer   Mer 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.

_________________
                 


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
avatar

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

MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   Dim 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

_________________
                 
Revenir en haut Aller en bas
[TheDarkTiger]
Modérateur
avatar

Messages : 7369
Localisation : Essonne

MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   Mer 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 ^^
l'antique http://www.membres.lycos.fr/thedarkminousite/
Bienvenue au 2509eme utilisateur : geantvert123 !
Revenir en haut Aller en bas
http://www.membres.lycos.fr/thedarkminousite/
onilink_
Modérateur
avatar

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

MessageSujet: Re: updateFromVelocity - Déplacements pour 2D platformer   Jeu 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)

_________________
                 
Revenir en haut Aller en bas
Contenu sponsorisé




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

Revenir en haut Aller en bas
 
updateFromVelocity - Déplacements pour 2D platformer
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» code pour inséré les anime (Fond transparent)
» Plugins Firefox pour sécuriser votre navigateur.
» Pb pour le choix de la voie
» hébergeur gratuit pour un site rein quand flash(RESOLUT)
» Affiches comment être et faire pour apprendre

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