Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

C# анимация, помогите

405  
Yustus завсегдатай05.03.18 17:19
Yustus
05.03.18 17:19 

Всем привет, хотел сделать анимацию шарика, шарик движется на право когда шарик достигает правого края формы, то он должен двигаться налево,

стоит проверка если не достигает тогда _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();

}

}

}



#1 
GANDJUBAS Ганджубас05.03.18 17:29
GANDJUBAS
NEW 05.03.18 17:29 
в ответ Yustus 05.03.18 17:19

Ну так у Вас постоянно проверяются координаты на x != 400

то есть ряд у Вас такой 20, 30, ... , 390, 400, 390, 400, 390, 400

#2 
Yustus завсегдатай05.03.18 17:43
Yustus
NEW 05.03.18 17:43 
в ответ GANDJUBAS 05.03.18 17:29

ну да пока x не равен 400 x+= 10

#3 
Murr_0002 знакомое лицо05.03.18 17:53
Murr_0002
NEW 05.03.18 17:53 
в ответ Yustus 05.03.18 17:19

Первое, чтобы Я сделал с кодом - вынес бы все используемые константы из функций.


Второе, добавил бы переменную Направление


Третье, написал бы две функции проверки условий - ДостигЛевогоКрая и ДостигПравогоКрая (если будет нужно - ...Верха и ...Низа)


Четвертое, не пересчитывал координаты по результатам проверки, а пересчитывал величину шага, координаты всегда пересчитаются в конце и одинаково х += шагХ; у += шагУ;

#4 
Murr_0002 знакомое лицо05.03.18 17:54
Murr_0002
NEW 05.03.18 17:54 
в ответ Yustus 05.03.18 17:43

ну да пока x не равен 400 x+= 10

-----

А когда равен? А вдруг - больше?

#5 
Yustus завсегдатай05.03.18 18:12
Yustus
NEW 05.03.18 18:12 
в ответ Murr_0002 05.03.18 17:54

больше не может быть. край формы 400

#6 
Murr_0002 знакомое лицо05.03.18 18:18
Murr_0002
NEW 05.03.18 18:18 
в ответ Yustus 05.03.18 18:12
Yustus завсегдатай05.03.18 18:27
Yustus
NEW 05.03.18 18:27 
в ответ Murr_0002 05.03.18 18:18

public _x то же самое

#8 
Wanderer_ посетитель05.03.18 20:31
NEW 05.03.18 20:31 
в ответ Yustus 05.03.18 17:43
ну да пока x не равен 400 x+= 10

Так GANDJUBAS об этом и пишет. Как Вы только достигаете первый раз значения х=400, то координата х у вас получает значения попеременно 390, 400, 390 ,400 и т.д. в вашем таймере.

#9 
Yustus завсегдатай05.03.18 22:43
Yustus
NEW 05.03.18 22:43 
в ответ Wanderer_ 05.03.18 20:31

а как ето исправить ?

#10 
Murr_0002 знакомое лицо06.03.18 00:00
Murr_0002
NEW 06.03.18 00:00 
в ответ Yustus 05.03.18 22:43

#4?

#11 
dymanoid знакомое лицо06.03.18 00:17
dymanoid
NEW 06.03.18 00:17 
в ответ Yustus 05.03.18 17:19

Хоспаде, я думал, тут интересная тема какая про WPF анимации, кейфреймы и прочие вкусности. А тут x+=10...

#12 
  moose старожил06.03.18 11:56
NEW 06.03.18 11:56 
в ответ Yustus 05.03.18 22:43
    _x = 20;
    _y = 20;
    _direction_right = true;
...
    if (_direction_right){
        if (_x < 400) {
            _x += 10;
        } else {
            _x -= 10;
            _direction_right = false;
        }
    } else {
// аналогично

...
    }
#13 
GANDJUBAS Ганджубас06.03.18 15:36
GANDJUBAS
NEW 06.03.18 15:36 
в ответ moose 06.03.18 11:56

Отвратительный код! Добавить еще несколько условий в задачу и будет нечитаемая простыня из условий и повторяющихся операция.

Это называется "индусский код".

#14 
  moose старожил06.03.18 21:10
NEW 06.03.18 21:10 
в ответ GANDJUBAS 06.03.18 15:36

пиздануть что-нибудь такое - проще простого. вопрос был "как исправить", я предложил с намиеньшими изменениями. а вы где были с предложениями "прекрасного кода", когда писали ваш первый пост? конечно, проще посоветовать "учиться, учиться, учиться!". хотите предложить ваш вариант - милости просим! только с предложениями конкретными "по существу заданных вопросов", а не что-нибудь с ваших заоблаков.

#15 
MrSanders старожил07.03.18 08:23
NEW 07.03.18 08:23 
в ответ moose 06.03.18 11:56

Ну, например такой код не сильно индусский. Короче и без повторений.

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;
}
#16 
Murr патриот07.03.18 09:51
Murr
NEW 07.03.18 09:51 
в ответ MrSanders 07.03.18 08:23

такой код

-----

Нее, не то...

Полную постановку задачи пока не показали, но в исходном коде есть упоминания об У.

Так что получается 4-ре комплексных выражения проверки, но лучше оформить в функции,

две из которых элементарно возвращают Фалсе...


speed_x = -speed_x;

-----

Тоже не Ах...

Учитывая - У - изменение координат не будет просто изменением знака.

Так что - еще пара функций... даже если сейчас функция будет вырожденной до изменения

знака.


Делал как-то что-то похожее... только координат было немного больше двух.

Сидел, пыхтел... матюклался... и нефига не выходило...

Не выходило до тех пор, пока не отделил логику проверки от вычисления условий...


П.С. ТС точно не нужен готовый код - либо сам допрет, либо не его работа...

#17 
  moose старожил07.03.18 11:27
NEW 07.03.18 11:27 
в ответ MrSanders 07.03.18 08:23, Последний раз изменено 07.03.18 11:27 (moose)

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

#18 
MrSanders старожил07.03.18 18:07
NEW 07.03.18 18:07 
в ответ moose 07.03.18 11:27

Иногда лучше все выбросить и написать заново. Ну и в качестве примера - чтобы ТС было видно в какую сторону расти.

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

#19 
  beatus свой человек14.03.18 21:25
beatus
NEW 14.03.18 21:25 
в ответ MrSanders 07.03.18 18:07
SQL в абстрактном классе похлеще будет 🙈🙉🙊 Чувак на Боше работал 😆
#20