C# - "Pong Game" - 与桨边缘发生碰撞



我不知道当击中球拍的顶部或底部时如何让球反弹,我的问题是球穿过球拍然后继续前进......

所以

这是代码,有些东西是用我的语言写的,所以这里是翻译器:

穆斯特克 = 桨

麦克风 = 球

正文 = 点

HraciPole = 图形数组的名称,类似于"GameArray"

Casovac = 计时器的名称

科利兹 = 碰撞

PohybDolu = MoveUp (bool)

PohybNahoru = 向下移动(布尔值)

public partial class Form_Pong : Form
{
    public static Mustek p1 = new Mustek();
    public static Mustek p2 = new Mustek();
    public static Mic ball = new Mic();
    public int body1 = 0;
    public int body2 = 0;
    Graphics draw;
    public Form_Pong()
    {
        InitializeComponent();
        draw = picBoxHraciPole.CreateGraphics();            
    }
    public static void Draw(Graphics draw)
    {
        draw.Clear(Color.Black);
        draw.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(p1.location, p1.size));
        draw.FillRectangle(new SolidBrush(Color.Red), new Rectangle(p2.location, p2.size));
        draw.FillRectangle(new SolidBrush(Color.White), new Rectangle(ball.location, ball.size));            
    }
    private void casovac_Tick(object sender, EventArgs e)
    {
        if (casovac.Interval == 10)
        {
            p1.location.X = 30;
            p1.location.Y = (picBoxHraciPole.Height - p1.size.Height) / 2;
            p2.location.X = (picBoxHraciPole.Width - p2.size.Width) - 30;
            p2.location.Y = p1.location.Y;
            ball.location = new Point(picBoxHraciPole.Width / 2, picBoxHraciPole.Height / 2);
            casovac.Interval = 5;
        }
        Kolize();
        Pohyb();
        Draw(draw);
    }
    public void Kolize()
    {
        if (p1.location.Y < 0)
        {
            p1.location.Y = 0;
        }
        if (p1.location.Y + p1.size.Height > picBoxHraciPole.Height)
        {
            p1.location.Y = picBoxHraciPole.Height - p1.size.Height;
        }
        if (p2.location.Y < 0)
        {
            p2.location.Y = 0;
        }
        if (p2.location.Y + p2.size.Height > picBoxHraciPole.Height)
        {
            p2.location.Y = picBoxHraciPole.Height - p2.size.Height;
        }
        if (ball.location.Y < 0)
        {
            ball.speed.Y = -ball.speed.Y;
        }
        if (ball.location.Y + ball.size.Height > picBoxHraciPole.Height)
        {
            ball.speed.Y = -ball.speed.Y;
        }
        if (ball.location.X < 0)
        {
            body2 += 1;
            labelBody2.Text = body2.ToString();
            Reset();
        }
        if (ball.location.X + ball.size.Width > picBoxHraciPole.Width)
        {
            body1 +=1;
            labelBody1.Text = body1.ToString();
            Reset();
        }
        if (new Rectangle(ball.location, ball.size).IntersectsWith(new Rectangle(p1.location, p1.size)) ||
            new Rectangle(ball.location, ball.size).IntersectsWith(new Rectangle(p2.location, p2.size)))
        {
            ball.speed.X = -ball.speed.X;
        }
        if (new Rectangle(ball.location, ball.size).IntersectsWith(new Rectangle(p1.location, p1.size)) ||
            new Rectangle(ball.location, ball.size).IntersectsWith(new Rectangle(p2.location, p2.size)))
        {
        }
    }
    public void Reset()
    {
        ball.location = new Point(picBoxHraciPole.Width / 2, picBoxHraciPole.Height / 2);
        ball.speed.X = -ball.speed.X;
        ball.speed.Y = -ball.speed.Y;
    }
    public static void Pohyb()
    {
        if (p1.PohybNahoru == true)
        {
            p1.location.Y -= 8;
        }
        if (p1.PohybDolu == true)
        {
            p1.location.Y += 6;
        }
        if (p2.PohybNahoru == true)
        {
            p2.location.Y -= 6;
        }
        if (p2.PohybDolu == true)
        {
            p2.location.Y += 6;
        }
        ball.location.X += ball.speed.X;
        ball.location.Y += ball.speed.Y;
    }

    private void Form_Pong_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.W)
        {
            p1.PohybNahoru = true; 
        }
        if (e.KeyCode == Keys.S)
        {
            p1.PohybDolu = true;
        }
        if (e.KeyCode == Keys.Escape)
        {
            Application.Exit();
        }
        if (e.KeyCode == Keys.Up)
        {
            p2.PohybNahoru = true;
        }
        if (e.KeyCode == Keys.Down)
        {
            p2.PohybDolu = true;
        }
        if (e.KeyCode == Keys.F1)
        {
            casovac.Enabled = false;
        }
        if (e.KeyCode == Keys.F2)
        {
            casovac.Enabled = true;
        }
    }
    private void EnableDoubleBuffering()
    {
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
    }

    private void Form_Pong_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.W)
        {
            p1.PohybNahoru = false;
        }
        if (e.KeyCode == Keys.S)
        {
            p1.PohybDolu = false;
        }
        if (e.KeyCode == Keys.Up)
        {
            p2.PohybNahoru = false;
        }
        if (e.KeyCode == Keys.Down)
        {
            p2.PohybDolu = false;
        }
    }
}
public class Mustek
{
    public Point location;
    public Size size;
    public bool PohybNahoru, PohybDolu;
    public int Score;
    public Mustek()
    {
        Score = 0;
        size.Width = 25;
        size.Height = 125;
    }
}
public class Mic
{
    public Point location;
    public Size size;
    public Point speed;
    public Mic()
    {
        speed.X = -5;
        speed.Y = 5;
        this.size.Width = 25;
        this.size.Height = 25;
    }
}

您正在寻找的基本逻辑是如果球的边缘=球拍的边缘,那么改变方向,就好像x正在减少弓x是增加的一样一旦你有了这个,你就可以为不同的条件计算出角度,比如它是否给了桨的边缘等。

相关内容

  • 没有找到相关文章

最新更新