私にとって、このバグはゲームを壊します。多くのランチャーから発射されるロケットを制御する 4 つの異なるリストを使用しています。ランチャーもリストに保持されます。
Launchers = new List<Launcher>();
RocketsUp = new List<Rectangle>();
RocketsDown = new List<Rectangle>();
RocketsLeft = new List<Rectangle>();
RocketsRight = new List<Rectangle>();
完全なものを見たいだけなら、ここにプロジェクトがあります。(完全な混乱であることを理解してください。私はそれを機能させようとしています。これを完了するのに3〜4週間以上の時間があれば、もっとクリーンアップしようとします)
質問
ロケットは発射しますが、右のロケットはランダムな間隔で停止しています。上、下、左は正常に機能しています。
ゲームを少しプレイさせると、しばらくすると遅くなり始めます。ゲームの発射で多くのロケットが必要だと思っていましたが、ロケットが発射されて破壊されているため、ゲームは正常に動作しないはずです。スポーンするのと同じくらい速くクリアされますか?
質問を終了
注:(複数のレベルがあり、次のレベルにジャンプすると、メソッドにすべてクリアがあるため、ラグがなくなります):
Launchers.Clear();
RocketsUp.Clear();
RocketsDown.Clear();
RocketsRight.Clear();
RocketsLeft.Clear();
これらのランチャーが行うことは、ブロックまたはプレイヤーと接触するまで、海峡線で設定された秒数ごとに発射体を発射することです。
各ランチャーの位置を通過する 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);
}
最後に、Rockets は 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);
}
}
}