1
Général / Physique de saut
« le: Avril 07, 2016, 11:58:51 am »
Salut à tous, je viens vers vous car comme mon titre l'indique j'ai un soucis avec la physique d'un saut 2D.
J'aime bien comprendre quand j'utilise quelques choses donc j'ai commencé à me remémorer mes cours sur la loi de newton.
https://www.kartable.fr/terminale-s/physique-chimie/specifique/chapitres-33/applications-des-lois-de-newton/cours/applications-des-lois-de-newton/22620
Dans ce cours, pour les équations horaires du mouvement on obtient ce système :
OG⎯→{ x(t)=0
{ y(t)=v0⋅cos(α)⋅t
{ z(t)=−12⋅g⋅t2+v0⋅sin(α)⋅t
Dans le jeu la fonction y(t) correspond à l'axe x et z(t) correspond à l'axe y.
J'ai donc simuler un petit saut, voici le code:
Le soucis c'est que mon personnage monte bien mais il ne redescend jamais ou alors il redescendra dans quelques décennie.
Je ne vois pas trop d'ou peut venir ce soucis, j'ai mis l'incrémentation de t avec des valeurs très petite pour avoir le temps de bien voir la trajectoire.
Si quelqu'un pourrait m'aiguiller sur ce sujet, merci d'avance !
J'aime bien comprendre quand j'utilise quelques choses donc j'ai commencé à me remémorer mes cours sur la loi de newton.
https://www.kartable.fr/terminale-s/physique-chimie/specifique/chapitres-33/applications-des-lois-de-newton/cours/applications-des-lois-de-newton/22620
Dans ce cours, pour les équations horaires du mouvement on obtient ce système :
OG⎯→{ x(t)=0
{ y(t)=v0⋅cos(α)⋅t
{ z(t)=−12⋅g⋅t2+v0⋅sin(α)⋅t
Dans le jeu la fonction y(t) correspond à l'axe x et z(t) correspond à l'axe y.
J'ai donc simuler un petit saut, voici le code:
void Game::play()
{
gState = GAME_STATE::G_RUNNING;
Map map;
map.load(".\\Data\\Map\\level.map", "tile");
Character player(sf::Vector2f(0, 0), "player");
player.setCenter();
int v_init = 2;
int angle_init = Utils::pi / 3;
float t = 0;
while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
{
sf::Event event;
while (getWindow().pollEvent(event))
{
if (event.type == sf::Event::Closed)
getWindow().close();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
{
gState = GAME_STATE::G_PAUSED;
break;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
getView().move(3, 0);
}
sf::Vector2f jump;
jump.x = cos(angle_init) * v_init * t;
jump.y = -0.5 * Utils::g*pow(t, 2) + v_init*sin(angle_init)*t;
getView().move(jump);
t += 0.001;
getWindow().clear(sf::Color::Black);
getWindow().setView(getView());
getWindow().draw(map);
getWindow().setView(getWindow().getDefaultView());
getWindow().draw(player);
getWindow().display();
}
}
{
gState = GAME_STATE::G_RUNNING;
Map map;
map.load(".\\Data\\Map\\level.map", "tile");
Character player(sf::Vector2f(0, 0), "player");
player.setCenter();
int v_init = 2;
int angle_init = Utils::pi / 3;
float t = 0;
while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
{
sf::Event event;
while (getWindow().pollEvent(event))
{
if (event.type == sf::Event::Closed)
getWindow().close();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
{
gState = GAME_STATE::G_PAUSED;
break;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
getView().move(3, 0);
}
sf::Vector2f jump;
jump.x = cos(angle_init) * v_init * t;
jump.y = -0.5 * Utils::g*pow(t, 2) + v_init*sin(angle_init)*t;
getView().move(jump);
t += 0.001;
getWindow().clear(sf::Color::Black);
getWindow().setView(getView());
getWindow().draw(map);
getWindow().setView(getWindow().getDefaultView());
getWindow().draw(player);
getWindow().display();
}
}
Le soucis c'est que mon personnage monte bien mais il ne redescend jamais ou alors il redescendra dans quelques décennie.
Je ne vois pas trop d'ou peut venir ce soucis, j'ai mis l'incrémentation de t avec des valeurs très petite pour avoir le temps de bien voir la trajectoire.
Si quelqu'un pourrait m'aiguiller sur ce sujet, merci d'avance !