gpt4 book ai didi

c# - XNA:需要帮助在计时器滴答声中在任何一侧产生敌人,然后让它们随机移动

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:51 24 4
gpt4 key购买 nike

好吧,我正在 XNA 中制作一个 2d 射击游戏,但遇到了一些障碍。我正在尝试创建一个敌人类,它允许我每 10 秒在屏幕外生成一个敌人,然后让它随机向上、向左或向下移动。在花了 4 个小时的大部分时间在互联网上搜索之后,我发现所有的例子都是让敌人向一个方向移动,从一个点生成等等。

任何帮助将不胜感激,我的敌人类(class)现在有点乱,因为将这么多代码拖在一起试图让它工作。这是它的现状:

using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Shark_Wars_2
{
class Enemy
{
List<Vector2> sharkPosition = new List<Vector2>(); //is there a better way for having more than one of the same enemy?
public Vector2 sharkDirection;

public int sharkWidth;
public int sharkHeight;

public int sharkSpeed;

float sharkSpawnProbability;

public Random randomSharkPosition;
public Random direction;

double timer = 0;
float interval = 1000;
int speed = 1;

public Enemy()
{
sharkPosition = new Vector2(0, 0); //brings up error - see above

sharkWidth = 64;
sharkHeight = 44;

sharkSpeed = 3;

sharkSpawnProbability = 1 / 10000f;

randomSharkPosition = new Random(3); //left, right, up, down
direction = new Random(3);

}

public void update(GameTime gameTime)
{
//enemy movement
for (int i = 0; i < sharkPosition.Count; i++)
{
//enemy position increases by speed
sharkPosition[i] = new Vector2(sharkPosition[i].X + sharkDirection.X, sharkPosition[i].Y + sharkDirection.Y);
}

timer += gameTime.ElapsedGameTime.TotalMilliseconds;

//aniamtion
if (timer >= interval / speed)
{
timer = 0;
}

//spawn new enemy
if (randomSharkPosition.NextDouble() < sharkSpawnProbability)
{
float spawn = (float)randomSharkPosition.NextDouble() * (1280 - sharkHeight); sharkPosition.Add(new Vector2(sharkDirection.X, sharkDirection.Y));
}
}

// ill worry about drawing after spawning and movement, should be no problem
public void draw()//(SpriteBatch spritebatch, Texture2D wave)
{
for (int i = 0; i < sharkPosition.Count; i++)
{
//spritebatch.Draw(shark, new Rectangle((int)sharkPosition[i].X, (int)sharkPosition[i].Y, sharkWidth, sharkHeight);
}
}
}
}

我的脑袋真的很堵,我花了很多时间研究如何制作移动的背景对象和子弹列表。

我真的很想简化这个,所以如果你知道更简单的做事方式,我会洗耳恭听!

提前致谢!

最佳答案

您的基本问题是您没有将管理/逻辑类与实例对象分开。你想要更多的分离,像这样:

public class EnemyManager
{
List<Shark> activeSharks = new List<Shark>();
Timer spawnTimer;

//Just one random instance per class, this is considered best practice to improve
//the randomness of the generated numbers
Random rng = new Random(); //Don't use a specific seed, that reduces randomness!

public EnemyManager()
{
//Min/max time for the next enemy to appear, in milliseconds
spawnTimer = new Timer(rng.Next(500, 2000));
spawnTimer.Elapsed += SpawnShark;
spawnTimer.Start();
}

public void SpawnShark(object sender, ElapasedEventArgs e)
{
Vector2 newSharkPosition = Vector2.Zero;
newSharkPosition.X = rng.Next(0, 1280); //Whatever parameters you want
newSharkPosition.Y = rng.Next(0, 1280); //Whatever parameters you want

Vector2 newSharkDirection.... //Repeat above for direction

Shark spawnedShark = new Shark(newSharkPosition, newSharkDirection);
activeSharks.Add(spawnedShark);

//Min/max time for the next enemy to appear, in milliseconds
spawnTimer = new Timer(rng.Next(500, 2000));
}

public void update(GameTime gameTime)
{
foreach(Shark s in activeSharks)
s.Update(gameTime);
}

public void draw(SpriteBatch spritebatch, Texture2D wave)
{
foreach(Shark s in activeSharks)
s.Draw(spritebatch, wave)
}
}

public class Shark
{
Vector2 position;
Vector2 direction;
const float speed = 3;
const int height = 44;
const int width = 64;

public Shark(Vector3 initPosition, Vector3 direction)
{
position = initPosition;
this.direction = direction;
}

//Draw/Update using the local variables.
}

显然我没有编写所有代码,但这应该可以帮助您入门。首先,我将所有“实例”特定数据放入它自己的对象中,然后“管理器”只是保存和管理这些对象的集合。我还将 RNG 重构为只有一个实例(最佳实践)并使用默认的基于时间的种子。自己播种会导致每次运行程序时得出相同的数字(可能不是您想要的 :))。

如果您不明白什么,请告诉我,或者我可以提供任何进一步的帮助!

关于c# - XNA:需要帮助在计时器滴答声中在任何一侧产生敌人,然后让它们随机移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721875/

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