Есть обьект, который двигается, и при прикосновении к стороне окна продолжает движение в другую сторону. Также созданы обьекты(а1, а2), слева и справа, которые должны "отбивать" данный обьект, но только если он попадает на их форму. Я написал следующий код, но обьект отбивается от всей линии проведенной вдоль крайней точки а1. Как исправить? Как задать координаты нижнего очертания обьекта а1 и а2?
namespace World
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool leftMove, UpMove;
int i = 0;
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
pb1.Location = new Point(pb1.Location.X, e.Y);
}
private void timer1_Tick(object sender, EventArgs e)
{
pb2.Location = new Point(pb2.Location.X, obj.Location.Y);
if (leftMove)
{
obj.Left += 10;
}
if (!leftMove)
{
obj.Left -= 10;
}
if (UpMove)
{
obj.Top += 10;
}
if (obj.Right >= pb2.Location.X)
{
leftMove = false;
obj.BackColor = Color.MintCream;
}
if (obj.Left <= pb1.Right)
{
lblScore.Text = "Score: " + ++i;
leftMove = true;
obj.BackColor = Color.Purple;
}
if (!UpMove)
{
obj.Top -= 10;
}
if (obj.Left <= ClientRectangle.Left)
{
leftMove = true;
obj.BackColor = Color.BlueViolet;
}
if (obj.Top <= ClientRectangle.Top)
{
UpMove = true;
obj.BackColor = Color.Yellow;
}
if (obj.Right >= ClientRectangle.Right)
{
leftMove = false;
obj.BackColor = Color.Black;
}
if (obj.Bottom >= ClientRectangle.Bottom)
{
UpMove = false;
obj.BackColor = Color.Red;
}
}
}
}
1) Для того, чтобы проверить несколько условий одновременно (а именно, "мячик" попадает в координату X "ракетки" И "мячик" попадает в координату Y "ракетки"), вам необходимо научиться использовать логические операторы "И" и "ИЛИ" (&& и ||). Например, проверка, что мячик отбит правой ракеткой
if(obj.Right >= pb2.Left && obj.Top >= pb2.Top && obj.Bottom <= pb2.Bottom)
{
//Логика изменения направления движения
}
2) Используйте оператор else в подобных конструкциях
if (leftMove)
{
obj.Left += 10;
}
if (!leftMove)
{
obj.Left -= 10;
}
=>
if (leftMove)
{
obj.Left += 10;
}
else
{
obj.Left -= 10;
}
А лучше вообще тернарный оператор
obj.Left += leftMove? 10: -10;
3) Не забывайте, что координаты отсчитываются от левого верхнего угла (а не от правого нижнего, как мы привыкли на математике)
4) С таким, изобилующим if'ами кодом Вы быстро запутаетесь в последовательности проверок, рассмотрите разбиение на методы или комментарии. А также, возможно, используйте оператор return для выхода из метода и НЕ прохождения дальнейших проверок, или else if
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости