Шар не подпрыгивает должным образом на весле / стене - PullRequest
0 голосов
/ 12 июня 2018

Я кодирую игру Pong в C #, и, кажется, что-то не так с несколькими строками кода.Эти строки в коде, чтобы убедиться, что мяч отскакивает в противоположном направлении.Но это на самом деле не работает.Он подпрыгивает, но проходит через края весла.Кроме того, существует проблема, когда мой мяч попадает в правую стену примерно на полпути, прежде чем отскочить в правильном направлении.

if (ball.Location.X > player1.Location.X 
    && ball.Location.X + ball.width < player1.Location.X + player1.Width 
    && ball.Location.Y + ball.Height > player1.Location.Y)

Это должно обеспечить отскок мяча назад от весла, но, как было сказано ранее;это не подпрыгивает на всем весле.Мяч будет проходить прямо через край весла из-за неправильного кодирования в этом предложении, но у меня есть подсказка, как это исправить.Он должен что-то делать с правильным перекрывающимся кодом, когда мяч отскакивает по всей длине весла.

if (ball.Location.X > player2.Location.X 
    && ball.Location.X + ball.Width < player2.Location.X + player2.Width 
    && ball.Location.Y < player2.Location.Y + player2.Height)

Это то же самое с этим предложением.Это проходит через края, что означает, что что-то не так с перекрытием.Что должно произойти из-за некоторых X и Y (включая некоторые Width и Height где-то).

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

if (ball.Location.X + ball.Width > this.Width)

Это должно быть следствием того, что левое местоположение шара (включая его Width) не должно идти дальше всей ширины экрана.где игра ведется в ...

В любом случае, спасибо за чтение.Надеюсь, кто-нибудь сможет мне помочь с этой проблемой.

Это в основном весь мой код

namespace Pong_2
{
    public partial class Form1 : Form
    {
        int playerSpeed = 7;
        int p1Vel;
        int p2Vel;
        int bVelX = 1;
        int bVelY = 1;
        int scorePlayer1Int;
        int scorePlayer2Int;
        bool pause = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (!pause)
            {
            ball.Location = new Point(ball.Location.X + bVelX, ball.Location.Y + bVelY);
            player1.Location = new Point(player1.Location.X + p1Vel, player1.Location.Y);
            player2.Location = new Point(player2.Location.X + p2Vel, player2.Location.Y);
            }
            if (ball.Location.Y < 0)
            {
            scorePlayer1Int++;
            ball.Location = new Point(this.Width / 2, this.Height / 2);
            }
            if (ball.Location.Y > this.Height)
            {
            scorePlayer2Int++;
            ball.Location = new Point(this.Width / 2, this.Height / 2);
            }
            if (ball.Location.X > player1.Location.X && ball.Location.X + ball.Width < player1.Location.X + player1.Width && ball.Location.Y + ball.Height > player1.Location.Y)
            {
            bVelY *= -1;
            }
            if (ball.Location.X > player2.Location.X && ball.Location.X + ball.Width < player2.Location.X + player2.Width && ball.Location.Y < player2.Location.Y + player2.Height)
            {
            bVelY *= -1;
            }
            if (ball.Location.X < 0)
            {
            bVelX *= -1;
            }
            if (ball.Location.X + ball.Width > 984)
            {
            bVelX *= -1;
            }
            scorePlayer1.Text = scorePlayer1Int.ToString();
            scorePlayer2.Text = scorePlayer2Int.ToString();
        }
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Right)
            {
                p1Vel = 0;
            }
            else if (e.KeyCode == Keys.Left)
            {
                p1Vel = 0;
            }
            else if (e.KeyCode == Keys.D)
            {
                p2Vel = 0;
            }
            else if (e.KeyCode == Keys.A)
            {
                p2Vel = 0;
            }
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Right)
            {
                p1Vel = playerSpeed;
            }
            else if (e.KeyCode == Keys.Left)
            {
                p1Vel = -playerSpeed;
            }
            else if (e.KeyCode == Keys.D)
            {
                p2Vel = playerSpeed;
            }
            else if (e.KeyCode == Keys.A)
            {
                p2Vel = -playerSpeed;
            }
            else if (e.KeyCode == Keys.P)
            {
                if (!pause)
                {
                    pause = true;
                }
                else if (pause)
                {
                    pause = false;
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 12 июня 2018

Наиболее вероятная причина этой проблемы - расстояние, на которое шарик перемещается между кадрами.Если ваш мяч движется с достаточно высокой скоростью в каждом кадре, вероятность того, что столкновение будет обнаружено только после того, как мяч окажется внутри другого объекта.

Если ваш мяч движется со скоростью 100 пикселей в секунду, а вы рисуете 10 кадров в секунду, мяч будет прыгать по 10 пикселей за раз.Если левая стена находится на 0, а предыдущая X шара была на 5, то в следующем кадре мяч будет -5.При достаточно высоких скоростях и достаточно низкой частоте кадров объекты могут даже проходить сквозь друг друга, не сталкиваясь.

Решение этой проблемы непросто, для вычисления точной точки столкновения требуется сложная математика.последний и текущий кадры.Если у вас много объектов, это может дорого подсчитать и замедлить вашу игру.Многие игры используют простое обнаружение столкновений, используя ограничивающие рамки, чтобы инициировать более дорогие вычисления в качестве оптимизации.

К сожалению, я нахожусь в месте, где есть фильтр, который не позволяет мне просматривать сайты, связанные с игрой, ( кашель ) работает ( кашель ), но этоТип обнаружения столкновений обычно используется для таких вещей, как пули.Вы должны быть в состоянии найти что-то в Интернете, выполняя поиск по этим типам терминов.Я обновлю этот ответ, как только доберусь куда-нибудь с открытым интернетом.


Обновление

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

Ответ на этот вопрос также может быть полезным.

...