| [Résolu] Problème avec la physique | |
|
|
|
Auteur | Message |
---|
Bobstone Débutant
Messages : 20
| Sujet: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 14:07 | |
| Bonjour, Je débute en gml et particulièrement avec la physique (les pentes et l'eau surtout). Je cherche un moteur (en gml ou extension si il est simple) facilement modulable contenant des pentes et de l'eau si possible. Comme ma version de game maker est studio je préfère les scripts ou les .gmz Si vous en connaissez ou si vous en avez crée un merci de le poster (j'essaye depuis quatre jours de coder ma physique) Ps:J'ai déjà essayé bon nombre de moteurs : - Spoiler:
-Moteur de DeinDall -Moteur de Topaze -Moteur de shaun spalding (youtuber) -Extreme Physics Et beaucoup, beaucoup d'autres
Merci d'avance
Dernière édition par Newoofr le Jeu 20 Aoû 2015 - 18:52, édité 1 fois |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 14:14 | |
| Postes un exemple de ce que tu veux comme "eau", car l'eau c'est bien une des choses les plus complexes a faire dans un jeu video si tu veux un truc réaliste, alors couplé aux pentes...
Du coup généralement on triche de diverses manières (genre surface dynamique mais eau statique, genre dans les mario, ou cell based via un automate cellulaire). |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 14:21 | |
| Merci Onilink (tu es rapide ) En fait je ne veux pas que l'eau se déplace d'elle même (excuse moi de ne pas avoir été clair) mais simplement que quand le personnage entre dans l'eau il perd de la vitesse, se déplace moins vite, la gravité est plus faible etc. |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 14:35 | |
| Bon c'est déjà beaucoup moins compliqué du coup. Par contre, ça va dépendre énormément de ton implémentation coté physique du joueur. Généralement on crée une fonction updateVelocityOnSlopes(vitesse x, vitesse y), dedans tu gères les déplacements d'un point A et un point B. (soit de (x,y) a (x+vitessex,y+vitessey)) Sans collisions ta fonction est donc - Code:
-
updateVelocityOnSlopes(vx, vy) { x += vx y += vy } (pour que tu comprennes bien le principe) Avec collisions c'est plus compliqué, y a de nombreuses façon de faire surtout pour les slopes. En général on déplace d'abord le perso a l'horizontale, et si y a un obstacle mais que la place est libre par exemple 1 pixel au dessus, bah tu le décales aussi a la verticale (pendant le déplacement horizontal). Ensuite tu fais le déplacement vertical. Bref a coup de boucle for et place_free y a moyen d'avoir un truc sympa. Une fois que t'as cette fonction les mouvements de ton perso se feront via deux variables: vx et vy (vitesse x et y) que tu modifieras en fonction des appuis de touche par ex. Du coup pour le contact avec l'eau, il suffit juste d'ajouter de la friction et le tour est joué. Par ex friction soustractive pour la vitesse horizontale: - Code:
-
if(vx < 0) { vx += fric if(vx > 0) vx = 0 } if(vx > 0) { vx -= fric if(vx < 0) vx = 0 }
|
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 14:49 | |
| Merci beaucoup je comprends mieux certains trucs, mais j'avais à peu près réussi à faire en sorte qu'on puisse monter les pentes mais j'ai surtout du mal sur les pentes descendantes (à rester coller dessus) ensuite pour l'eau j'ai fait plein de choses (vitesse divisé quand on rentre dans l'eau, on saute hors de l'eau si on à assez d'impulsion etc.) mais à force il y avait des bugs que je n'ai pas réussi à résoudre. voilà la physique la plus aboutie que j'ai réussi à créer (basé sur le vieux moteur de shaun spalding) par contre j'avais de bugs quand je descendais une pente mon personnage vibrait, mais il y avait aussi beaucoup de bugs mineurs avec l'eau. Ps : Merci BEAUCOUP de m'aider mais n'essaye pas de lire tout ça à moins que tu trouve la solution du premier coup - Spoiler:
- Code:
-
///Physique
//variables var hcollide, nageTimeReset = 0, slopeDescent = false //Get our inputs Key_Left = keyboard_check_direct(vk_left); Key_Right = keyboard_check_direct(vk_right); Key_Jump = keyboard_check_pressed(vk_space); Key_Up = keyboard_check_direct(vk_up); Key_Down = keyboard_check_direct(vk_down);
//détecte si le joueur nage if place_meeting(x,y,obj_water) {nage = true} else {nage = false}
//fait un petit saut quand on sort de l'eau if place_meeting(x,y+abs(vsp),obj_water) and nage == false and vsp < 0 and nageTime > 8 {vsp -= 8 triplejump += 1 }
//Move left and right if (Key_Left) if nage == false { hsp = -4; flip = -1; } else { hsp = -2; flip = -1;}
if (Key_Right) if nage == false { hsp = 4; flip = 1; } else { hsp = 2; flip = 1; } //Neutral input = 0 movement if ((Key_Right && Key_Left) or (!Key_Right && !Key_Left)) { hsp = 0; }
//Jumping if (Key_Jump) { if nage == false if (grounded) { triplejump += 1 vsp = -12; } else if triplejump <= 2 {vsp = -12 triplejump += 1}
}
if nage == true if keyboard_check(vk_space) if nageTime > 4 vsp = -2.5
if nage == false vsp += grav; else vsp += grav/5;
//Ladder if (Key_Up || Key_Down) { if place_meeting(x,y,obj_ladder) ladder = true; }
if (ladder) { vsp = 0; //hsp = 0; if (Key_Up) vsp = -2; if (Key_Down) vsp = 2; if !place_meeting(x,y,obj_ladder) ladder = false; if (Key_Jump) ladder = false; }
//Horizontal Collision hcollide = instance_place(x+hsp,y,obj_wall); if (hcollide != noone) { if ((hcollide).type == 1) { yplus = 0; while (place_meeting(x+hsp,y-yplus,obj_wall) && yplus <= 4) yplus += 1; if place_meeting(x+hsp,y-yplus,obj_wall) { while (!place_meeting(x+sign(hsp),y,obj_wall)) x+=sign(hsp);//éxecute tant qu'il n'y a pas de mur à droite ou à gauche (dépent de hsp) hsp = 0; //NB : cela permet d'aller contre le mur et de ne pas s'arrêter à 2 pixel (obj exemple) } else { y -= yplus //il monte la hauteur de la pente et ne s'arrête pas car hsp n'est pas égale à zéro } } }
if place_meeting(x,y+1,obj_slope) slopeDescent = true else slopeDescent = false
//slope Descent if slopeDescent == true {if triplejump == 0 { x += hsp while(!place_meeting(x,y+1,obj_slope) and place_meeting(x+hsp,y+31,obj_slope)) y+=1 }} else x += hsp;
if !place_meeting(x,y+1,obj_slope) if triplejump == 0 slopeDescent = false
//Vertical Collision var vcollide; vcollide = instance_place(x,y+vsp,obj_wall); //prend l'id du mur if (vcollide != noone) //s'il y a un mur { if ((vcollide).type == 1) //s'il le mur n'est pas un mur à 1 sens { while (!place_meeting(x,y+sign(vsp),obj_wall)) y+=sign(vsp); //éxecute tant qu'il n'y a pas de mur en bas ou en haut (dépent de vsp) vsp=0; //NB : cela permet d'aller contre le mur et de ne pas s'arrêter à 2 pixel (obj exemple) grounded = 1; } if ((vcollide).type == 2) if sign(vsp) == 1 if !keyboard_check(vk_down) { if (!place_meeting(x,y,obj_wall)) { while (!place_meeting(x,y+sign(vsp),obj_wall)) y+=1; vsp=0; grounded = 1; } } } else grounded = 0; y+=vsp;
//réduction de la vitesse quand on entre dans l'eau if nage == false if place_meeting(x,y+vsp,obj_water) if vsp > 10 {vsp = 10 vsp /= 4 while (!place_meeting(x,y,obj_water)) y+=1 } else {if vsp > 0 {vsp /= 4 while (!place_meeting(x,y,obj_water)) y+=1}}
//compte le temps qu'on reste dans l'eau if nage == true nageTime += 1 else if nageTimeReset = 0 {nageTimeReset = 1 nageTime = 0} else if nage == false nageTimeReset = 0 //reset triplejump if vsp = 0 triplejump = 0
if nage == true triplejump = 0
//slope Descent if slopeDescent == true if triplejump == 0 { while(!place_meeting(x,y+1,obj_slope) and place_meeting(x+hsp,y+31,obj_slope)) y+=1 }
if !place_meeting(x,y+1,obj_slope) if triplejump == 0 slopeDescent = false
|
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 15:39 | |
| Pas trop le temps de me pencher sur ton code mais c'est un sacré bordel, déjà faut absolument séparer la partie physique de la partie gameplay. Voici un vieux proto de physics engine que j'avais fait qui gère les slopes: http://host-a.net/u/onilink_/SlopesPhysics.gmkupdateFromVelocity - Code:
-
/* updateFromVelocity
Slopes physics engine by Boris Marmontel aka onilink_ Version 1 */ var xvelocity, yvelocity;
collisionRight = false collisionLeft = false
vx2 = vx + fracx vy2 = vy + fracy
if(vx2 > 0) xvelocity = floor(vx2) else xvelocity = ceil(vx2)
if(vy2 > 0) yvelocity = floor(vy2) else yvelocity = ceil(vy2)
// 1) Mouvement horizontal // a. Vers la droite if(xvelocity > 0) { onGround = isOnGround() // Slope qui descend while(xvelocity > 0 && onGround) { if(place_free(x+1, y)) { x += 1 xvelocity -= 1 onGround = false for(i=0; i<=3; i+=1) { if(!place_free(x, y+i)) { onGround = true y += i-1 break } } } else break } // Slope qui monte while(xvelocity > 0) { if(place_free(x+1, y)) { x += 1 xvelocity -= 1 } else if(place_free(x+1, y-1)) { x += 1 xvelocity -= 1 y -= 1 } else if(place_free(x+1, y-2)) { xvelocity -= 1 y -= 1 } else { break } } if(xvelocity > 0) { collisionRight = true } } else if(xvelocity < 0) { onGround = isOnGround() // Slope qui descend while(xvelocity < 0 && onGround) { if(place_free(x-1, y)) { x -= 1 xvelocity += 1 onGround = false for(i=1; i<=4; i+=1) { if(!place_free(x, y+i)) { onGround = true y += i-1 break } } } else break } // Slope qui monte while(xvelocity < 0) { if(place_free(x-1, y)) { x -= 1 xvelocity += 1 } else if(place_free(x-1, y-1)) { x -= 1 xvelocity += 1 y -= 1 } else if(place_free(x-1, y-2)) { xvelocity += 1 y -= 1 } else { break } } if(xvelocity < 0) { collisionLeft = true } }
collisionTop = false collisionBottom = false
// Mouvement vertical if(yvelocity > 0) { for(i=0; i<yvelocity; i+=1) { if(place_free(x, y+1)) y+=1 else { // grosse pente = comme si tombait normalement if(place_free(x-1, y+1) && place_free(x-1, y+2) && place_free(x-1, y+3)) { x -= 1 y += 1 } else if(place_free(x+1, y+1) && place_free(x+1, y+2) && place_free(x+1, y+3)) { x += 1 y += 1 } else { collisionBottom = true break } } } } else if(yvelocity < 0) { for(i=0; i<-yvelocity; i+=1) { if(place_free(x, y-1)) y-=1 else { collisionTop = true break } } }
fracx = frac(vx2) fracy = frac(vy2)
isOnGround - Code:
-
return !place_free(x, y+1) // sol plat || (!place_free(x, y+2) && (!place_free(x+1, y) || !place_free(x-1, y))) // slopes Exemple d'utilisation: Player #Create - Code:
-
vx = 0 vy = 0 fracx = 0 fracy = 0
old_time = current_time
delta_time = 1 #step - Code:
-
new_delta_time = 60*(current_time - old_time)/1000 delta_time = delta_time*0.97 + new_delta_time*0.03 room_caption = string(delta_time)
if(keyboard_check(vk_right)) vx = 3 else if(keyboard_check(vk_left)) vx = -3 else vx = 0
vy += 0.2 * delta_time
if(keyboard_check_pressed(vk_space) && isOnGround()) vy = -7
vx_tmp = vx vy_tmp = vy
vx *= delta_time vy *= delta_time updateFromVelocity()
vx = vx_tmp vy = vy_tmp
if(collisionBottom || collisionTop) vy = 0
old_time = current_time #begin step - Code:
-
if(keyboard_check_pressed(vk_numpad1)) { room_speed = 30 delta_time = 60/room_speed } if(keyboard_check_pressed(vk_numpad2)) { room_speed = 60 delta_time = 60/room_speed } if(keyboard_check_pressed(vk_numpad3)) { room_speed = 120 delta_time = 60/room_speed } if(keyboard_check_pressed(vk_numpad4)) { room_speed = 20 delta_time = 60/room_speed } Ce moteur a pour particularité d'être non dépendant du FPS (la vitesse de l'objet sera la même a 30 ou 60 ou encore 120 fps, mais plus le fps sera proche de celui de la fréquence de rafraîchissement, plus ce sera fluide), ce qui permet de gérer le cas de FPS variable (du a un lag par exemple), ou un FPS different du aux capacités de la machine. Il a aussi pour particularité d'avoir un degrés de pentes max. Au delà de slopes de 1x3, l'objet tombe comme s'il était sur du vide. C'est un proto de ce que j'utilise désormais dans planet centauri, donc c'est sensé plutôt bien marcher.
Dernière édition par onilink_ le Mer 19 Aoû 2015 - 15:42, édité 1 fois |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 15:42 | |
| Merci beaucoup onilink , je m'y penche tout de suite (et je vais essayer de ne plus t'embêter) |
|
| |
hyper Utilisateur confirmé: Rang ****
Messages : 1455
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 16:10 | |
| - onilink_ a écrit:
- C'est un proto de ce que j'utilise désormais dans planet centauri, donc c'est sensé plutôt bien marcher.
C'est donc pour ça qu'on tombe sur des pentes 1*3 Plus dans le sujet, c'est important le rapport aux fps, et encore plus la nécessité de séparer tes codes qui ne servent pas à la même chose (ici physique et contrôles). Ça fait moins "bordel". (je dis ça mais je devrais le faire un jour ) _________________ côt.
|
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 17:22 | |
| En fait en général je commence sur un truc super propre puis après je rajoute des trucs partout et ça devient le gros bordel, et puis j'ai du mal avec les scripts |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 18:20 | |
| Ça a rien de bien terrible un script, c'est juste une fonction que tu peux écrire toi même.
C'est vraiment la base, va lire un tuto sur ça si tu sais pas t'en servir.
|
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 18:39 | |
| Après avoir lu un tuto je me rend compte à quelle point c'est basique en fait... Au fait dans ton script tu as marqué : - Spoiler:
- Code:
-
// Slope qui descend (droite) while(xvelocity > 0 and onGround) { if(place_free(x+1, y)) { x += 1 xvelocity -= 1 onGround = false for(i=0; i<=3; i+=1) { if(!place_free(x, y+i)) { onGround = true y += i-1 break } } } else break }
et l'équivalent pour la gauche, mais est-ce-que je peux faire un seul code pour les deux côtés en utilisant des sign(vx) ? à moins qu'il y soit plus intéressant de faire un code par côté |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Mer 19 Aoû 2015 - 21:30 | |
| Y a un léger gain de perfs sans sign, mais bon si t'as pas masse d'objets in game je doute que tu le remarques (enfin avec GM on ne sait jamais).
|
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 10:25 | |
| ok merci, je me doutais qu'il y avait une raison, je le saurais dorénavant Edit : J'ai un problème avec l'eau, j'aimerais que mon personnage saute lorsque il remonte à la surface et qu'il a assez d'impulsion mais ne fait que remonter à la surface puis redescendre de ~5 pixels (pour donner l'impression qu'il nage) si il lui manque de l'impulsion. Comment faire donc pour détecter si il à assez d'impulsion ? |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 10:33 | |
| Bah tout est dans vx et vy la. |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 10:39 | |
| Je serais toi je ferais juste un timer, du coup quand t'appuie sur espace ça génère l'impulsion, pis ça attends un peu (via le timer) avant de pouvoir recommencer d'en donner une nouvelle.
Edit: Message fantôme? x) |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 10:44 | |
| au final j'ai fait ça : if vy > -1 vy -= 0.05 else vy = -1 et je détecte si vy = -1 pour le saut et oui message fantôme Edit : Il y a un bug et je ne suis pas sur qu'il vient de moi vu que je n'ai pas touché au moteur de collision. Quand je tombe vite et que j'atteri sur le coin d'un mur le personnage se coince dedans. |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 11:27 | |
| Est-ce que il détecte le mur comme étant une slope ou c'est le code qui ne s'éxecute pas assez rapidement ? |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 11:37 | |
| |
|
| |
Bobstone Débutant
Messages : 20
| |
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 11:54 | |
| Bizarre moi j'ai pas de soucis, tu m'envoies le gmk que je regarde?
|
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 13:25 | |
| Merci beaucoup de m'aider, j'espère vraiment que ce problème sera le dernier lorsque mon personnage sort de l'eau il ne saute pas or il devrait, mais à la place il retombe dans l'eau Voilà mon code pour l'eau (ne perds pas forcément ton temps à le lire j'ai mis des flèches aux codes importants si tu as le temps) - Spoiler:
- Code:
-
-------> //compte le temps qu'on nage vers le haut if place_meeting(x,y,obj_water) nage_time += 1 else nage_time = 0 //gravité if !place_meeting(x,y,obj_water) vy += 0.2 * delta_time else vy += 0.05 * delta_time
//Ralentissement des déplacements horizontales dans l'eau if place_meeting(x,y,obj_water) { if(vx < 0) { vx += fric if(vx > 0) vx = 0 } if(vx > 0) { vx -= fric if(vx < 0) vx = 0 } }
//Ralentissement lors de la chute dans l'eau if !place_meeting(x,y,obj_water) if place_meeting(x,y+vy,obj_water) {vy /= 10}
-------->//Petit Saut quand on sort de l'eau if place_meeting(x,y,obj_water) {if !place_meeting(x,y-vy,obj_water) {if keyboard_check(vk_space) {if not place_meeting(x,y-6,obj_wall) {if nage_time >= 6 { tripleJump += 1 vy = -5 } } } } } -------->//nager vers le haut if place_meeting(x,y,obj_water) {if keyboard_check(vk_space) {if nage_time > 8 {if tripleJump == 0 {if place_meeting(x,y-5,obj_water) {vy = -1 } } } } }
|
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 13:55 | |
| Envoie le gmk plutôt ce sera plus pratique. |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 14:10 | |
| |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 15:06 | |
| J'ai pas trouvé comment corriger ton soucis car j'ai pas eu le temps de beaucoup tester, mais plusieurs remarques:
1) water_slowdowny = 30 y+=vy
Ceci est la cause du bug que t'as eu plus haut, le principe quand on utilise un moteur physique est de ne justement plus utiliser x et y de manière brute. Si tu veux tu peux par contre faire une fonction moveTo comme je l'expliquais plus haut, qui se base sur la fonction updateFromVelocity. Tant que les déplacement se font via les fonctions du moteur physique, ton objet ne se coincera jamais.
2) if place_meeting(x,y,obj_water) {if keyboard_check(vk_space) {if nage_time > 8 {if tripleJump == 0 {if place_meeting(x,y-5,obj_water) {vy = -1 } } } } }
On ne fait jamais ça. Déjà quand tu utilises les accolades, faut indenter pour qu'il y ai un minimum de lisibilité. Ensuite imbriquer des if ça ne sert qu'a rendre le code moche, il y a and ou && pour tester plusieurs conditions: if(place_meeting(x,y,obj_water) && keyboard_check(vk_space) && nage_time > 8 && tripleJump == 0 && place_meeting(x,y-5,obj_water)) { vy = -1 }
Pour ce qui est du bug du saut, a premiere vue le soucis est lié a nage_time, car si tu enlèves la condition nage_time >= 6, tout fonctionne. |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 17:22 | |
| Merci beaucoup d'avoir jeter un coup d'oeil , Je savais que c'était y += vy qui créait le bug cependant il n'y à pas de problème si je mets !place_meeting je crois. En tout cas j'ai mis des if comme ça parce que j'avais lu que mettre des && était plus lent (habituellement je ne mets pas d'accolades s'il n'y a pas plusieurs choses à éxecuter d'un coup) mais je voulais juste vérifier que justement il n'y avait pas de problèmes avec ça. Et en fait j'ai fait exprès de mettre nage_time parce que je ne veut pas que le joueur puisse sauter dès qu'il touche la surface de l'eau. Mais il n'y a que toi qui aide les débutants ?? |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 18:19 | |
| Les if imbriqués ne sont plus rapide que si: 1- Les conditions sont placés dans l'ordre croissant du coût en calculs (la fonction la plus coûteuse doit toujours être la dernière testée) 2- Une des conditions est une fonction/calcul coûteux
Dans tous les cas, il est très rare de se retrouver avec une condition qui soit lourde au point de sacrifier la syntaxe pour les performances. Alors a moins d'être dans plusieurs boucles imbriquées, et d'avoir des conditions coûteuses, ça ne sert a rien (car faire un if est aussi coûteux que de calculer un and avec une condition légère).
Pis bon c'est une bonne habitude a avoir de ne pas imbriquer les if, car dans 99% des langages les if exécutent les conditions de manière paresseuse (donc ils les optimisent a notre place en gros).
Sinon j'imagine bien que nage_time n'est pas la pour faire joli, mais dans tous les cas il ne doit pas être synchronisé comme il faut avec le bloc que tu tentes d’exécuter, étant donné que si tu l’enlèves de la condition tout marche bien.
|
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 18:26 | |
| Je vais rendre mon code plus propre alors... Mais comment faudrait-il utiliser nage_time alors (je n'arrive pas ) ? |
|
| |
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 18:42 | |
| Je viens de re regarder l'erreur est toute bête en fait:
..&& !place_meeting(x,y-vy,obj_water)
Sauf que quand tu testes ça, le joueur va vers le haut, donc vy est < 0, donc y-vy donne une valeur style y--valeur (donc ça deviens un plus, et ça check sous le joueur et non pas au dessus)
La solution: .. && vy < 0 && !place_meeting(x,y+vy,obj_water) |
|
| |
Bobstone Débutant
Messages : 20
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 18:45 | |
| MERCI ! Et c'est vrai que l'erreur est idiote |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: [Résolu] Problème avec la physique Jeu 20 Aoû 2015 - 19:11 | |
| Petite précision quand tu fais un if avec des &&, il s'arrête dès qu'une des conditions est fausse. Du coup même si le dernier truc à vérifier est lourd, pas besoin de faire un autre if imbriqué, suffit juste de le place en dernier, il sera exécuté que si toutes les conditions précédentes sont vérifiées. GM le fait et pleins d'autres langages même relativement basiques. Le seul langage qui fait pas ca que je connaisse c'est le sur les calculatrices TI (et ca fait bien *****). _________________ Je suis partie sur les ailes du vent et la tempête m'a ramenée.
|
|
| |
Contenu sponsorisé
| Sujet: Re: [Résolu] Problème avec la physique | |
| |
|
| |
| [Résolu] Problème avec la physique | |
|