2016-02-06 2 views
0

Я работаю над 2-й игрой. В нем бананы (picturBox) выпадают из верхней части экрана, и вы должны их поймать, иначе он бьет по земле, и вы теряете очки. Чтобы оживить банан, я меняю его Y-Location с использованием timer, который имеет интервал 5ms (Плавная анимация).Banana Drop - C# Игра

Y-Drop Speed ​​ изменяется на основе разрешения экрана. Поскольку банан перемещается 1px каждые 5ms на базовом разрешении, которое составляет , ему необходимо изменить скорость, чтобы в одно и то же время выполнять различные разрешения.

Код:

private void timer_Tick(object sender, EventArgs e) 
{ 
    double xNanas = nanas.Location.X; 
    double yNanas = nanas.Location.Y; 
    yNanas += 1 * this.Height/720; 
    nanas.Location = new Point((int)xNanas, (int)yNanas); 
    nanas.Refresh(); 
} 

Проблема:

1. При изменении разрешения на небольшое количество напр. 800х600. Двойные обращенные к ИНТ и банан не двигается, даже если (1 * 600/720) округляется является 1.

2. Поскольку скорость всегда округляется время, необходимое для банана, чтобы ударить землю резко меняется! 16,7 на 1920x1080 и 10,6 на 1280x720. Как бы я сделал это так же?

Пробовал:

Изменение интервала, а не скорость. В то же время он все равно не попадает в землю. Я не могу изменить интервал на большое количество, поскольку это делает анимацию изменчивой.

+0

Вам нужно искать время реализации delta – jdphenix

+0

Вы выполняете математику целых чисел. Попробуйте 'yNanas + = 1 * this.Height/720d' – SimpleVar

+0

@SimpleVar Спасибо! Это решило проблему №1, но как насчет проблемы №2? –

ответ

0

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

Простое решение состоит в том, чтобы хранить в классе позиции как удвоенные и делать всю логику в два раза, тогда вы просто бросаете двойник в классе на int после выполнения всех вычислений и устанавливаете его в положение окна изображения, таким образом, двойной будет увеличиваться с одинаковой скоростью независимо от размера экрана.

Вот пример с плавающей точкой логики (достаточно для ваших нужд):

PointF realPosition = PointF.Empty; //Initialize it to the real position of the pb. 

private void timer_Tick(object sender, EventArgs e) 
{ 
    realPosition.Y += 1.0f * this.Height/720.0f; //note the .0f to instruct the compiler these must be float operations 
    nanas.Location = Point.Round(realPosition); 
    nanas.Refresh(); 
} 

Также у вас есть еще один источник ошибки, форма таймеры не точны, если интерфейс занят он будет меняться, это скорость, для реальной игры нормальным является не использование таймера, а цикл и проверка пройденного времени и умножение его на скорость в секундах.

+0

Благодарим вас за ответ, но я не понимаю вашего ответа. Я хочу, чтобы скорость изменилась, потому что, когда разрешение изменяется, скорость должна отразиться на нем, чтобы банан ударился о землю в одно и то же время. –

+0

Да, я понимаю, и в моем посте то, что я говорю, ваше время меняется, потому что делитель имеет десятичные значения, и вы отбрасываете их, потому что в математической логике вы должны использовать двойную логику. – Gusman

+0

Добавлен пример. – Gusman