我正在做一个简单的游戏。我设法让我的角色用箭头键和火来移动。我在地图上添加了一些墙,这些墙是图片框。我设法检测到这样的碰撞:
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次。我需要某种"任何"用于检查某一时刻是否有任何墙壁被击中的情况。
答案 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;
...
}