我的目标是当我的强力球与玩家的船发生碰撞时,它会提升背景的滚动速度和敌人的速度,持续10秒。我已经提出了一些代码来做到这一点但是当我运行游戏并击中强力球时,背景和敌舰仅加速2-3秒而不是10秒。
idk我做错了所以有人可以帮帮我吗? 这就是我到目前为止所做的:
// Do the collision bewtween the player and the powerball
for (int i = 0; i < powerballs.Count; i++)
{
rectangle3 = new Rectangle((int)powerballs[i].Position.X,
(int)powerballs[i].Position.Y,
powerballs[i].Width,
powerballs[i].Height);
// Determine if the two objects collided with each other
if (rectangle1.Intersects(rectangle3))
{
boost = true;
powerballs[i].Active = false;
}
else
boost = false;
float elasped = (float)gameTime.ElapsedGameTime.TotalSeconds;
timer -= elasped;
if (boost == true && timer < 10f)
{
for (int j = 0; j < enemies.Count; j++)
{
// Increased enemy speed variable
float newEnemySpeed = 30f;
// Setting increased speed to each enemy in the list
enemies[j].SetNewMoveSpeed(newEnemySpeed);
}
//Increased Background speed variables
int newBackgroundSpeed1 = -5;
int newBackgroundSpeed2 = -10;
// Setting increased Background speed
bgLayer1.SetNewSpeed(newBackgroundSpeed1);
bgLayer2.SetNewSpeed(newBackgroundSpeed2);;
}
else
{
for (int k = 0; k < enemies.Count; k++)
{
// Set emeny speed back to normal
enemies[k].SetNewMoveSpeed(6f);
}
// Set background speed back to normal
bgLayer1.SetNewSpeed(-1);
bgLayer2.SetNewSpeed(-2);
}
}
答案 0 :(得分:2)
想到这样的事情(还有其他几种方法可以做到这一点)。一旦强力球碰撞,你就会提高速度。您将实现一个ITimerDispatchableEvent,它可以将速度恢复正常。
class Timer {
private double _time;
private readonly IList<ITimerDispatchableEvent> _events;
public Timer(double currentTime) {
_time = currentTime
}
// Update this on each call back during the main loop
public void Update(double deltaTime) {
_time += deltaTime;
Dispatch();
}
private void Dispatch() {
// Iterate events
// if event.FireTime <= _time
// event.Fire();
}
public void AddEvent(ITimerDispatchableEvent event) {
_events.add(event);
}
}
public interface ITimerDispatchableEvent {
// the absolute time to fire. E.g. if we want to fire in 10seconds
// this will be Timer._time += 10 (assuming deltaTime is in seconds)
double FireTime { get; }
void Fire();
}
答案 1 :(得分:0)
float elasped = (float)gameTime.ElapsedGameTime.TotalSeconds;
timer -= elasped;
为什么不尝试TimeSpan
对象?
/**Class Attributes**/
TimeSpan t;
/**End**/
for (int i = 0; i < powerballs.Count; i++)
{
rectangle3 = new Rectangle((int)powerballs[i].Position.X,
(int)powerballs[i].Position.Y,
powerballs[i].Width,
powerballs[i].Height);
// Determine if the two objects collided with each other
if (rectangle1.Intersects(rectangle3))
{
boost = true;
powerballs[i].Active = false;
//reset timer if collide, and intanciate them the first time\\
t = new TimeSpan();
}
else
{
boost = false;
}
if (boost == true && t.Milliseconds <= 10000)
{
for (int j = 0; j < enemies.Count; j++)
{
// Increased enemy speed variable
float newEnemySpeed = 30f;
// Setting increased speed to each enemy in the list
enemies[j].SetNewMoveSpeed(newEnemySpeed);
}
//Increased Background speed variables
int newBackgroundSpeed1 = -5;
int newBackgroundSpeed2 = -10;
// Setting increased Background speed
bgLayer1.SetNewSpeed(newBackgroundSpeed1);
bgLayer2.SetNewSpeed(newBackgroundSpeed2);;
//increment Timer with the gameTime\\
t+=gameTime.ElapsedGameTime;
}
else
{
for (int k = 0; k < enemies.Count; k++)
{
// Set emeny speed back to normal
enemies[k].SetNewMoveSpeed(6f);
}
// Set background speed back to normal
bgLayer1.SetNewSpeed(-1);
bgLayer2.SetNewSpeed(-2);
}
}
有关TimeSpan
对象的更多信息,请the official documentation。
答案 2 :(得分:-2)
以下是创建10秒计时器的代码:
long startTicks = System.Environment.TickCount;
long tenSeconds = 10000;
while (ticksElapsed > tenSeconds)
{
long ticksElapsed = System.Environment.TickCount - startTicks;
}
这将运行10秒钟,如果需要,你可以在while循环中执行某些操作。