简体   繁体   English

突破游戏(C#)-蝙蝠碰撞问题

[英]Breakout Game (C#) - Bat Collision Issue

I am currently creating a Breakout game in C# and I am having a problem with my bat collision. 我目前正在用C#创建一个Breakout游戏,但蝙蝠碰撞有问题。 When I go to hit the ball with the bat, the ball is getting caught on the bat and isn't being hit correctly. 当我用球拍击球时,球被球拍卡住,没有被正确击中。 Quite hard to explain, but I was wondering if anyone could spot a problem in my code that might be causing this. 很难解释,但是我想知道是否有人可以在我的代码中发现可能导致此问题的问题。

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BreakOut_Game
{
    public partial class Form1 : Form
    {
        Graphics paper;
        Pen pen;
        Rectangle ball, bat, brick1, brick2, brick3, brick4, brick5, brick6, brick7, brick8, brick9, brick10;
        Random randomNumber;
        private int ballX, ballY, batX, batY, xChange, yChange;
        public int lives;
        public int score;


        public Form1()
        {
            InitializeComponent();

            paper = picMainGame.CreateGraphics();

            pen = new Pen(Color.Black);
            pen.Width = 2;


            picMainGame.MouseMove += new System.Windows.Forms.MouseEventHandler(picDraw_MouseMove);

            randomNumber = new Random();
            score = 0;

            lblLives.Text = ("Lives: " + lives);
            lblScore.Text = ("Score: " + score);

        }
        private void picDraw_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            {
                batX = e.X;
                batY = e.Y;
            }
        }

        private void drawBat()
        {

            bat = new Rectangle(batX + 10, picMainGame.Height - 30, 40, 12);
            paper.DrawRectangle(pen, bat);
            paper.FillRectangle(Brushes.Black, bat);
        }



        public void drawBall()
        {
            pen = new Pen(Color.Black);
            ball = new Rectangle(ballX, ballY, 8, 8);
            paper.DrawEllipse(pen, ball);
            paper.FillEllipse(Brushes.Black, ball);
        }

        public void moveBall()
        {

            ballX = ballX + xChange;
            ballY = ballY + yChange;

            if ((ballX >= picMainGame.Width) || (ballX <= 0))
                xChange = -xChange;

            if (ballY <= 0)
                yChange = -yChange;

            if ((ballX >= (batX - 25)) && (ballX <= (batX + 25)) && (ballY >= (picMainGame.Height - 30)))

            if (ballY >= picMainGame.Height)
      {
          lives = lives - 1;
          lblLives.Text = Convert.ToString(lives);
          timer1.Enabled = false;

          btnLaunch.Enabled = true;

      }
 }

        public void createBricks()
        {
            brick1 = new Rectangle(25, 3, 50, 10);
            brick2 = new Rectangle(76, 3, 50, 10);
            brick3 = new Rectangle(127, 3, 50, 10);
            brick4 = new Rectangle(178, 3, 50, 10);
            brick5 = new Rectangle(229, 3, 50, 10);
            brick6 = new Rectangle(280, 3, 50, 10);
            brick7 = new Rectangle(331, 3, 50, 10);
            brick8 = new Rectangle(382, 3, 50, 10);
            brick9 = new Rectangle(433, 3, 50, 10);
            brick10 = new Rectangle(484, 3, 50, 10);

        }

        public void drawBricks()
        {
            paper.DrawRectangle(Pens.Black, brick1);
            paper.FillRectangle(Brushes.Black, brick1);
            paper.DrawRectangle(Pens.White, brick2);
            paper.FillRectangle(Brushes.White, brick2);
            paper.DrawRectangle(Pens.Red, brick3);
            paper.FillRectangle(Brushes.Red, brick3);
            paper.DrawRectangle(Pens.Blue, brick4);
            paper.FillRectangle(Brushes.Blue, brick4);
            paper.DrawRectangle(Pens.Green, brick5);
            paper.FillRectangle(Brushes.Green, brick5);
            paper.DrawRectangle(Pens.Yellow, brick6);
            paper.FillRectangle(Brushes.Yellow, brick6);
            paper.DrawRectangle(Pens.Black, brick7);
            paper.FillRectangle(Brushes.Black, brick7);
            paper.DrawRectangle(Pens.Green, brick8);
            paper.FillRectangle(Brushes.Green, brick8);
            paper.DrawRectangle(Pens.Red, brick9);
            paper.FillRectangle(Brushes.Red, brick9);
            paper.DrawRectangle(Pens.Blue, brick10);
            paper.FillRectangle(Brushes.Blue, brick10);

        }

        private void checkBatCollision()
        {
            if (ball.IntersectsWith(bat))
            {
                xChange = -xChange;
                yChange = -yChange;
            }
        }


      public void checkCollision()
    {

        if (ball.IntersectsWith(brick1))
        {
            brick1 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;
        }

        if (ball.IntersectsWith(brick2))
        {
            brick2 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick3))
        {
            brick3 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick4))
        {
            brick4 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick5))
        {
            brick5 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick6))
        {
            brick6 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick7))
        {
            brick7 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick8))
        {
            brick8 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick9))
        {
            brick9 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }

        if (ball.IntersectsWith(brick10))
        {
            brick10 = new Rectangle(0, 0, 0, 0);
            score = score + 10;
            yChange = -yChange;     
        }


       }


        private void picMainGame_Click(object sender, EventArgs e)
        {

        }

        private void btnCredit_Click(object sender, EventArgs e)
        {
            if (lives == 0)
            {
                lives = lives + 5;
                lblLives.Text = Convert.ToString(lives);

                btnCredit.Enabled = false;
            }
        }

        private void btnDisplayBricks_Click(object sender, EventArgs e)
        {
            if (lives == 0)
            {
                MessageBox.Show("Insert Credit to play!");
            }
            else
            {

                createBricks();
                drawBricks();
                btnLaunch.Enabled = true;

            }
        }

        private void btnLaunch_Click(object sender, EventArgs e)
        {
            ballX = 100;
            ballY = 150;

            xChange = -7;
            yChange = -7;


            timer1.Enabled = true;

        }

        private void btnPause_Click(object sender, EventArgs e)
        {
            if (timer1.Enabled == false)
                timer1.Enabled = true;

            else
            {
                timer1.Enabled = false;

            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            paper.Clear(Color.Silver);
            drawBat();
            drawBall();
            drawBricks();
            moveBall();
            checkBatCollision();
            checkCollision();
            btnLaunch.Enabled = false;
            btnPause.Enabled = true;
            btnDisplayBricks.Enabled = false;
        }

        private void picMainGame_Click_1(object sender, EventArgs e)
        {

        }
    }

}

So many things. 这么多的事情。

Wouldn't it be easier to represent the ball and bricks in memory and then draw the representation of its state at intervals? 在内存中表示球和砖块,然后间隔绘制状态的表示,会更容易吗?

With your current implementation you could also I improve performance by keeping the sprites (balls) as seperate images and just moving them where required. 使用当前的实现,您还可以通过将精灵(球)保持为单独的图像并将其仅移动到需要的位置来提高性能。

Drawing everything on a single plain only helps if number of sprites / balls are very large. 如果子画面/球的数量很大,则在单个平面上绘制所有内容只会有所帮助。

There are various other problems which also attribute to your error such as the size of the element vs its size on screen hence where the representation helps to achieve resolution scaling. 还有许多其他问题也归因于您的错误,例如元素的大小与屏幕上的大小,因此表示有助于实现分辨率缩放。

Hopefully that helps 希望有帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM