pri svojem ustvarjanju sem naletel na problem, kako update-ati večje število objektov(enemies), pod pogojem da igra seveda normalno teče. Objekte sem shranil v "List" in jih potem v main classu z zanko vse update-al, vendar je že v primeru da je bilo aktivnih 8 objektov igra začela močno štekat. Zanima me kako se vi, bolj izkušeni programerji, lotite takšnih problemov.
UPDATE objekta
- Koda: Izberi vse
if (Math.Abs(MathHelper.WrapAngle(rotation)) <= MathHelper.Pi / 2)
{
gravity.Y = Math.Abs(MathHelper.WrapAngle(rotation));
//Console.WriteLine("ZGORI"+gravity);
}
else
{
gravity.Y = MathHelper.Pi - Math.Abs(MathHelper.WrapAngle(rotation));
//Console.WriteLine("SPODI" + Math.Abs(MathHelper.WrapAngle(rotation)));
}
gravity *= 2F;
location += (direction * speed) + gravity;
rectangle.Location = new Point((int)location.X, (int)location.Y);
speed = 5F;
elapsedTime += gameTime.ElapsedGameTime.Milliseconds;
if (elapsedTime >= maxTime)
{
elapsedTime = 0;
maxTime = random.Next(1000, 5000);
rotationDirection = random.Next(0,2);
if (rotationDirection == 0) { rotationDirection = -1; }
}
rotation += 0.01F * rotationDirection;
if (location.Y < 50 && location.X < 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) > MathHelper.Pi / 2)
{
rotation -= 0.06F;
rotationDirection *= -1;
}
if (location.Y < 50 && location.X < 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) < MathHelper.Pi / 2)
{
rotation += 0.06F;
rotationDirection *= -1;
}
if (location.Y < 50 && location.X > 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) > MathHelper.Pi / 2)
{
rotation -= 0.06F;
rotationDirection *= -1;
}
if (location.Y < 50 && location.X > 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) < MathHelper.Pi / 2)
{
rotation += 0.06F;
rotationDirection *= -1;
}
if (location.Y > 480 - 100 && location.X < 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) > MathHelper.Pi / 2)
{
rotation += 0.06F;
rotationDirection *= -1;
}
if (location.Y > 480 - 100 && location.X < 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) < MathHelper.Pi / 2)
{
rotation -= 0.06F;
rotationDirection *= -1;
}
if (location.Y > 480 - 100 && location.X > 1024 && Math.Abs(MathHelper.WrapAngle(rotation)) > MathHelper.Pi / 2)
{
rotation += 0.06F;
rotationDirection *= -1;
}
if (location.Y > 480 - 100 && location.X > 1024 &&Math.Abs(MathHelper.WrapAngle(rotation)) < MathHelper.Pi / 2)
{
rotation -= 0.06F;
rotationDirection *= -1;
}
Console.WriteLine(MathHelper.WrapAngle(rotation));
if (location.X <= 0) { rotation = MathHelper.WrapAngle(rotation) - MathHelper.Pi; isExplosion = true; }
if (location.X >= 2048) { rotation = MathHelper.WrapAngle(rotation) - MathHelper.Pi; isExplosion = true; }
if (location.Y <= 0) { rotation = MathHelper.WrapAngle(rotation) - MathHelper.Pi; isExplosion = true; }
if (location.Y >= 480) { rotation = 0 - MathHelper.Pi / 2; speed = 5F; isExplosion = true; }
//x' = cos(angle)*x - sin(angle)*y & y' = sin(angle)*x + cos(angle)*y
direction.X = (float)(Math.Cos(rotation) * startDirection.X - Math.Sin(rotation) * startDirection.Y);
direction.Y = (float)(Math.Sin(rotation) * startDirection.X - Math.Cos(rotation) * startDirection.Y);
if (isExplosion)
{
animationExplosion.update(gameTime);
animationExplosion.position = location;
}
animation.update(gameTime);
animation.position = location;