Как задать точные координаты обьекта c#?

255
02 июля 2018, 00:40

Есть обьект, который двигается, и при прикосновении к стороне окна продолжает движение в другую сторону. Также созданы обьекты(а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;
        }
    }
}
}
Answer 1

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

READ ALSO
Индекс за пределами диапазона C# XPath

Индекс за пределами диапазона C# XPath

При парсе с html информацию, появляется ошибка

248
Npgsql работа с курсором

Npgsql работа с курсором

Как организовать просмотр по 100 записей из таблицы с помощью npgsqlПри просмотре хотелось бы ходить по курсору т

243
роутинг mvc 5 не получается вызвать метод

роутинг mvc 5 не получается вызвать метод

Основные методы моего контроллера вызываются в виде:

236
Иморт базы данных mysql в postgresql

Иморт базы данных mysql в postgresql

Как можно залитьsql базу данных в postgresql под рукой только (windows)

227