C# анимация, помогите
Всем привет, хотел сделать анимацию шарика, шарик движется на право когда шарик достигает правого края формы, то он должен двигаться налево,
стоит проверка если не достигает тогда _x += 10 если достигает тогда -x -=10. Но тогда его начинает заклинивать. ???
namespace WindowsFormsApplicationBall3
{
public partial class Form1 : Form
{
private int _x;
private int _y;
public Form1()
{
InitializeComponent();
_x = 20;
_y = 20;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
// e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
e.Graphics.FillEllipse(Brushes.GreenYellow, _x, _y, 50, 50);
}
private void timer1_Tick(object sender, EventArgs e)
{
// _x += 10;
// _y += 0;
if (_x != 400)
{
_x += 10;
_y += 0;
}
else
{
_x -= 10;
_y += 0;
}
Invalidate();
}
}
}
Ну так у Вас постоянно проверяются координаты на x != 400
то есть ряд у Вас такой 20, 30, ... , 390, 400, 390, 400, 390, 400
Первое, чтобы Я сделал с кодом - вынес бы все используемые константы из функций.
Второе, добавил бы переменную Направление
Третье, написал бы две функции проверки условий - ДостигЛевогоКрая и ДостигПравогоКрая (если будет нужно - ...Верха и ...Низа)
Четвертое, не пересчитывал координаты по результатам проверки, а пересчитывал величину шага, координаты всегда пересчитаются в конце и одинаково х += шагХ; у += шагУ;
Хоспаде, я думал, тут интересная тема какая про WPF анимации, кейфреймы и прочие вкусности. А тут x+=10...
_x = 20;
_y = 20;
_direction_right = true;
...
if (_direction_right){
if (_x < 400) {
_x += 10;
} else {
_x -= 10;
_direction_right = false;
}
} else {
// аналогично
...
}
Отвратительный код! Добавить еще несколько условий в задачу и будет нечитаемая простыня из условий и повторяющихся операция.
Это называется "индусский код".
пиздануть что-нибудь такое - проще простого. вопрос был "как исправить", я предложил с намиеньшими изменениями. а вы где были с предложениями "прекрасного кода", когда писали ваш первый пост? конечно, проще посоветовать "учиться, учиться, учиться!". хотите предложить ваш вариант - милости просим! только с предложениями конкретными "по существу заданных вопросов", а не что-нибудь с ваших заоблаков.
Ну, например такой код не сильно индусский. Короче и без повторений.
left_limit = 20;
right_limit = 400;
ball_x = 20;
ball_y = 20;
// Как будто мяч только что прилетел справа и ударился в левую стенку, координата мяча = левой стене
speed_x = -10;
while(...){
if(ball_x<=left_limit || ball_x>=right_limit){
// Стукнулись в стену - поменяли направление скорости (с -10 на 10 или наоборот)
speed_x = -speed_x;
}
ball_x = ball_x + speed_x;
}
такой код
-----
Нее, не то...
Полную постановку задачи пока не показали, но в исходном коде есть упоминания об У.
Так что получается 4-ре комплексных выражения проверки, но лучше оформить в функции,
две из которых элементарно возвращают Фалсе...
speed_x = -speed_x;
-----
Тоже не Ах...
Учитывая - У - изменение координат не будет просто изменением знака.
Так что - еще пара функций... даже если сейчас функция будет вырожденной до изменения
знака.
Делал как-то что-то похожее... только координат было немного больше двух.
Сидел, пыхтел... матюклался... и нефига не выходило...
Не выходило до тех пор, пока не отделил логику проверки от вычисления условий...
П.С. ТС точно не нужен готовый код - либо сам допрет, либо не его работа...
безусловно, ваш код лучше. но я бы не назвал это исправить авторский код. это уже называется переписать.
Иногда лучше все выбросить и написать заново. Ну и в качестве примера - чтобы ТС было видно в какую сторону расти.
А то будет как у некоторых моих коллег - до сих пор ничего без глобальных переменных написать не могут. Даже в яве, где их нет.





