gpt4 book ai didi

c# - 射弹滞后,未完全删除

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:05 25 4
gpt4 key购买 nike

对我来说,这个错误是破坏游戏的,我正在使用四个不同的列表来控制从许多发射器中发射的火箭。发射器也保存在列表中:

        Launchers = new List<Launcher>();
RocketsUp = new List<Rectangle>();
RocketsDown = new List<Rectangle>();
RocketsLeft = new List<Rectangle>();
RocketsRight = new List<Rectangle>();

如果你只是想看到完整的东西 Here 是项目。 (请理解这是一团糟,我正在努力让它发挥作用,如果我有更多的时间然后 3 到 4 周来完成它,我会尝试让它更干净)

问题

火箭会发射出去,但右边的火箭会随机停止,向上、向下和向左都工作正常,如何?

如果我让游戏稍微玩一会儿,它会在一段时间后开始变慢,我原以为我在游戏中发射了很多火箭,但它们正在发射并被摧毁,所以游戏不应该运行良好,因为火箭被清除的速度与产生的速度一样快吗?

结束问题

注意:(我有多个级别,当我跳到下一个级别时,延迟消失了,因为我在一个方法中有一个 clear all):

        Launchers.Clear();
RocketsUp.Clear();
RocketsDown.Clear();
RocketsRight.Clear();
RocketsLeft.Clear();

这些发射器将做的是在海峡线上每隔设定的秒数发射一枚射弹,直到它们接触到方 block 或玩家。

我有一个 foreach 循环遍历每个发射器位置并根据发射器面向的方向生成火箭,1 = 向上,2 = 向下,3 = 右,4 = 左:

        foreach (Launcher l in Launchers)
{
l.Updata(gameTime);

if (rocketTime > rocketMax)
{
if (l.Direction == 1)
RocketsUp.Add(new Rectangle((int)l.Position.X + 11, (int)l.Position.Y, 9, 18));

if (l.Direction == 2)
RocketsDown.Add(new Rectangle((int)l.Position.X + 11, (int)l.Position.Y, 9, 18));

if (l.Direction == 3)
RocketsRight.Add(new Rectangle((int)l.Position.X, (int)l.Position.Y + 11, 18, 9));

if (l.Direction == 4)
RocketsLeft.Add(new Rectangle((int)l.Position.X, (int)l.Position.Y + 11, 18, 9));

}
}

然后为每个火箭列表调用 for 循环并定义它们的大小,因为纹理大小不正确:

        if (rocketTime > rocketMax)
rocketTime = 0;

for (int i = 0; i < RocketsUp.Count; i++)
{
RocketsUp[i] = new Rectangle(RocketsUp[i].X, RocketsUp[i].Y - 3, RocketsUp[i].Width, RocketsUp[i].Height);
}

for (int i = 0; i < RocketsDown.Count; i++)
{
RocketsDown[i] = new Rectangle(RocketsDown[i].X, RocketsDown[i].Y + 3, RocketsDown[i].Width, RocketsDown[i].Height);
}

for (int i = 0; i < RocketsLeft.Count; i++)
{
RocketsRight[i] = new Rectangle(RocketsRight[i].X + 3, RocketsRight[i].Y, RocketsRight[i].Width, RocketsRight[i].Height);
}

for (int i = 0; i < RocketsLeft.Count; i++)
{
RocketsLeft[i] = new Rectangle(RocketsLeft[i].X - 3, RocketsLeft[i].Y, RocketsLeft[i].Width, RocketsLeft[i].Height);
}

然后在Draw方法中绘制火箭:

        for (int i = 0; i < RocketsUp.Count; i++)
{
spriteBatch.Draw(rocketUp, new Rectangle(RocketsUp[i].X,
RocketsUp[i].Y,
RocketsUp[i].Width,
RocketsUp[i].Height),
Color.White);
}

for (int i = 0; i < RocketsDown.Count; i++)
{
spriteBatch.Draw(rocketDown, new Rectangle(RocketsDown[i].X,
RocketsDown[i].Y,
RocketsDown[i].Width,
RocketsDown[i].Height),
Color.White);
}

