如何保留自定义基类的子自定义类<;列表>;C#XNA
本文关键字:自定义 C#XNA gt lt 列表 何保留 保留 基类 | 更新日期: 2023-09-27 18:20:55
这是我第一次发帖,但我在这个网站上发现了很多对我的编程有很大帮助的东西。
我正试图写一个简单的游戏函数来帮助更好地学习编程的来龙去脉,但我遇到了困难。当我试图制作一个函数,让我的玩家和敌人可以轻松地绘制、更新和检查碰撞时,我制作了一个他们的父类。然后我列出了每个子类(玩家和敌人,所以我可以随意添加多个)的列表,添加到父类列表中。我希望我可以使用父列表,让子类只需一个列表调用就可以完成相应的功能,但每当我运行代码时,就会发生奇怪的事情。例如,如果currentPlayers超过1,则不会抽取任何敌人,并与敌人对抗。我也不能(正确地)运行我的碰撞函数,因为它是从子列表而不是父列表中运行的。
我想我真正的问题是如何将子列表与父列表分开,但仍然使用父列表进行所有函数调用。例如,使用actorList调用Player.Update和敌人。更新,但仍然使用actorList调用我的碰撞检测,并确定actorList[i]是玩家还是敌人。再次感谢您抽出时间。`
class ActorManager
{
static ActorManager instance;
List<Enemy> enemies = new List<Enemy>();
List<Player> players = new List<Player>();
int currentActors;
int currentEnemies =1;
int currentPlayers = 1;
List<Actor> actorList = new List<Actor>();
public static ActorManager Instance
{
get
{
if (instance == null)
instance = new ActorManager();
return instance;
}
}
public void Init()
{
for (int i = 0; i < currentPlayers; i++)
{
players.Add(new Player());
}
for (int i = 0; i < currentEnemies; i++)
{
enemies.Add(new Enemy());
}
// updates how many actors are currently in game
this.UpdateCurrentActors();
for (int i = 0; i < currentPlayers; i++)
{
actorList.AddRange(players);
}
for (int i = 0; i < currentEnemies; i++)
{
actorList.AddRange(enemies);
}
}
public void LoadContent(ContentManager Content)
{
this.UpdateCurrentActors();
for (int i = 0; i < currentActors; i++)
{
actorList[i].LoadContent(Content);
}
}
public void Update(GameTime gameTime)
{
for (int i = 0; i < currentActors; i++)
{
actorList[i].Update(gameTime);
}
CheckPlayerHit();
this.UpdateCurrentActors();
}
public void Draw(SpriteBatch spriteBatch)
{
for (int i = 0; i < currentActors; i++)
{
actorList[i].Draw(spriteBatch);
}
}
void UpdateCurrentActors()
{
currentActors = (currentEnemies + currentPlayers);
}
void CheckPlayerHit()
{
for (int i = 0; i < currentPlayers; i++)
{
Rectangle thePlayer = new Rectangle((int)players[i].AttackBox.X, (int)players[i].AttackBox.Y, players[i].AttackBox.Width, players[i].AttackBox.Height);
for (int j = 0; j < currentEnemies; j++)
{
Rectangle theEnemy = new Rectangle((int)enemies[j].HitBox.X, (int)enemies[j].HitBox.Y, enemies[j].HitBox.Width, enemies[j].HitBox.Height);
if (thePlayer.Intersects(theEnemy))
{
if (players[i].IsAttacking == true)
{
enemies[j].CurrentHealth -= players[i].Strength;
}
}
}
}
}
}
}`
如果有什么事情我忘了,请随时询问。
欢迎来到Stack Overflow,我绝非游戏编程专家,但我会尽力给你一些有用的建议。
我建议阅读有关继承的一般内容(http://msdn.microsoft.com/en-us/library/ms173149.aspx是指向一些以C#为中心的MSDN文档的链接)。
在您的情况下,如果您的类派生自一个公共对象Actor
,则可以将您的子对象存储在Actors
的列表中,并根据需要调用您重写的任何方法。
例如,作为一个简单的例子运行这个:
class Program
{
static void Main(string[] args)
{
List<Actor> MyActors = new List<Actor>();
MyActors.Add(new Player());
MyActors.Add(new Enemy());
MyActors.Add(new Player());
foreach (var Actor in MyActors)
{
Actor.DoSomething();
}
}
}
public abstract class Actor
{
public string Name;
public virtual void DoSomething()
{
Console.WriteLine("Actor does something");
}
}
public class Player : Actor
{
public override void DoSomething()
{
Console.WriteLine("Player does something");
}
}
public class Enemy : Actor
{
public override void DoSomething()
{
Console.WriteLine("Enemy does something");
}
}
将产生以下输出:
Player does something
Enemy does something
Player does something
因此,通过模拟,您的子类特定的Update
方法将被调用。
就你的程序而言,我可以发现一些可能有帮助的奇怪之处。
你的currentEnemies
和currentPlayers
在初始化后似乎永远不会被分配给,所以你的currentActors
永远是2。您最好使用enemies.Count
和players.Count
来获得currentEnemies
和currentPlayers
,这样它们就不会不同步。
您可能也可以删除UpdateCurrentActors
方法,除非它要做更复杂的事情。你应该能够从你的actorList
中获得当前参与者的数量,这是另一个你可能会失去同步的地方。
根据你最终会对你的玩家/敌人做什么,实际上你最好把它们作为单独的列表,尤其是如果你最终会把它们分成很多的话。
如果我有什么愚蠢的建议,请告诉我。