在碰撞后移除精灵
本文关键字:精灵 碰撞 | 更新日期: 2023-09-27 18:12:38
我正在制作一款XNA游戏,玩家在屏幕上移动"收集"猕猴桃(猕猴桃是动物,不是水果)。我希望当玩家与几维鸟碰撞时,几维鸟精灵就会消失。
到目前为止,我只能在碰撞发生时让所有的几维鸟消失。我只希望每个单独的精灵在碰撞中消失。我对所有的猕猴桃都使用了相同的精灵。
碰撞函数:
void Collision()
{
if (!isCollected)
{
foreach (Rectangle kiwi in kiwiRectangle)
{
if (kiwi.Intersects(Sprite.spriteDestinationRectangle))
{
isCollected = true;
}
}
}
}
kiwiRectangle是一个数组,包含在绘制的每个kiwi精灵周围创建的矩形。
然后在Draw()函数中:if (!isCollected)
{
foreach (Vector2 position in kiwiPosition)
{
spriteBatch.Draw(kiwi, position, Color.White);
}
}
你应该让iscollect成为Kiwi的一个属性,这样每个Kiwi都有它自己的iscollect。
如果这样做,则需要删除bot (!isCollected)。对于碰撞,你可以像这样插入一些东西,如果你让iscollect成为Kiwi的一个道具:
foreach (Rectangle kiwi in kiwiRectangle)
{
if (!kiwi.isCollected && kiwi.Intersects(Sprite.spriteDestinationRectangle))
{
isCollected = true;
}
}
因为我不知道kiwiPosition是如何建立的,所以我不能给你建议如何解决Draw
使用单一精灵是正确的决定。XNA清楚地分配了两个方法- Update和Draw,因为它暗示数据和它们的表示是两个不同的东西。
为什么需要标记isCollected?创建一个小类,只保留每个kiwi的单独数据
class Kiwi
{
public Vector2 position;
public bool Intersect (Vector2 pPlayerPosition)
{
// Return true if this kiwi's rectangle intersects with player rectangle
}
}
像这样使用
List <Kiwi> kiwis;
Vector2 playerPosition;
Texture2D kiwiTexture;
Initialize ()
{
this.kiwis = new Kiwi ();
// Add some kiwi to collection
}
LoadContent ()
{
this.kiwiTexture = Content.Load <Texture2D> (...);
}
Update (GameTime pGameTime)
{
if (! this.isGameOwer)
{
// Update playerPosition
playerPosition = ...
// Then check collisions
for (int i = 0; i <this.Kiwis.Count ;)
{
if (this.Kiwis [i]. Intersect (playerPosition))
{
this.Kiwis.RemoveAt (i);
/ / Add points to score or whatever else ...
}
else
{
i + +;
}
}
if (this.Kiwis.Count == 0)
{
// All kiwis colelcted - end of game
this.isGameOwer = true;
}
}
}
Draw (GameTime pGameTime)
{
if (! this.isGameOwer)
{
this.spritebatch.Begin ();
// Draw kiwis
for (int i = 0; i <this.Kiwis.Count ;)
{
Vector2 kiwiDrawPosition = new Vector2 (
this.Kiwis [i]. position.X - kiwiTexture.Width * 0.5f,
this.Kiwis [i]. position.Y - kiwiTexture.Height * 0.5f);
this.spritebatch (
this.kiwiTexture,
kiwiDrawPosition,
Color.White);
}
// Draw player
...
this.spritebatch.end ()
}
}
我会给每个Kiwi一个isAlive布尔值。当碰撞发生时,将特定Kiki的isAlive布尔值设置为false,然后在绘制/更新方法循环中遍历所有Kiwi,只有在isAlive = true时才绘制/更新它们。