我正在XNA制作游戏,玩家在屏幕上移动'收集'猕猴桃(动物,而不是水果)。我想做到这一点,当玩家与奇异鸟相撞时,奇异果精灵就会消失。
到目前为止,我只能在发生碰撞时让所有的猕猴桃消失。我只想让每个精灵在碰撞中消失。我正在为所有的猕猴桃使用相同的精灵。
这是碰撞功能:
void Collision()
{
if (!isCollected)
{
foreach (Rectangle kiwi in kiwiRectangle)
{
if (kiwi.Intersects(Sprite.spriteDestinationRectangle))
{
isCollected = true;
}
}
}
}
kiwiRectangle是一个数组,其中包含围绕每个绘制的奇异果精灵创建的矩形。
然后在Draw()函数中:
if (!isCollected)
{
foreach (Vector2 position in kiwiPosition)
{
spriteBatch.Draw(kiwi, position, Color.White);
}
}
答案 0 :(得分:0)
你应该使isCollected成为Kiwi的一个属性,所以每个Kiwi都拥有它自己的isCollected。
如果你这样做,你需要摆脱僵尸(!isCollected)。对于碰撞,如果你将isCollected设为Kiwi的支柱,你可以插入这样的东西:
foreach (Rectangle kiwi in kiwiRectangle)
{
if (!kiwi.isCollected && kiwi.Intersects(Sprite.spriteDestinationRectangle))
{
isCollected = true;
}
}
由于我无法判断kiwiPosition是如何构建的,所以我无法告诉你如何解决这个问题。
答案 1 :(得分:0)
使用单精灵是正确的决定。 XNA清楚地分配了两个方法 - Update和Draw,因为它暗示数据及其表示是两个不同的东西。
为什么你需要一个标志isCollected?创建一个只保留每个奇异果的个别数据的小类
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 ()
}
}
答案 2 :(得分:0)
我会给每个Kiwi一个isAlive布尔值。 当发生碰撞时,将特定Kiki的isAlive布尔值设置为false,然后在draw / update方法中循环遍历所有Kiwi,并且只有在isAlive = true时才绘制/更新它们。