for (int i = 0; i < RocketsRight.Count; i++)
{
spriteBatch.Draw(rocketRight, new Rectangle(RocketsRight[i].X, RocketsRight[i].Y, RocketsRight[i].Width, RocketsRight[i].Height), Color.White);
}

for (int i = 0; i < RocketsLeft.Count; i++)
{
spriteBatch.Draw(rocketLeft, new Rectangle(RocketsLeft[i].X, RocketsLeft[i].Y, RocketsLeft[i].Width, RocketsLeft[i].Height), Color.White);
}

最后,火箭队在另一个名为 Block 的类中被调用:

    public Player BlockCollision(Player player, GameTime gameTime, Game1 game1)
{
this.game1 = game1;
kbState = Keyboard.GetState();

Rectangle BlockRectangle = new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);

Rectangle top = new Rectangle((int)Position.X + 5, (int)Position.Y - 10, Texture.Width - 10, 10);
Rectangle bottom = new Rectangle((int)Position.X + 5, (int)Position.Y + Texture.Height, Texture.Width - 10, 10);
Rectangle left = new Rectangle((int)Position.X - 10, (int)Position.Y + 5, 10, Texture.Height - 10);
Rectangle right = new Rectangle((int)Position.X + Texture.Width, (int)Position.Y + 5, 10, Texture.Height - 10);

Rectangle personRectangle = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Texture.Width, player.Texture.Height);

for (int i = 0; i < game1.RocketsDown.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsDown[i].X, game1.RocketsDown[i].Y);

if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketDown.Width, game1.rocketDown.Height)))
{
player.Dead = true;
}
}

for (int i = 0; i < game1.RocketsUp.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsUp[i].X, game1.RocketsUp[i].Y);

if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketUp.Width, game1.rocketUp.Height)))
{
player.Dead = true;
}
}

for (int i = 0; i < game1.RocketsLeft.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsLeft[i].X, game1.RocketsLeft[i].Y);

if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketLeft.Width, game1.rocketLeft.Height)))
{
player.Dead = true;
}
}

for (int i = 0; i < game1.RocketsRight.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsRight[i].X, game1.RocketsRight[i].Y);

if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketRight.Width, game1.rocketRight.Height)))
{
player.Dead = true;
}
}

if (BlockState > 0)
{
for (int i = 0; i < game1.RocketsDown.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsDown[i].X, game1.RocketsDown[i].Y);

if (top.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketDown.Width, game1.rocketDown.Height)))
{
game1.RocketsDown.RemoveAt(i);
}
}

for (int i = 0; i < game1.RocketsUp.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsUp[i].X, game1.RocketsUp[i].Y);

if (bottom.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketUp.Width, game1.rocketUp.Height)))
{
game1.RocketsUp.RemoveAt(i);
}
}

for (int i = 0; i < game1.RocketsLeft.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsLeft[i].X, game1.RocketsLeft[i].Y);

if (right.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketLeft.Width, game1.rocketLeft.Height)))
{
game1.RocketsLeft.RemoveAt(i);
}
}

for (int i = 0; i < game1.RocketsRight.Count; i++)
{
Vector2 Rocket = new Vector2(game1.RocketsRight[i].X, game1.RocketsRight[i].Y);

if (left.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketRight.Width, game1.rocketRight.Height)))
{
game1.RocketsRight.RemoveAt(i);
}
}
}

最佳答案

检查这段代码:

for (int i = 0; i < RocketsLeft.Count; i++)
{
RocketsRight[i] = new Rectangle(RocketsRight[i].X + 3, RocketsRight[i].Y, RocketsRight[i].Width, RocketsRight[i].Height);
}

for (int i = 0; i < RocketsLeft.Count; i++)
{
RocketsLeft[i] = new Rectangle(RocketsLeft[i].X - 3, RocketsLeft[i].Y, RocketsLeft[i].Width, RocketsLeft[i].Height);
}

您在本应使用 RocketRight 的地方使用了 RocketLeft.Count。

编辑:此外,尝试使用 Rectangle.Dispose() 处理“已摧毁”的火箭。这可能有助于释放一些资源。

关于c# - 射弹滞后,未完全删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23246442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com