Permalänk

[C#] Varför laggar mitt spel?!

Hej!
Jag har utvecklat och utvecklar ett spel till Windows Phone 7.1 och har bett om hjälp om det förut men jag fick inte så mycket hjälp..

I vilket fall som helst, så förstår jag inte varför spelet laggar så mycket. Det laggar i perioder, det börjar med att det laggar lite, sen hackar det till, sen laggar det totalt sen så stoppar allt så att det fryser. Sen efter 30 sekunder så lossnar frysningen och man kan spela igen, sen så börjar det om sådär.
Varför? Det känns inte som om det är så avancerade grejer som spelet utför när man spelar...
Lagget börjar när man börjar spela.

Vill ni ha så att ni kan ladda ner källkoden så kan jag väl fixa det, men för att ni ska kunna testa så måste ni ha OpenXlive (Bibliotek som används för att kunna koda in achievements i spelet)

Edit: Självklart så är det svårt att veta utan att se min kod, men tänkte ifall ni har några speciella tips eller liknande, annars så får det nog bli att se igenom att lägga upp min kod i en .rar fil o länka till er.

Permalänk
Medlem

Nu har jag inte kollat på din kod eller sett spelet, men första tanken är att din Collision Detection inte är bra.

Visa signatur

Ingen är perfekt inte ens Najk!

Permalänk
Skrivet av cLi:

Nu har jag inte kollat på din kod eller sett spelet, men första tanken är att din Collision Detection inte är bra.

Det kan faktiskt stämma, men vad vet jag inte. Problemet är att jag inte har någon riktig collision, den enda collisionen jag har nu är en massa if satser som kollar ifall fingret trycks ner på en viss position, för då ska den göra en viss sak. T.ex. Ifall man trycker ner fingret på samma position på samma position som skjut-knappen är på, då ska den skjuta.
Det här är hela min update, för jag tror att det är den som är oeffektiv och boven i det hela:

protected override void Update(GameTime gameTime) { // Allows the game to Pause if (Meny == true) { if (MenuMusicPause == true) { MediaPlayer.Stop(); } if (MenuMusicStart == true) { MediaPlayer.Play(MenuMusic); MenuMusicStart = false; } } if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) { if (manager.IsRunning) { XLiveFormFactory.Factory.ShowForm("Pause"); } } if (Meny == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= PlayPosition.X && touchPosition.X < PlayPosition.X + PlaySize.X && touchPosition.Y >= PlayPosition.Y && touchPosition.Y < PlayPosition.Y + PlaySize.Y) { Meny = false; ChooseDiff = true; MenuSound.Play(); } if (touchPosition.X >= SettingsPosition.X && touchPosition.X < SettingsPosition.X + SettingsSize.X && touchPosition.Y >= SettingsPosition.Y && touchPosition.Y < SettingsPosition.Y + SettingsSize.Y) { Meny = false; Settings1 = true; MenuSound.Play(); } if (touchPosition.X >= CreditsPosition.X && touchPosition.X < CreditsPosition.X + CreditsSize.X && touchPosition.Y >= CreditsPosition.Y && touchPosition.Y < CreditsPosition.Y + CreditsSize.Y) { Meny = false; Credits = true; MenuSound.Play(); } if (touchPosition.X >= FacebookPos.X && touchPosition.X < FacebookPos.X + FacebookSize.X && touchPosition.Y >= FacebookPos.Y && touchPosition.Y < FacebookPos.Y + FacebookSize.Y) { WebBrowserTask browser = new WebBrowserTask(); browser.URL = "http://www.facebook.com/LinusNeuman"; browser.Show(); MenuSound.Play(); } if (touchPosition.X >= TwitterPos.X && touchPosition.X < TwitterPos.X + TwitterSize.X && touchPosition.Y >= TwitterPos.Y && touchPosition.Y < TwitterPos.Y + TwitterSize.Y) { WebBrowserTask browser = new WebBrowserTask(); browser.URL = "https://twitter.com/FindusN"; browser.Show(); MenuSound.Play(); } if (touchPosition.X >= Live1Pos.X && touchPosition.X < Live1Pos.X + Live1Size.X && touchPosition.Y >= Live1Pos.Y && touchPosition.Y < Live1Pos.Y + Live1Size.Y) { MenuSound.Play(); OpenXLive.Forms.XLiveFormFactory.Factory.ShowForm("Lobby"); } } } } if (ChooseDiff == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= EasyPos.X && touchPosition.X < EasyPos.X + EasySize.X && touchPosition.Y >= EasyPos.Y && touchPosition.Y < EasyPos.Y + EasySize.Y) { ChooseDiff = false; difficulty = "Easy"; EasyGamemode = true; lvl = 1; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= NormalPos.X && touchPosition.X < NormalPos.X + NormalSize.X && touchPosition.Y >= NormalPos.Y && touchPosition.Y < NormalPos.Y + NormalSize.Y) { ChooseDiff = false; difficulty = "Normal"; NormalGamemode = true; lvl = 2; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= HardPos.X && touchPosition.X < HardPos.X + HardSize.X && touchPosition.Y >= HardPos.Y && touchPosition.Y < HardPos.Y + HardSize.Y) { ChooseDiff = false; difficulty = "Hard"; HardGamemode = true; lvl = 3; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= ImpossiblePos.X && touchPosition.X < ImpossiblePos.X + ImpossibleSize.X && touchPosition.Y >= ImpossiblePos.Y && touchPosition.Y < ImpossiblePos.Y + ImpossibleSize.Y) { ChooseDiff = false; difficulty = "Impossible"; ImpossibleGamemode = true; lvl = 4; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= BackPosition.X && touchPosition.X < BackPosition.X + BackSize.X && touchPosition.Y >= BackPosition.Y && touchPosition.Y < BackPosition.Y + BackSize.Y) { ChooseDiff = false; Meny = true; MenuSound.Play(); } } } } if (Credits == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= BackPosition.X && touchPosition.X < BackPosition.X + BackSize.X && touchPosition.Y >= BackPosition.Y && touchPosition.Y < BackPosition.Y + BackSize.Y) { Credits = false; Meny = true; MenuSound.Play(); } } } } if (Settings1 == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= BackPosition.X && touchPosition.X < BackPosition.X + BackSize.X && touchPosition.Y >= BackPosition.Y && touchPosition.Y < BackPosition.Y + BackSize.Y) { Settings1 = false; Meny = true; MenuSound.Play(); } if (MenuMusicTouch == true) { if (touchPosition.X >= MenuMusicPos.X && touchPosition.X < MenuMusicPos.X + MenuMusicSize.X && touchPosition.Y >= MenuMusicPos.Y && touchPosition.Y < MenuMusicPos.Y + MenuMusicSize.Y) { MenuMusicBool = false; MenuSound.Play(); } } if (MenuMusicTouch == false) { if (touchPosition.X >= MenuMusicPos.X && touchPosition.X < MenuMusicPos.X + MenuMusicSize.X && touchPosition.Y >= MenuMusicPos.Y && touchPosition.Y < MenuMusicPos.Y + MenuMusicSize.Y) { MenuMusicBool = true; MenuSound.Play(); } } if (MenuMusicBool == true) { MenuMusicTouch = true; MenuMusicText = "ON"; MenuMusicStart = true; MenuMusicPause = false; InGameMusicStart = true; InGameMusicPause = false; } if (MenuMusicBool == false) { MenuMusicTouch = false; MenuMusicText = "OFF"; MenuMusicPause = true; InGameMusicStart = false; InGameMusicPause = true; } } } } if (InGame == true) { foreach (Lasers laser in lasers) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; } for (int i = 0; i < lasers.Count; i++) { if (!lasers[i].isVisible) { lasers.RemoveAt(i); i--; } } scrolling1.Update(); scrolling2.Update(); if (scrolling1.rectangle.X + scrolling1.texture.Width <= 0) scrolling1.rectangle.X = scrolling2.rectangle.X + scrolling2.texture.Width; if (scrolling2.rectangle.X + scrolling2.texture.Width <= 0) scrolling2.rectangle.X = scrolling1.rectangle.X + scrolling1.texture.Width; spawn += (float)gameTime.ElapsedGameTime.TotalSeconds; foreach (Enemies enemy in enemies) enemy.Update(graphics.GraphicsDevice, gameTime, lvl); LoadEnemies(); if (InGameMusicStart == true) { MediaPlayer.Play(IngameMusic); InGameMusicStart = false; } if (InGameMusicPause == true) { MediaPlayer.Stop(); } // TODO: Add your update logic here while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= UpButtonPosition.X && touchPosition.X < UpButtonPosition.X + UpButtonSize.X && touchPosition.Y >= UpButtonPosition.Y && touchPosition.Y < UpButtonPosition.Y + UpButtonSize.Y) { SpaceShipPos = new Vector2(SpaceShipPos.X, SpaceShipPos.Y -= 20); } if (touchPosition.X >= DownButtonPosition.X && touchPosition.X < DownButtonPosition.X + DownButtonSize.X && touchPosition.Y >= DownButtonPosition.Y && touchPosition.Y < DownButtonPosition.Y + DownButtonSize.Y) { SpaceShipPos = new Vector2(SpaceShipPos.X, SpaceShipPos.Y += 20); } if (touchPosition.X >= ShootButtonPosition.X && touchPosition.X < ShootButtonPosition.X + ShootButtonSize.X && touchPosition.Y >= ShootButtonPosition.Y && touchPosition.Y < ShootButtonPosition.Y + ShootButtonSize.Y) { PlayerShoot.Play(); Shoot(); } if (touchPosition.X >= PauseButtonPos.X && touchPosition.X < PauseButtonPos.X + PauseButtonSize.X && touchPosition.Y >= PauseButtonPos.Y && touchPosition.Y < PauseButtonPos.Y + PauseButtonSize.Y) { paused = true; } if (SpaceShipPos.Y < 0) SpaceShipPos.Y = 0; if (SpaceShipPos.Y > graphics.PreferredBackBufferHeight) SpaceShipPos.Y = graphics.PreferredBackBufferHeight; if (SpaceShipPos.X < 0) SpaceShipPos.X = 0; if (SpaceShipPos.X > graphics.PreferredBackBufferWidth - SpaceShip.Width) SpaceShipPos.X = graphics.PreferredBackBufferWidth - SpaceShip.Width; if (SpaceShipPos.Y > graphics.PreferredBackBufferHeight - SpaceShip.Height) SpaceShipPos.Y = graphics.PreferredBackBufferHeight - SpaceShip.Height; } if (Health <= 0) { XLiveScoreForm form = new XLiveScoreForm(this.manager); if (EasyGamemode == true) { form.Show("ce49f039-edef-4162-a245-429269d4067a", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } if (NormalGamemode == true) { form.Show("fd60e1c5-2d0c-4716-8872-27f42de2471b", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } if (HardGamemode == true) { form.Show("d6256cd7-2161-4840-90cd-6b53f8f094b4", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } if (ImpossibleGamemode == true) { form.Show("4e012c29-497f-4aa5-87a6-bb23dc2f8ac0", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } } if (this.manager.CurrentSession.LeaderboardProfiles.Count > 0) { Leaderboard lb = new Leaderboard( this.manager.CurrentSession, this.manager.CurrentSession.LeaderboardProfiles[0]); lb.SubmitScore(5.0f); } if (ScoreText >= 1337) { Achievement item = new Achievement(manager.CurrentSession, "0603a7a4-d66b-48ae-867d-7ba813a2e8be"); item.AwardCompleted += new AsyncEventHandler(item_AwardCompleted); item.Award(); } if (ScoreText >= 9000) { Achievement item = new Achievement(manager.CurrentSession, "d0fde3d8-1d81-4925-b5f7-d0b645b0be70"); item.AwardCompleted += new AsyncEventHandler(item_AwardCompleted); item.Award(); } } base.Update(gameTime); }

Dold text
Permalänk
Medlem

Mitt förslag är att du implementerar State pattern för att underlätta läsningen av din kod samt för att få en snygg lösning.
Se mer på http://www.dofactory.com/Patterns/PatternState.aspx

Vidare så kan du testa att använda dig av gameTime och inte uppdatera allting varenda gång. Just nu görs en update 60 gånger per sekund, sänk till 30 gånger och se resultatet.
Samma sak för Draw metoden, sänk antalet ritningar och se hur det påverkar prestandan. Då har du börjat felsöka lite i alla fall.

Läs mer här: http://blogs.msdn.com/b/shawnhar/archive/2007/06/08/displayin...

För mer information om hur man kan tänka när man kodar spel kolla in Shawn Hargreaves blog: http://www.shawnhargreaves.com/blogindex.html

Visa signatur

Ingen är perfekt inte ens Najk!

Permalänk
Skrivet av cLi:

Mitt förslag är att du implementerar State pattern för att underlätta läsningen av din kod samt för att få en snygg lösning.
Se mer på http://www.dofactory.com/Patterns/PatternState.aspx

Vidare så kan du testa att använda dig av gameTime och inte uppdatera allting varenda gång. Just nu görs en update 60 gånger per sekund, sänk till 30 gånger och se resultatet.
Samma sak för Draw metoden, sänk antalet ritningar och se hur det påverkar prestandan. Då har du börjat felsöka lite i alla fall.

Läs mer här: http://blogs.msdn.com/b/shawnhar/archive/2007/06/08/displayin...

För mer information om hur man kan tänka när man kodar spel kolla in Shawn Hargreaves blog: http://www.shawnhargreaves.com/blogindex.html

Hmm jag antar att du menar detta:

// Frame rate is 30 fps by default for Windows Phone. TargetElapsedTime = TimeSpan.FromTicks(333333);

Permalänk
Hedersmedlem

Du vill implementera lyssnare på knappar och inte kolla koordinater varje gång man trycker. Vet inte hur det fungerar i Windows Phone men om den även kollar när man inte trycker är det ju mycket tid som går åt att bara kolla det.

Permalänk
Skrivet av Shimonu:

Du vill implementera lyssnare på knappar och inte kolla koordinater varje gång man trycker. Vet inte hur det fungerar i Windows Phone men om den även kollar när man inte trycker är det ju mycket tid som går åt att bara kolla det.

Jo faktiskt, måste finnas något smartare alternativ..
Borde man inte kunna göra en bool som heter InMenu, och sätta den till 1 när spelet startas och när en match avslutas? Så istället för att dne hela tiden kollar ifall Settings är true och ifall meny är true.. Så kollar den bara ifall InMenu är true, det borde väl spara prestanda?

Edit: Vad menas med "lyssnare" ?

Permalänk
Medlem
Skrivet av LinusNeuman:

Edit: Vad menas med "lyssnare" ?

Det är såna där killar som pratiga tjejer gillar.. tror jag..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Hedersmedlem
Skrivet av LinusNeuman:

Jo faktiskt, måste finnas något smartare alternativ..
Borde man inte kunna göra en bool som heter InMenu, och sätta den till 1 när spelet startas och när en match avslutas? Så istället för att dne hela tiden kollar ifall Settings är true och ifall meny är true.. Så kollar den bara ifall InMenu är true, det borde väl spara prestanda?

Edit: Vad menas med "lyssnare" ?

Vill börja med att nämna att jag tog upp ditt inlägg där du bara skrev "HAH", det är därför gilla-knappen finns Tyckte skämtet var lite kul så det fick stå kvar dock.

Jag hittade en länk på StackOverflow som kan vara till hjälp hoppas jag. Har aldrig programmerat för Windows Phone.

http://stackoverflow.com/questions/6729062/creating-a-button-...

Permalänk
Medlem
Skrivet av LinusNeuman:

Det kan faktiskt stämma, men vad vet jag inte. Problemet är att jag inte har någon riktig collision, den enda collisionen jag har nu är en massa if satser som kollar ifall fingret trycks ner på en viss position, för då ska den göra en viss sak. T.ex. Ifall man trycker ner fingret på samma position på samma position som skjut-knappen är på, då ska den skjuta.
Det här är hela min update, för jag tror att det är den som är oeffektiv och boven i det hela:

protected override void Update(GameTime gameTime) { // Allows the game to Pause if (Meny == true) { if (MenuMusicPause == true) { MediaPlayer.Stop(); } if (MenuMusicStart == true) { MediaPlayer.Play(MenuMusic); MenuMusicStart = false; } } if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) { if (manager.IsRunning) { XLiveFormFactory.Factory.ShowForm("Pause"); } } if (Meny == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= PlayPosition.X && touchPosition.X < PlayPosition.X + PlaySize.X && touchPosition.Y >= PlayPosition.Y && touchPosition.Y < PlayPosition.Y + PlaySize.Y) { Meny = false; ChooseDiff = true; MenuSound.Play(); } if (touchPosition.X >= SettingsPosition.X && touchPosition.X < SettingsPosition.X + SettingsSize.X && touchPosition.Y >= SettingsPosition.Y && touchPosition.Y < SettingsPosition.Y + SettingsSize.Y) { Meny = false; Settings1 = true; MenuSound.Play(); } if (touchPosition.X >= CreditsPosition.X && touchPosition.X < CreditsPosition.X + CreditsSize.X && touchPosition.Y >= CreditsPosition.Y && touchPosition.Y < CreditsPosition.Y + CreditsSize.Y) { Meny = false; Credits = true; MenuSound.Play(); } if (touchPosition.X >= FacebookPos.X && touchPosition.X < FacebookPos.X + FacebookSize.X && touchPosition.Y >= FacebookPos.Y && touchPosition.Y < FacebookPos.Y + FacebookSize.Y) { WebBrowserTask browser = new WebBrowserTask(); browser.URL = "http://www.facebook.com/LinusNeuman"; browser.Show(); MenuSound.Play(); } if (touchPosition.X >= TwitterPos.X && touchPosition.X < TwitterPos.X + TwitterSize.X && touchPosition.Y >= TwitterPos.Y && touchPosition.Y < TwitterPos.Y + TwitterSize.Y) { WebBrowserTask browser = new WebBrowserTask(); browser.URL = "https://twitter.com/FindusN"; browser.Show(); MenuSound.Play(); } if (touchPosition.X >= Live1Pos.X && touchPosition.X < Live1Pos.X + Live1Size.X && touchPosition.Y >= Live1Pos.Y && touchPosition.Y < Live1Pos.Y + Live1Size.Y) { MenuSound.Play(); OpenXLive.Forms.XLiveFormFactory.Factory.ShowForm("Lobby"); } } } } if (ChooseDiff == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= EasyPos.X && touchPosition.X < EasyPos.X + EasySize.X && touchPosition.Y >= EasyPos.Y && touchPosition.Y < EasyPos.Y + EasySize.Y) { ChooseDiff = false; difficulty = "Easy"; EasyGamemode = true; lvl = 1; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= NormalPos.X && touchPosition.X < NormalPos.X + NormalSize.X && touchPosition.Y >= NormalPos.Y && touchPosition.Y < NormalPos.Y + NormalSize.Y) { ChooseDiff = false; difficulty = "Normal"; NormalGamemode = true; lvl = 2; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= HardPos.X && touchPosition.X < HardPos.X + HardSize.X && touchPosition.Y >= HardPos.Y && touchPosition.Y < HardPos.Y + HardSize.Y) { ChooseDiff = false; difficulty = "Hard"; HardGamemode = true; lvl = 3; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= ImpossiblePos.X && touchPosition.X < ImpossiblePos.X + ImpossibleSize.X && touchPosition.Y >= ImpossiblePos.Y && touchPosition.Y < ImpossiblePos.Y + ImpossibleSize.Y) { ChooseDiff = false; difficulty = "Impossible"; ImpossibleGamemode = true; lvl = 4; InGame = true; MenuMusicPause = true; MenuMusicStart = false; StartPlaying = true; MenuSound.Play(); } if (touchPosition.X >= BackPosition.X && touchPosition.X < BackPosition.X + BackSize.X && touchPosition.Y >= BackPosition.Y && touchPosition.Y < BackPosition.Y + BackSize.Y) { ChooseDiff = false; Meny = true; MenuSound.Play(); } } } } if (Credits == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= BackPosition.X && touchPosition.X < BackPosition.X + BackSize.X && touchPosition.Y >= BackPosition.Y && touchPosition.Y < BackPosition.Y + BackSize.Y) { Credits = false; Meny = true; MenuSound.Play(); } } } } if (Settings1 == true) { while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); if (gestureSample.GestureType == GestureType.Tap) { Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= BackPosition.X && touchPosition.X < BackPosition.X + BackSize.X && touchPosition.Y >= BackPosition.Y && touchPosition.Y < BackPosition.Y + BackSize.Y) { Settings1 = false; Meny = true; MenuSound.Play(); } if (MenuMusicTouch == true) { if (touchPosition.X >= MenuMusicPos.X && touchPosition.X < MenuMusicPos.X + MenuMusicSize.X && touchPosition.Y >= MenuMusicPos.Y && touchPosition.Y < MenuMusicPos.Y + MenuMusicSize.Y) { MenuMusicBool = false; MenuSound.Play(); } } if (MenuMusicTouch == false) { if (touchPosition.X >= MenuMusicPos.X && touchPosition.X < MenuMusicPos.X + MenuMusicSize.X && touchPosition.Y >= MenuMusicPos.Y && touchPosition.Y < MenuMusicPos.Y + MenuMusicSize.Y) { MenuMusicBool = true; MenuSound.Play(); } } if (MenuMusicBool == true) { MenuMusicTouch = true; MenuMusicText = "ON"; MenuMusicStart = true; MenuMusicPause = false; InGameMusicStart = true; InGameMusicPause = false; } if (MenuMusicBool == false) { MenuMusicTouch = false; MenuMusicText = "OFF"; MenuMusicPause = true; InGameMusicStart = false; InGameMusicPause = true; } } } } if (InGame == true) { foreach (Lasers laser in lasers) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; } for (int i = 0; i < lasers.Count; i++) { if (!lasers[i].isVisible) { lasers.RemoveAt(i); i--; } } scrolling1.Update(); scrolling2.Update(); if (scrolling1.rectangle.X + scrolling1.texture.Width <= 0) scrolling1.rectangle.X = scrolling2.rectangle.X + scrolling2.texture.Width; if (scrolling2.rectangle.X + scrolling2.texture.Width <= 0) scrolling2.rectangle.X = scrolling1.rectangle.X + scrolling1.texture.Width; spawn += (float)gameTime.ElapsedGameTime.TotalSeconds; foreach (Enemies enemy in enemies) enemy.Update(graphics.GraphicsDevice, gameTime, lvl); LoadEnemies(); if (InGameMusicStart == true) { MediaPlayer.Play(IngameMusic); InGameMusicStart = false; } if (InGameMusicPause == true) { MediaPlayer.Stop(); } // TODO: Add your update logic here while (TouchPanel.IsGestureAvailable) { GestureSample gestureSample = TouchPanel.ReadGesture(); Vector2 touchPosition = gestureSample.Position; if (touchPosition.X >= UpButtonPosition.X && touchPosition.X < UpButtonPosition.X + UpButtonSize.X && touchPosition.Y >= UpButtonPosition.Y && touchPosition.Y < UpButtonPosition.Y + UpButtonSize.Y) { SpaceShipPos = new Vector2(SpaceShipPos.X, SpaceShipPos.Y -= 20); } if (touchPosition.X >= DownButtonPosition.X && touchPosition.X < DownButtonPosition.X + DownButtonSize.X && touchPosition.Y >= DownButtonPosition.Y && touchPosition.Y < DownButtonPosition.Y + DownButtonSize.Y) { SpaceShipPos = new Vector2(SpaceShipPos.X, SpaceShipPos.Y += 20); } if (touchPosition.X >= ShootButtonPosition.X && touchPosition.X < ShootButtonPosition.X + ShootButtonSize.X && touchPosition.Y >= ShootButtonPosition.Y && touchPosition.Y < ShootButtonPosition.Y + ShootButtonSize.Y) { PlayerShoot.Play(); Shoot(); } if (touchPosition.X >= PauseButtonPos.X && touchPosition.X < PauseButtonPos.X + PauseButtonSize.X && touchPosition.Y >= PauseButtonPos.Y && touchPosition.Y < PauseButtonPos.Y + PauseButtonSize.Y) { paused = true; } if (SpaceShipPos.Y < 0) SpaceShipPos.Y = 0; if (SpaceShipPos.Y > graphics.PreferredBackBufferHeight) SpaceShipPos.Y = graphics.PreferredBackBufferHeight; if (SpaceShipPos.X < 0) SpaceShipPos.X = 0; if (SpaceShipPos.X > graphics.PreferredBackBufferWidth - SpaceShip.Width) SpaceShipPos.X = graphics.PreferredBackBufferWidth - SpaceShip.Width; if (SpaceShipPos.Y > graphics.PreferredBackBufferHeight - SpaceShip.Height) SpaceShipPos.Y = graphics.PreferredBackBufferHeight - SpaceShip.Height; } if (Health <= 0) { XLiveScoreForm form = new XLiveScoreForm(this.manager); if (EasyGamemode == true) { form.Show("ce49f039-edef-4162-a245-429269d4067a", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } if (NormalGamemode == true) { form.Show("fd60e1c5-2d0c-4716-8872-27f42de2471b", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } if (HardGamemode == true) { form.Show("d6256cd7-2161-4840-90cd-6b53f8f094b4", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } if (ImpossibleGamemode == true) { form.Show("4e012c29-497f-4aa5-87a6-bb23dc2f8ac0", ScoreText, 5.0f, "This is great score!", XLiveScoreFormMode.Lose, difficulty); Health = 100; } } if (this.manager.CurrentSession.LeaderboardProfiles.Count > 0) { Leaderboard lb = new Leaderboard( this.manager.CurrentSession, this.manager.CurrentSession.LeaderboardProfiles[0]); lb.SubmitScore(5.0f); } if (ScoreText >= 1337) { Achievement item = new Achievement(manager.CurrentSession, "0603a7a4-d66b-48ae-867d-7ba813a2e8be"); item.AwardCompleted += new AsyncEventHandler(item_AwardCompleted); item.Award(); } if (ScoreText >= 9000) { Achievement item = new Achievement(manager.CurrentSession, "d0fde3d8-1d81-4925-b5f7-d0b645b0be70"); item.AwardCompleted += new AsyncEventHandler(item_AwardCompleted); item.Award(); } } base.Update(gameTime); }

Dold text

undvik foreach, iaf för stora listor, for är snabbare, speciellt precounted variabel. Använd inte distance, använd distancesquared och höj jämnförelsetalet till 2 också, om du ska kolla ungefärligt avstånd t.ex.

för o få lättare läslig kod kan du bygga en funktion som testar kollision mellan object. t.ex checkCollision(touchPosition, objectPosition, objectSize); i ditt fall, då du verkar byggt det så. annars som i alla andra trådar borde du objektorientera mer, använda klasser t.ex. men men...

annars kan det vara GarbageCollectorn som får spel. använder du mycket onödiga variabler?

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Skrivet av Shimonu:

Vill börja med att nämna att jag tog upp ditt inlägg där du bara skrev "HAH", det är därför gilla-knappen finns Tyckte skämtet var lite kul så det fick stå kvar dock.

Jag hittade en länk på StackOverflow som kan vara till hjälp hoppas jag. Har aldrig programmerat för Windows Phone.

http://stackoverflow.com/questions/6729062/creating-a-button-...

Hmm men det där är väl en Silverlight App, alltså inte XNA? Testat men det fungerar ej, den skriker på mig för att ja den tyckte inte om koden alls :/ Den vet till exempel inte vad Button är.

Skrivet av E_maN:

undvik foreach, iaf för stora listor, for är snabbare, speciellt precounted variabel. Använd inte distance, använd distancesquared och höj jämnförelsetalet till 2 också, om du ska kolla ungefärligt avstånd t.ex.

för o få lättare läslig kod kan du bygga en funktion som testar kollision mellan object. t.ex checkCollision(touchPosition, objectPosition, objectSize); i ditt fall, då du verkar byggt det så. annars som i alla andra trådar borde du objektorientera mer, använda klasser t.ex. men men...

annars kan det vara GarbageCollectorn som får spel. använder du mycket onödiga variabler?

Hoppsan hejsan, det var mycket tips!
Ja jag har väääääldigt många variabler.. xD

Nu är jag halvdan o trött, men en sak jag kan svara på är det med klasserna som vi diskuterat innan, jag lärde mig klasser när jag i stort sett kommit 70% kodmässigt, därför "sket" jag i det, ifall jag gör något nu så skulle ajg göra det i klasser men jag gör inte om något för att göra det i en klass.

Vad är checkCollision? Hittar ej det :S

Hmm.. Vad är det för skillnad på foreach och for? Kan jag bara hokus pokus skriva for istället så är problemet löst eller måste jag trixa med annat också? Kom på att ja det måste jag.. Men hur?
Här är mina två foreach loopar som jag ska ge mig av med:

foreach (Enemies enemy in enemies) enemy.Update(graphics.GraphicsDevice, gameTime, lvl);

Och denne:

foreach (Lasers laser in lasers) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; }

Jag är inget kodnings proffs, och jag har försökt förstå för fullt medans han på guiden visade hur han gjorde, men eftersom han inte förklarade så fick jag anta och gissa vad han gjorde, kanske kan ni hjälpa mig.
Nummer 1.
Vad jag har förstått så uppdaterar den bara självaste enemies classen?
Nummer 2.
Den kollar ifall varje laser skott som jag avfyrar är längre bort än 480 pixlar mellan laser skottet och rymdskeppet, så sätter den just den lasern till not alive, och då går den ner till en for loop som tar bort den.
Right? Jag behöver er hjälp, självklart min lärare också ska be honom om hjälp imorgon, (öppet hus, får extra hjälp om man sitter och ser snäll ut medans man programmerar och visar eventuella elever hur kul man har) för att förstå mig på detta!

for (int i = 0; i < lasers.Count; i++) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; i++; }

Testade att göra så, men då blir han arg för att han inte ärver laser variablerna.. :/

Permalänk
Medlem
Skrivet av LinusNeuman:

Hmm men det där är väl en Silverlight App, alltså inte XNA? Testat men det fungerar ej, den skriker på mig för att ja den tyckte inte om koden alls :/ Den vet till exempel inte vad Button är.

Hoppsan hejsan, det var mycket tips!
Ja jag har väääääldigt många variabler.. xD

Nu är jag halvdan o trött, men en sak jag kan svara på är det med klasserna som vi diskuterat innan, jag lärde mig klasser när jag i stort sett kommit 70% kodmässigt, därför "sket" jag i det, ifall jag gör något nu så skulle ajg göra det i klasser men jag gör inte om något för att göra det i en klass.

Vad är checkCollision? Hittar ej det :S

Hmm.. Vad är det för skillnad på foreach och for? Kan jag bara hokus pokus skriva for istället så är problemet löst eller måste jag trixa med annat också? Kom på att ja det måste jag.. Men hur?
Här är mina två foreach loopar som jag ska ge mig av med:

foreach (Enemies enemy in enemies) enemy.Update(graphics.GraphicsDevice, gameTime, lvl);

Och denne:

foreach (Lasers laser in lasers) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; }

