[英]C# and SFML game intersection
在2D平台游戲(例如PacMan)中,我的MoveEntity()
方法有問題。 當玩家在交叉路口時,我要進行以下操作:
e.IsAtIntersection = true;
然后調用UpdateDirection()
。
但是他並沒有停下來,而是走過了小路,是否有牆或空的路都沒有關系。 該程序永遠不會到達上述行。 成員保持false
。 也許有可能以更簡單的方式編寫它,或者我犯了一個簡單的錯誤。 這是完整的方法:
private void MoveEntity(Entity e)
{
int angle = 0;
if (e.currentDirection == Direction.RIGHT) angle = 0;
else if (e.currentDirection == Direction.DOWN) angle = 90;
else if (e.currentDirection == Direction.LEFT) angle = 180;
else if (e.currentDirection == Direction.UP) angle = 270;
var scalex = Math.Round(Math.Cos(angle * (Math.PI / 180.0)));
var scaley = Math.Round(Math.Sin(angle * (Math.PI / 180.0)));
var velocityx = (float)(e.Speed * scalex);
var velocityy = (float)(e.Speed * scaley);
Sprite sp = sprites[e.Name];
Vector2f v = new Vector2f(sp.Position.X + velocityx, sp.Position.Y + velocityy);
sp.Position = v;
var eCenterX = sp.Position.X + sp.TextureRect.Width / 2;
var eCenterY = sp.Position.Y + sp.TextureRect.Height / 2;
var tileY = Math.Floor((eCenterY) / TILEHEIGHT);
var tileX = Math.Floor((eCenterX) / TILEWIDTH);
var tileXpos = TILEWIDTH * Math.Floor(tileX + 1);
var tileYpos = TILEHEIGHT * Math.Floor(tileY + 1);
e.X = (int)tileY;
e.Y = (int)tileX;
if (eCenterX == tileXpos && eCenterY == tileYpos)
e.IsAtIntersection = true;
else
e.IsAtIntersection = false;
}
==運算符(帶有浮點)檢查是否完全相等。 即使經過非常相似的操作的浮點數通常也仍然不相等。 當您比較浮點數的相等性時,最佳做法是執行以下操作:
if(Math.Abs(floatA-floatB) <= someSmallFloat)
Epsilon通常設置為float錯誤。
eX
和eY
的浮點加法極不可能恰好達到目標值。 您應該檢查實體是否跨過相應的行:
例如這樣的向右運動:
if(e.currentDirection == Direction.RIGHT
&& eCenterX - velocityx< tileXpos && eCenterX >= eCenterX)
e.IsAtIntersection = true;
您也可以根據需要更正位置。
...
e.IsAtIntersection = true;
e.X = tileXpos;
您也可以沿y坐標移動它,以補償沿x坐標的向后移動。
這是給我的我編輯后的工作代碼:
private void MoveEntity(Entity e)
{
int angle = 0;
if (e.currentDirection == Direction.RIGHT) angle = 0;
else if (e.currentDirection == Direction.DOWN) angle = 90;
else if (e.currentDirection == Direction.LEFT) angle = 180;
else if (e.currentDirection == Direction.UP) angle = 270;
var scalex = Math.Round(Math.Cos(angle * (Math.PI / 180.0)));
var scaley = Math.Round(Math.Sin(angle * (Math.PI / 180.0)));
var velocityx = (float)(e.Speed * scalex);
var velocityy = (float)(e.Speed * scaley);
Sprite sp = sprites[e.Name];
Vector2f v = new Vector2f(sp.Position.X + velocityx, sp.Position.Y + velocityy);
sp.Position = v;
var tileY = (int)sp.Position.Y / 60;
var tileX = (int)sp.Position.X / 60;
var tileXpos = tileX * 60;
var tileYpos = tileY * 60;
e.X = (int)tileY;
e.Y = (int)tileX;
if (sp.Position.X == tileXpos && sp.Position.Y == tileYpos)
e.IsAtIntersection = true;
else
e.IsAtIntersection = false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.