2012-05-01 61 views
0

我需要在这里实现碰撞检测。我在这里的对象是一个球/圆和矩形。球正在垂直移动,而矩形正在水平移动。条件是,如果球和矩形相互接触,则应提高事件。我一直试图与我的同事一起这样做,但没有成功。这是我在C#中的第一个程序,所以请耐心等待。 这里是我的代码:圆和半径之间的碰撞

public partial class Form1 : Form 
{ 
    bool collided = false; 


    Player player; 
    List<Ball> balls; 
    const int fps = 60; 
    public Form1() 
    { 
     InitializeComponent(); 

     balls = new List<Ball>(); 
     Random r = new Random(); 

     for(int i =0; i<1;i ++) 
     { 
      balls.Add(new Ball(Width, Height,r)); 
     } 

     var task = new Task(Run); 
     task.Start(); 

     player = new Player() 
     { 
      x = this.Width/2, 
      y = (Height*9/10), 

      xvel = 10, 
      brush = Brushes.Black, 
     }; 

    } 

    protected void Run() 
    { 
     while (true) 
     { 
      for(int i = 0; i < balls.Count; i++) 
      { 
       balls[i].Move(this.Width);      
      } 
      this.Invalidate(); 
      Thread.Sleep(1000/fps); 

     } 
    } 


    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     g.Clear(Color.White); 
     for(int i = 0; i < balls.Count; i++) 
     {    
      balls[i].Draw(g);    
     }    
     player.DrawPlayer(g);  

    } 

//This is the part where i was trying to check collision between the circle and a ball 
    private void CheckCollision(PaintEventArgs e) 
    { 

     if (player.IntersectsWith(balls)) 
     { 
      player.Intersect(balls); 
      if (!player.IsEmpty) 
      { 
       collided = true; 
       MessageBox.Show("collision detected"); 
      } 
     } 
    }   
} 



public class Player 
{   
    public float x, y, xvel; 
    public Brush brush; 

    public Player() 
    { 

    } 

    public void DrawPlayer(Graphics g) 
    { 
     g.FillRectangle(brush, new RectangleF(x, y, 30,30));  
    } 

    public void MovePlayerLeft(int gameWidth) 
    { 
     if (x > 0) 
     { 
      x -= xvel; 
     } 
    } 
    public void MovePlayerRight(int gameWidth) 
    {    
     if (x < gameWidth-47) 
     { 
      x += xvel; 
     } 
    }  
} 

public class Ball 
{ 

    public float x, y, yvel, radius; 
    public Brush brush; 
    public Ball(int gamewidth,int gameHeight,Random r)   

    { 

     x = r.Next(gamewidth); 
     y = r.Next(gameHeight); 

     yvel = r.Next(2) + 5; 

     radius = r.Next(10) + 5; 
     brush = new SolidBrush(Color.Blue); 

    } 

    public void Move(int gameHeight) 

    {     
     if (y + radius >= gameHeight) 
     { 
      y = 0;    
     } 
     y += yvel; 


    } 


    public void Draw(Graphics g) 
    { 
     g.FillEllipse(brush, new RectangleF(x-radius,y - radius, radius * 2, radius * 2)); 
    } 


} 
+1

欢迎来到Stack Overflow。我可以问一下 - 问题是什么?我错过了实际的十字路口码吗?如果这不起作用,那么我们需要看到这一点。同样 - 我们可能不需要看到其他所有东西 - 你给我们提供了几个代码墙:) –

+0

你不能检查球的x是否为<= 0 or x > = maxWidthOfScreen和y <= 0 or y > = maxHeightOfScreen? –

+0

你应该试试你自己的勾结,不要让别人写你的代码:) –

回答

1

如果你想找出如果一个矩形和一个圆相交,试试这个算法对每个四边的:

Circle line-segment collision detection algorithm?

你可以通过检查拐角是否在圆内来加速。

另外,请记住,完全在一个矩形内的圆形,反之亦然应该算作碰撞。