我正在开发一款 Windows 10 2D 棋盘游戏,它有时会产生连锁反应,其中 144 个移动物体可以与 36 个非移动物体发生碰撞。这是“最坏”的可能情况。
每个移动的游戏对象都是由一些不移动的游戏对象创建的。不动的游戏物体“射”出移动的游戏物体,当它们与其他不动的游戏物体碰撞时会发生一些事情:)
我正在使用情节提要移动 XAML 对象 (UserControls),并基于 CompositionTarget.Rendering 检查与游戏循环的冲突。
在我的电脑上一切都很好,但是当我试图在手机上产生这种效果时会出现问题。
我的游戏循环如下所示:
foreach (var movingGameObject in GameCanvas.Children.OfType<MovingGameObect>())
{
if (movingGameObject.Visibility == Visibility.Visible)
CheckCollision(movingGameObject);
}
CheckCollision 方法如下所示:
var left = Canvas.GetLeft(movingGameObject);
var top = Canvas.GetTop(movingGameObject);
var right = left + movingGameObject.Width;
var bottom = top + movingGameObject.Height;
// If left Canvas - remove
if (left <= 0 || right >= GameCanvas.ActualWidth || top <= 0 || bottom >= GameCanvas.ActualHeight)
{
RemoveMovingGameObject(movingGameObject);
return;
}
else
{
// Since it can go 4 ways - I check if it moves up, down, right or left
if (movingGameObject.Way == Way.Left)
{
for (/* this is being done max 5 times, I checked it. It gets every possible game object id that may be on the way of moving game object */)
{
if (this._gameObjects[i].IntersectsWith(movingGameObject))
{
RemoveMovingGameObject(movingGameObject);
GameObjectHit(this._gameObjects[i], null);
return;
}
}
}
else if (movingGameObject.Way == Way.Right)
{
//SAME HERE
}
// SAME FOR UP and DOWN
}
GameObjectHit 方法检查非移动游戏对象是否必须射击另一个移动游戏对象等。所以当这是非常糟糕的场景时,游戏循环迭代必须检查碰撞,有时会产生另一个移动对象并射击它(它们) .
和 IntersectsWith 方法:
var x1 = Canvas.GetLeft(this);
var y1 = Canvas.GetTop(this);
var r1 = new Rect(x1, y1, this.ActualWidth, this.ActualHeight);
var x2 = Canvas.GetLeft(mgo2);
var y2 = Canvas.GetTop(mgo2);
var r2 = new Rect(x2, y2, mgo2.ActualWidth, mgo2.ActualHeight);
r1.Intersect(r2);
if (!r1.IsEmpty)
return true;
else
return false;`
哦,差点忘了。手机上发生了什么?游戏循环被调用的次数不够多,并且它检查碰撞的速度不够快(移动的物体只是飞过不移动的物体)。
我尽我所能来安排一场表演。我知道 Windows 10 Mobile 处于 beta 版本,它会更快,但是当它变热时,gameloop 每秒被调用约 2 次,所以这不是系统故障。