Update večjega števila objektov

Za vse novince v izdelovanju iger.

Update večjega števila objektov

OdgovorNapisal/-a pevecyan » Pe Mar 22, 2013 9:09 pm

Živjo,
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;
pevecyan
novinec
novinec
 
Prispevkov: 18
Pridružen: To Okt 16, 2012 9:09 pm

Re: Update večjega števila objektov

OdgovorNapisal/-a Blodyavenger » So Mar 23, 2013 12:56 am

Načeloma je to tko kot si sam napisu, sam nekje v tvoji kodi mora bit nek haklc.
Trenutno najbolj sumim tale Console.WriteLine(MathHelper.WrapAngle(rotation));

Zakomentiri to pa še ostale Console.WriteLine ker to zna upočasnit sistem. Mej to sam za debug drugač pa vn vrži. Sporoč rezultate pol :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: Update večjega števila objektov

OdgovorNapisal/-a pevecyan » Ne Mar 24, 2013 3:43 pm

Ne morem vrjet, da je en write naredil res toliko škode :O.
Tule je rezultat po tem, ko sem zakomentiral vse "špilferderberje".
http://www.youtube.com/watch?v=whBTNPC1Zrk
pevecyan
novinec
novinec
 
Prispevkov: 18
Pridružen: To Okt 16, 2012 9:09 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron