>问题:我的所有/大部分道具都会立即激活,而不仅仅是存储随机选择(滚动(的 1,然后按 LeftCtrl 键激活。
我仍然不熟悉使用枚举,并且在使用EventArgs
时非常新手。
的文章,但仍然不确定它们是如何工作的,我相信这就是我的问题可能所在。
除了 Powerup 类之外,我还在下面包含了我的 Game1 类中的代码。
类别:游戏1
if (input.RollPowerup == true)
{
//generate a random powerup
PowerupType type = (PowerupType)random.Next(Enum.GetNames(typeof(PowerupType)).Length);
switch (type)
{
case PowerupType.BigBalls:
{
powerup = new Powerup(type, 10.0f, 1.0f);
ball.GrowBall();
break;
}
case PowerupType.ShrinkBalls:
{
powerup = new Powerup(type, 10.0f, 1.0f);
ball.ShrinkBall();
break;
}
case PowerupType.BigPaddle:
{
powerup = new Powerup(type, 10.0f, 1.0f);
leftBat.GrowBat();
break;
}
case PowerupType.ShrinkEnemy:
{
powerup = new Powerup(type, 10.0f, 1.0f);
rightBat.ShrinkBat();
break;
}
case PowerupType.SpeedBall:
{
powerup = new Powerup(type, 10.0f, 20.0f);
ball.IncreaseSpeed();
break;
}
case PowerupType.Heal:
{
powerup = new Powerup(type, 1.0f, 1.0f);
hud.AddHealthP1();
break;
}
case PowerupType.Regen:
{
powerup = new Powerup(type, 20.0f, 1.0f);
break;
}
}
powerupInitialized = false;
}
else if (input.ActivatePowerup == true)
{
powerup.Activate();
}
if (powerup != null && IsActive)
{
if (!powerupInitialized)
{
powerup.Activated += PowerupActivated;
powerup.Deactivated += PowerupDeactivated;
if (powerup.Type == PowerupType.Regen)
powerup.Tick += PowerupTick;
powerupInitialized = true;
}
powerup.Update((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}
职业:道具
public void Activate()
{
IsAlive = true;
// powerupActivate.Play(); // Plays the SFX to notify user that item has been selected
if (Activated != null)
Activated(this, eventArgs);
if (Type <= PowerupType.ThreeBurst)
{
//no need to call Deactivated unless you really want to
IsAlive = false;
}
}
public virtual void Update(float elapsed)
{
// Checks if the player is still alive or not
if (IsAlive)
{
elapsedLifetime += elapsed;
if (elapsedLifetime >= maxLifetime)
{
IsAlive = false;
if (Deactivated != null)
Deactivated(this, eventArgs);
}
else if (elapsedLifetime >= (lastTick + 1) * 1000)
{
lastTick++;
if (Tick != null)
Tick(this, eventArgs);
}
}
}
几件事:
- 看起来您正在立即激活一些道具调用 HUD、球和球棒方法。是这样吗?我以为玩家必须手动激活它们吗?这些调用将进入由通电的 Activate 事件调用的事件处理程序中。
- 您是否正在重置输入。滚动电源和输入。激活通电到假的某个地方?如果没有,这可能会导致意想不到的问题,可能是所有道具同时激活,因为每一帧都会生成新的道具。
- 您可能还希望将事件的挂钩移动到游戏类的构造函数或 Initialize 方法。这将消除检查,我假设每帧都会发生检查。
- 您可能不需要每次都创建新的道具。只需将其重置为所选类型即可。这意味着在 powerup 类中添加一个属性 - 类似于 IsActive。然后,您的代码将如下所示:
if (input.RollPowerup == true)
{
//generate a random powerup
PowerupType type = (PowerupType)random.Next(Enum.GetNames(typeof(PowerupType)).Length);
switch (type)
{
case PowerupType.BigBalls:
{
powerup.Reset(type, 10.0f, 1.0f);
break;
}
case PowerupType.ShrinkBalls:
{
powerup.Reset(type, 10.0f, 1.0f);
break;
}
case PowerupType.BigPaddle:
{
powerup.Reset(type, 10.0f, 1.0f);
break;
}
case PowerupType.ShrinkEnemy:
{
powerup.Reset(type, 10.0f, 1.0f);
break;
}
case PowerupType.SpeedBall:
{
powerup.Reset(type, 10.0f, 20.0f);
break;
}
case PowerupType.Heal:
{
powerup.Reset(type, 1.0f, 1.0f);
break;
}
case PowerupType.Regen:
{
powerup.Reset(type, 20.0f, 1.0f);
break;
}
}
powerupInitialized = false;
}
else if (input.ActivatePowerup == true)
{
powerup.Activate();
}
if (powerup.IsActive)
{
powerup.Update((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}
可能还有更多的东西,但这就是我目前看到的。如果您想将项目上传到某个地方并通过电子邮件将链接发送给我,那很好。