Система падения игрока (в основном гравитация) - PullRequest
3 голосов
/ 24 мая 2011

Я делаю игру, похожую на Doodle Jump, чтобы ваш игрок был как можно выше.Теперь мой игрок работает и движется.Но проблема в том, что у меня нет гравитации или чего-то такого, что заставит игрока снова упасть на землю.Ребята, у вас есть идея сделать это?Я пытался заставить игрока получать постоянное усилие, всегда быть сбитым, но это не гладко и не действует как реальное падение.Могу ли я получить какую-нибудь помощь в создании этой системы, которая может привести к падению игрока?

Редактировать:

    GRAVITY = 10;
    TERMINAL_VELOCITY = 300;
    vertical_speed = 0;

    public void fall(){ 
    this.vertical_speed = this.vertical_speed + GRAVITY;
    if(this.vertical_speed > TERMINAL_VELOCITY){
        this.vertical_speed = TERMINAL_VELOCITY;
    }
    this.y = this.y - this.vertical_speed;
}

Я сделал это, но ничего не вышло, стреляет в игрока в воздухе.

Ответы [ 6 ]

7 голосов
/ 24 мая 2011

В реальном мире гравитация будет увеличивать скорость падения на постоянную величину с течением времени (9,8 метра в секунду в секунду ). Вы можете смоделировать это, давая игроку вертикальную скорость (когда он прыгает или падает с платформы), а затем вычитая постоянную величину из этого значения каждый раз вокруг основного игрового цикла, чтобы они ускорялись с течением времени. Вы захотите установить максимальный предел для этого (конечная скорость), в противном случае, когда они упадут, они могут довольно быстро достичь невероятной скорости. Псевдокод будет выглядеть примерно так:

const GRAVITY = 10;
const TERMINAL_VELOCITY = 300;

object Player 
{
    int vertical_speed = 0;
    int vertical_position;  

    function fall ()
    {
        this.vertical_speed = this.vertical_speed + GRAVITY;
        if (this.vertical_speed > TERMINAL_VELOCITY)
        {
            this.vertical_speed = TERMINAL_VELOCITY;
        }
        this.vertical_position = this.vertical_position - this.vertical_speed;
    }
}

РЕДАКТИРОВАТЬ : 9,8 метра в секунду в секунду правильно! Пожалуйста, не редактируйте его! Ускорение измеряется как изменение скорости во времени, выраженное в метрах в секунду в секунду. 9,8 метра в секунду в секунду означает, что через 1 секунду неподвижный объект набрал бы скорость, достаточную для движения со скоростью 9,8 м / с. Через 2 секунды он достигнет скорости 19,6 м / с. Через 3 секунды он достигнет скорости 29,4 м / с и так далее.

Честно говоря, я не верю, что мне пришлось это объяснять.

4 голосов
/ 24 мая 2011

Знаете ли вы формулу гравитации?

velocity = acceleration * time

acceleration - это гравитационное ускорение.

time - это количество прошедшего времени.

Также

distance = 1/2 * acceleration * time**2
1 голос
/ 24 августа 2015

Формула для расчета высоты объекта с гравитацией в любой момент времени выглядит следующим образом:

       g * t ^ 2
s(t) = --------- + v * t + h
           2    

Где s - функция времени (time до height), g - коэффициент гравитации (9,8 для метров), v - исходная скорость вверх, а h - это исходная высота.

0 голосов
/ 03 августа 2017

Исходя из моего опыта, сделайте что-нибудь подобное.

public void run() {
    if(velY+g>TerminalVel) {
        velY=TerminalVel;
    } else {
        velY+=g; 
    }
    y+=velY;
}

Метод run () должен быть в цикле.

0 голосов
/ 24 мая 2011

Вы найдете объяснения и демоверсию на этом сайте .Я также предлагаю вам прочитать книгу по физике или хотя бы какую-нибудь вики-статью о гравитации.

0 голосов
/ 24 мая 2011

Вместо того, чтобы воздействовать на человека постоянной силой, вам нужно заставить человека ускоряться, пока он падает.

Они должны начать падать со скоростью 0. Затем вы должны увеличить силу при их падении.

Для этого вам нужно будет со временем обновлять их скорость:

Примерно так:

if (stillFalling) {
    velocity = velocity + (gravity_constant) * time_interval;
} else {
    velocity = 0;
}

Вы хотите постоянно обновлять скорость.

...