Ingen är perfekt inte ens Najk!
[C#] Varför laggar mitt spel?!
Nu har jag inte kollat på din kod eller sett spelet, men första tanken är att din Collision Detection inte är bra.
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);
}
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
Ingen är perfekt inte ens Najk!
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);
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.
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" ?
Edit: Vad menas med "lyssnare" ?
Det är såna där killar som pratiga tjejer gillar.. tror jag..
Kom-pa-TI-bilitet
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-...
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);
}
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?
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 :)
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.
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.. :/
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.
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 :)
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å?
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.
Kom-pa-TI-bilitet
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.
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 :)
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.
Kom-pa-TI-bilitet
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.
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.
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^
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
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
Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.
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?
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 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.
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.
Kom-pa-TI-bilitet
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.
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 :)
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
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 :)
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.
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?
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
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.
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
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!
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.
- Igår Corsair Platform 6: För dig som inte nöjer dig med Ikea-skrivbord 11
- Igår Rykte: Switch 2 släpps i höst – OLED-variant dröjer 32
- Igår Iphones marknadsandel faller i USA 43
- 25 / 4 Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk 80
- 25 / 4 Nu stiger hårddiskpriserna med uppemot 10 procent 23
- Helgsnack: Är all reklam till ondo?55
- Kommer mitt system räcka?7
- Bytt cpu, skärmar startar inte9
- Krönika: "Early access" är utstuderad girighet21
- Dagens fynd (bara tips, ingen diskussion) — Läs första inlägget först!18424
- Gamingdator max 20.000 kr1
- Snabbtest: Asus ROG Swift PG32UCDM – kryss i nästan alla rutor38
- Phanteks D30 anslutning (RGB fläkt)16
- Premiär! Månadens Drop på SweClockers72
- Vattenkylning from beyond the grave! (Socket 771)30
- Säljes Lian Li O11 Dynamic XL svart samt 360mm radiatorer
- Säljes Xbox Elite Wireless Series 2 handkontroll
- Bytes Ny RM750x mot SFX
- Säljes RX 6800 XT Asus Strix LC OC och Samsung Odyssey G7 27"
- Skänkes 3st 120mm fläktar med löjligt kort sladd
- Säljes Vårrensning - datorkomponenter
- Säljes Gigabyte GA-Z270M-D3H
- Säljes Speldator 4080
- Säljes Dell 27" S2721DGFA IPS QHD 165 Hz HDR 2560 x 1440
- Säljes Custom Loop - i9-9900K / 32 GB / 2 TB / RTX 3080 / Win 11
- Krönika: "Early access" är utstuderad girighet21
- Övergivet skadeprogram infekterar miljontals maskiner9
- Helgsnack: Är all reklam till ondo?55
- Microsoft släpper källkoden till MS‑DOS 4.0013
- Ny caps lock-symbol i Windows förbryllar HP-användare20
- Corsair Platform 6: För dig som inte nöjer dig med Ikea-skrivbord11
- Rykte: Switch 2 släpps i höst – OLED-variant dröjer32
- NetonNet varnar om läckta kunduppgifter23
- Premiär på SweClockers! Månadens drop med gamingskärm hos Elgiganten72
- IT-bolag: Teknikstrul är största tidsboven idag42