Jag är inget kodnings proffs, och jag har försökt förstå för fullt medans han på guiden visade hur han gjorde, men eftersom han inte förklarade så fick jag anta och gissa vad han gjorde, kanske kan ni hjälpa mig.
Nummer 1.
Vad jag har förstått så uppdaterar den bara självaste enemies classen?
Nummer 2.
Den kollar ifall varje laser skott som jag avfyrar är längre bort än 480 pixlar mellan laser skottet och rymdskeppet, så sätter den just den lasern till not alive, och då går den ner till en for loop som tar bort den.
Right? Jag behöver er hjälp, självklart min lärare också ska be honom om hjälp imorgon, (öppet hus, får extra hjälp om man sitter och ser snäll ut medans man programmerar och visar eventuella elever hur kul man har) för att förstå mig på detta!

for (int i = 0; i < lasers.Count; i++) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; i++; }

Testade att göra så, men då blir han arg för att han inte ärver laser variablerna.. :/

dedär ser ju konstigt ut. du Itererar en laser men säger aldrig att den ska få koden som du ändrar? eller görs det senare?
du bör ta bort lasern ur listan om den går utanför 480 också, inte bara dölja den.

jag menar att du ska skriva den funktionen själv, och använda för collisionskoll istället för o göra

if (touchPosition.X >= PlayPosition.X && touchPosition.X < PlayPosition.X + PlaySize.X && touchPosition.Y >= PlayPosition.Y && touchPosition.Y < PlayPosition.Y + PlaySize.Y) { Meny = false; ChooseDiff = true; MenuSound.Play(); } if (touchPosition.X >= SettingsPosition.X && touchPosition.X < SettingsPosition.X + SettingsSize.X && touchPosition.Y >= SettingsPosition.Y && touchPosition.Y < SettingsPosition.Y + SettingsSize.Y) {

hade det blivit

if(CheckCollision(touchPosition, PlayPosition, PlaySize) { Meny = false; ChooseDiff = true; MenuSound.Play(); } if(CheckCollision(touchPosition, SettingsPosition, SettingsSize) {......

ForEach är mer slöare om objekten i listorna är många, det är då det tar ängre tid att iterera listan eftersom den kopierar över en referens av objekt osv. gjorde lite prestanda tester på det när jag gjorde mitt kandidatarbete i c#/xna på högskolan. Kanske iofs inte är farligt i ditt fall här nu men kan vara värt o nämna. ForEach är ju lättare o kolla på å andra sidan.

MEn gör något åt if-satserna när du kollar distance, för distance kör pythagoras sats, vilket är svar = sqrt(x^2+y^2). Kör du distanceSquared så tar den inte sqrt(), sqrt() är ganska jobbigt o köra, så undvik det.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Skrivet av E_maN:

dedär ser ju konstigt ut. du Itererar en laser men säger aldrig att den ska få koden som du ändrar? eller görs det senare?
du bör ta bort lasern ur listan om den går utanför 480 också, inte bara dölja den.

jag menar att du ska skriva den funktionen själv, och använda för collisionskoll istället för o göra

if (touchPosition.X >= PlayPosition.X && touchPosition.X < PlayPosition.X + PlaySize.X && touchPosition.Y >= PlayPosition.Y && touchPosition.Y < PlayPosition.Y + PlaySize.Y) { Meny = false; ChooseDiff = true; MenuSound.Play(); } if (touchPosition.X >= SettingsPosition.X && touchPosition.X < SettingsPosition.X + SettingsSize.X && touchPosition.Y >= SettingsPosition.Y && touchPosition.Y < SettingsPosition.Y + SettingsSize.Y) {

hade det blivit

if(CheckCollision(touchPosition, PlayPosition, PlaySize) { Meny = false; ChooseDiff = true; MenuSound.Play(); } if(CheckCollision(touchPosition, SettingsPosition, SettingsSize) {......

ForEach är mer slöare om objekten i listorna är många, det är då det tar ängre tid att iterera listan eftersom den kopierar över en referens av objekt osv. gjorde lite prestanda tester på det när jag gjorde mitt kandidatarbete i c#/xna på högskolan. Kanske iofs inte är farligt i ditt fall här nu men kan vara värt o nämna. ForEach är ju lättare o kolla på å andra sidan.

MEn gör något åt if-satserna när du kollar distance, för distance kör pythagoras sats, vilket är svar = sqrt(x^2+y^2). Kör du distanceSquared så tar den inte sqrt(), sqrt() är ganska jobbigt o köra, så undvik det.

Ahhh! Det förklarar en hel del tror jag, eftersom innan jag la till fiendens skjutning, så laggade spelet inte, men det gör det efteråt. Hur tar jag bort min skjutning och fiendens skjutning från listan då? För svar nej den tas inte bort den syns bara inte.

Ehh okej, ska försöka undvika det antar jag..

Hmm hur gör jag den funktionen då?

Permalänk
Medlem
Skrivet av E_maN:

undvik foreach, iaf för stora listor, for är snabbare, speciellt precounted variabel. Använd inte distance, använd distancesquared och höj jämnförelsetalet till 2 också, om du ska kolla ungefärligt avstånd t.ex.

Jag var nyfiken på det här och gjorde en väldigt simpel benchmark i LINQPad för att kolla hur de bägge varianterna betedde sig:

void Main() { var xs = Enumerable.Range(1, 30000).ToArray(); var ys = Enumerable.Range(1, 30000).ToArray(); // TestFor(xs, ys).Dump(); TestForeach(xs, ys).Dump(); } long TestForeach(int[] xs, int[] ys) { var sum = 0L; foreach (var x in xs) foreach (var y in ys) { sum += x; sum += y; } return sum; } long TestFor(int[] xs, int[] ys) { var sum = 0L; for (var i=0; i < xs.Length; i++) for (var j=0; j < ys.Length; j++) { sum += xs[i]; sum += ys[i]; } return sum; }

Mikrobenchmarks suger rent generellt men jag får konsekvent resutaltet att TestForeach är snabbare än TestFor. Detta kan bero på något som LINQPad gör med koden bakom kulisserna men det är ändå av intresse.

Notera att .ForEach på List<T> är långsammare; ganska mycket långsammare därtill eftersom den använder sig av funktionsobjekt.

Hursomhelst tycker jag inte det är en bra idé att rekommendera vanilla-for över foreach vid vanliga iterationer. For-loopar är både fulare och lättare att göra fel med.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Jag var nyfiken på det här och gjorde en väldigt simpel benchmark i LINQPad för att kolla hur de bägge varianterna betedde sig:

void Main() { var xs = Enumerable.Range(1, 30000).ToArray(); var ys = Enumerable.Range(1, 30000).ToArray(); // TestFor(xs, ys).Dump(); TestForeach(xs, ys).Dump(); } long TestForeach(int[] xs, int[] ys) { var sum = 0L; foreach (var x in xs) foreach (var y in ys) { sum += x; sum += y; } return sum; } long TestFor(int[] xs, int[] ys) { var sum = 0L; for (var i=0; i < xs.Length; i++) for (var j=0; j < ys.Length; j++) { sum += xs[i]; sum += ys[i]; } return sum; }

Mikrobenchmarks suger rent generellt men jag får konsekvent resutaltet att TestForeach är snabbare än TestFor. Detta kan bero på något som LINQPad gör med koden bakom kulisserna men det är ändå av intresse.

Notera att .ForEach på List<T> är långsammare; ganska mycket långsammare därtill eftersom den använder sig av funktionsobjekt.

Hursomhelst tycker jag inte det är en bra idé att rekommendera vanilla-for över foreach vid vanliga iterationer. For-loopar är både fulare och lättare att göra fel med.

ah okej ,har för mig jag testade med lite object och dyligt och då blev det annorlunda resultat. eller minns jag bara fel, var nog 4 år sen nu.
nackdelen är väl att man inte kan få reda på biljet objekt du är på med foreach? händer att man vill kunna det, har hänt mig många gånger iaf.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem
Skrivet av E_maN:

ah okej ,har för mig jag testade med lite object och dyligt och då blev det annorlunda resultat. eller minns jag bara fel, var nog 4 år sen nu.
nackdelen är väl att man inte kan få reda på biljet objekt du är på med foreach? händer att man vill kunna det, har hänt mig många gånger iaf.

Det kan mycket väl hända att prestandan av foreach var sämre då, jag är förhållandevis ny på .NET-programmering.

Som regel använder jag LINQ för att jobba med samlingar. Jag tycker den funktionella approachen leder till renare kod, kanske för att jag lärde mig C# och Scala parallellt.

Det finns situationer då jag fortfarande skulle köra en for/foreach-loop, t ex i tidskritiska tighta loopar som kontinuerligt körs flera gånger i sekunden.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Det kan mycket väl hända att prestandan av foreach var sämre då, jag är förhållandevis ny på .NET-programmering.

Som regel använder jag LINQ för att jobba med samlingar. Jag tycker den funktionella approachen leder till renare kod, kanske för att jag lärde mig C# och Scala parallellt.

Det finns situationer då jag fortfarande skulle köra en for/foreach-loop, t ex i tidskritiska tighta loopar som kontinuerligt körs flera gånger i sekunden.

Skrivet av E_maN:

ah okej ,har för mig jag testade med lite object och dyligt och då blev det annorlunda resultat. eller minns jag bara fel, var nog 4 år sen nu.
nackdelen är väl att man inte kan få reda på biljet objekt du är på med foreach? händer att man vill kunna det, har hänt mig många gånger iaf.

Men hur gör jag för att den ska ta bort lasrar ur listan när dom görs till isVisible = false?
Dessutom så snackar vi prestanda på en mobiltelefon, den är inte så jätte bra, då kan ganska mycket få den att lagga.

Permalänk
Medlem

Tror inte du behöver bry dig om foreach eller for etc.
Dina prestandaproblem ligger nog på en helt annan nivå, ett stort fel är nog att du inte ta bort saker korrekt (Tex. laserskott).
Du bör först kolla om skottet är utanför skärmen, är skottet utanför skärmen ta bort skottet, annars kolla kollisioner.

Kolla referenser på din lista, kanske removeAt eller dylikt fungerar för dig.

MVH NP^

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

http://www.dotnetperls.com/for-foreach värd att kolla in angående foreach.

Samt det finns fler fall där foreach > for flera gånger om beroende på vilken typ av lista du har. Så got som alla listor i C# ( finns några undantag ) kan man gå igenom dom i ordning. Dock många listor har ingen index som går från 0 till n utan de har inga index alls. De använder andra tekniker som t.ex. Binary Tree o.s.v. I dessa fall är foreach mycket mycket mycket snabbare.

Men som sagt va, skillnaderna för en vanlig lista är så enormt mindre så använd foreach när du behöver iterera genom en lista då din kod kommer bara bli lättare att läsa.

Samt denna är också värd att läsa igenom http://stackoverflow.com/a/1126248/885860

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Hedersmedlem
Skrivet av LinusNeuman:

Men hur gör jag för att den ska ta bort lasrar ur listan när dom görs till isVisible = false?
Dessutom så snackar vi prestanda på en mobiltelefon, den är inte så jätte bra, då kan ganska mycket få den att lagga.

Det borde finns en Dispose-metod eller liknande för klassen. Jag antar du använder någon IDE för att utveckla?

Permalänk
Medlem

Det finns en funktion som heter RemoveAt när det gäller att ta bort objekt ur listor.
Då gör du enklast en for loop som loopar igenom din lista ut av lasrar och kollar sedan ifall den är utanför skärmen. Ifall den är det så tar du list.RemoveAt(i); så kommer den att försvinna ur listan.

List<Laser> laserList = new List<Laser>(); for(int i = 0; i < laserList.Count(); i++) { if(!laserList[i].isVisible) laserList.RemoveAt(i); }

Skrev bara ur minne, ett tag sen jag gjorde något i C#

Permalänk
Medlem
Skrivet av Shimonu:

Det borde finns en Dispose-metod eller liknande för klassen. Jag antar du använder någon IDE för att utveckla?

Han använder sig utav XNA som jag har förstått.

Permalänk
Medlem
Skrivet av EuQ:

Det finns en funktion som heter RemoveAt när det gäller att ta bort objekt ur listor.
Då gör du enklast en for loop som loopar igenom din lista ut av lasrar och kollar sedan ifall den är utanför skärmen. Ifall den är det så tar du list.RemoveAt(i); så kommer den att försvinna ur listan.

List<Laser> laserList = new List<Laser>(); for(int i = 0; i < laserList.Count(); i++) { if(!laserList[i].isVisible) laserList.RemoveAt(i); }

Skrev bara ur minne, ett tag sen jag gjorde något i C#

Det kommer inte fungera. Tänk dig listan

[ isVisible: true, isVisible: false, isVisible: false, isVisible: true, osv... ]

När i är 1 kommer den ta bort första isVisible: false. Den följande komma falla ner på dess plats (1), och i ökas sedan till 2 vilket innebär att den missar efterföljande element.

Till TS, testa med

var visibleLasers = lasers.Where(laser => laser.isVisible);

Det fungerar garanterat, men kanske är för långsamt för din app. For-loopen som E_man citerade tidigare ska också fungera.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det kommer inte fungera. Tänk dig listan

[ isVisible: true, isVisible: false, isVisible: false, isVisible: true, osv... ]

När i är 1 kommer den ta bort första isVisible: false. Den följande komma falla ner på dess plats (1), och i ökas sedan till 2 vilket innebär att den missar efterföljande element.

Till TS, testa med

var visibleLasers = lasers.Where(laser => laser.isVisible);

Det fungerar garanterat, men kanske är för långsamt för din app. For-loopen som E_man citerade tidigare ska också fungera.

annars borde

for(int i = 0; i < lasers.Count(); ) { if(laser[i].visible == false) laser.removeAt(i); else i++; }

att funka? fast inte så snyggt iofs men den loopar ju och tar bort och räknar om.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem
Skrivet av MugiMugi:

http://www.dotnetperls.com/for-foreach värd att kolla in angående foreach.

Samt det finns fler fall där foreach > for flera gånger om beroende på vilken typ av lista du har. Så got som alla listor i C# ( finns några undantag ) kan man gå igenom dom i ordning. Dock många listor har ingen index som går från 0 till n utan de har inga index alls. De använder andra tekniker som t.ex. Binary Tree o.s.v. I dessa fall är foreach mycket mycket mycket snabbare.

Men som sagt va, skillnaderna för en vanlig lista är så enormt mindre så använd foreach när du behöver iterera genom en lista då din kod kommer bara bli lättare att läsa.

Samt denna är också värd att läsa igenom http://stackoverflow.com/a/1126248/885860

okej jag ger mig

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem
Skrivet av Teknocide:

Det kommer inte fungera. Tänk dig listan

[ isVisible: true, isVisible: false, isVisible: false, isVisible: true, osv... ]

När i är 1 kommer den ta bort första isVisible: false. Den följande komma falla ner på dess plats (1), och i ökas sedan till 2 vilket innebär att den missar efterföljande element.

Till TS, testa med

var visibleLasers = lasers.Where(laser => laser.isVisible);

Det fungerar garanterat, men kanske är för långsamt för din app. For-loopen som E_man citerade tidigare ska också fungera.

Kan ju alltid sätta en return efter if metoden. Dock är inte detta heller optimalt då den bara kommer ta bort en laser per update. Men det beror helt på hur många lasrar som skjuts.

Permalänk
Skrivet av EuQ:

Kan ju alltid sätta en return efter if metoden. Dock är inte detta heller optimalt då den bara kommer ta bort en laser per update. Men det beror helt på hur många lasrar som skjuts.

IDE?

Det är ju det jag undrar, hur gör jag så att den tar bort kulor från listan när den blir isVisibe = false?

Permalänk
Medlem
Skrivet av LinusNeuman:

IDE?

Det är ju det jag undrar, hur gör jag så att den tar bort kulor från listan när den blir isVisibe = false?

Nu har 3 olika personer skrivit 3 olika sätt att ta bort objekt ur listan. Läs i tråden.

IDE är Integrated development enviroment

Permalänk
Medlem

Får jag fråga hur du har tänkt med isVisible?
Om jag minns rätt så använder du inga klasser?
Så det finns ingen större poäng att ha en variabel för detta.
Utan du bör kunna ta bort objektet direkt i det skedet istället för att sätta isVisible, då din lista förmodligen är väldigt lätt tillgänglig.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Skrivet av EuQ:

Nu har 3 olika personer skrivit 3 olika sätt att ta bort objekt ur listan. Läs i tråden.

IDE är Integrated development enviroment

Oj, såg inte alla svar!

Skrivet av NoPaiN^:

Får jag fråga hur du har tänkt med isVisible?
Om jag minns rätt så använder du inga klasser?
Så det finns ingen större poäng att ha en variabel för detta.
Utan du bör kunna ta bort objektet direkt i det skedet istället för att sätta isVisible, då din lista förmodligen är väldigt lätt tillgänglig.

Jag har olika klasser, men inte i olika .cs om du förstår vad jag menar.