我创建了两个矩形,你可以用其中一个移动和跳跃,另一个在Form上静止不动。 我希望障碍物能够作为一个障碍物(或者如果你愿意的话就是一堵墙),基本上我希望可移动的矩形在其右侧与障碍物的左侧碰撞时停止(等等)。
我发现这段代码如何 NOT 检测文章中两个矩形之间的碰撞(因为它显然更容易检测不到碰撞):
OutsideBottom = Rect1.Bottom < Rect2.Top
OutsideTop = Rect1.Top > Rect2.Bottom
OutsideLeft = Rect1.Left > Rect2.Right
OutsideRight = Rect1.Right < Rect2.Left
//or
return NOT (
(Rect1.Bottom < Rect2.Top) OR
(Rect1.Top > Rect2.Bottom) OR
(Rect1.Left > Rect2.Right) OR
(Rect1.Right < Rect2.Left) )
但我不确定如何实现它。我有一个名为“player1.left”的bool,当我按下键盘上的'A'('D'向右移动,'W'跳转)时,它变为真,当为true时,将矩形移动10个像素到left(在Timer_Tick事件中)。
修改
“rect1.IntersectsWith(rect2)”用于检测碰撞。但是如果我想让可移动的矩形停止向右移动(但仍然能够跳跃并向左移动),如果它的右侧与障碍物的左侧碰撞,我将如何使用它(if-statement内应该是什么)一边(等等)?
答案 0 :(得分:1)
// UPDATE 假设你有一个继承自Rectangle的类PlayableCharacter。
public class PlayableCharacter:Rectangle {
//position in a cartesian space
private int _cartesianPositionX;
private int _cartesianPositionY;
//attributes of a rectangle
private int _characterWidth;
private int _characterHeight;
private bool _stopMoving=false;
public PlayableCharacter(int x, int y, int width, int height)
{
this._cartesianPositionX=x;
this._cartesianPositionY=y;
this._chacterWidth=width;
this._characterHeight=height;
}
public bool DetectCollision(PlayableCharacter pc, PlayableCharacter obstacle)
{
// this a test in your method
int x=10;
if (pc.IntersectsWith(obstacle)){
Console.Writeline("The rectangles touched");
_stopMoving=true;
ChangeMovingDirection(x);
StopMoving(x);
}
}
private void ChangeMovingDirection(int x)
{
x*=-1;
cartesianPositionX+=x;
}
private void StopMoving(int x)
{
x=0;
cartesianPositionX+=x;
}
}
在我给你的代码中,在角色向右的情况下,x值为正,角色将面向另一个方向。如果他向左移动,如果他与障碍物碰撞,他将面向另一个方向。
使用StopMoving,即使你创建了一个在循环中随时间运行的脚本,它也永远不会让角色移动。
我认为这应该为你的工作奠定基础。如果有任何问题,请评论我写的解决方案,如果我能够达到目标,我会尽力帮助你。