碰撞检测和停止运动

时间:2016-08-29 14:52:23

标签: c# .net collision

我正在做一个简单的游戏。我设法让我的角色用箭头键和火来移动。我在地图上添加了一些墙,这些墙是图片框。我设法检测到这样的碰撞:

private void timer6_Tick(object sender, EventArgs e){
    foreach (PictureBox pic in brick){
        if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)){
            Console.WriteLine("Colision!");
            switch (rotation){
                case "up":
                    canup = false;
                    candown = true;
                    canleft = true;
                    canright = true;
                    break;
                case "down":
                    canup = true;
                    candown = false;
                    canleft = true;
                    canright = true;
                    break;
                case "left":
                    candown = true;
                    canup = true;
                    canleft = false;
                    canright = true;
                    break;
                case "right":
                    candown = true;
                    canup = true;
                    canleft = true;
                    canright = false;
                    break;
             }
        }
        else
        {
            Console.WriteLine("No colision?!");
        }
    }
}

它按预期工作但是当我击中物体(墙壁)时,我得到了" Colision!"如果没有回声,这也会在发生碰撞时停止角色朝向的方向移动。事情是,当我退出碰撞时,其中一个bools保持为假,这会阻止我的角色再次沿同一方向移动。我尝试在else分支中将所有这些bool设置为true但是因为即使存在碰撞也有五个墙,否则分支从5中执行4次。我需要某种"任何"用于检查某一时刻是否有任何墙壁被击中的情况。

3 个答案:

答案 0 :(得分:1)

我不是100%肯定你会得到什么,但我认为这可能会有所帮助:

canup = true;
candown = true;
canleft = true;
canright = true;
foreach (PictureBox pic in brick)
{
    if (pic.Bounds.IntersectsWith(pb_sprite.Bounds))
    {
        Console.WriteLine("Colision!");
        switch (rotation)
        {
            case "up":
                canup = false;
                break;
            case "down":
                candown = false;
                break;
            case "left":
                canleft = false;
                break;
            case "right":
                canright = false;
                break;
        }
    }
    else
    {
        Console.WriteLine("No colision?!");
    }
    ...

这会在开始时将所有bool设置为true,并且仅在循环内将各个bool设置为false。

答案 1 :(得分:0)

是否有可能,你只是停止你的角色,但不解决碰撞?毕竟,砖和角色在彼此内部,以触发碰撞。他们需要被移到彼此之外再次无碰撞。

常见的方法是将角色的位置设置为一个框架,或者如果你想更精确,找出角色穿透(͡°͜ʖ͜ʖ°)砖的深度,并沿着方向向后移动它来自那个数额。

答案 2 :(得分:0)

嗯,实际上有一个Any函数(https://msdn.microsoft.com/en-us/library/bb534972(v=vs.110).aspx)。

你可以使用这样的东西:

bool collision = brick.Any(pic => pic.Bounds.IntersectsWith(pb_sprite.Bounds));
switch(rotation)
{
    case "up": 
        canup = !collision;
        break;
    ...
}