Entwickler-Ecke
WinForms - Objektkollision funktioniert nicht
Palmm130 - Di 27.09.11 10:25
Titel: Objektkollision funktioniert nicht
Nochmals Hallo,
im Zuge meines aktuellen OOP-Projektes hab ich eine Klasse "Ball" von einer PictureBox erstellt, welche auf einem Panel, dem "Spielfeld" sich frei bewegen können soll.
Funktioniert soweit prächtig, jedoch soll er bei Kollision mit dem Spielfeldrand die Richtung wechseln. Auf der Unterseite tut er es, auf der Oberseite nicht.
Hier nun aller relevanter Code:
Ball.cs:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| namespace Arkanoid { class Ball : System.Windows.Forms.PictureBox { private bool up = false; private bool down = true;
public void MoveYourself() { if (down) { this.Top = this.Top + 1; } else if (up) { this.Top = this.Top - 1; } } public void ChangeDirectionY() { if (up) { up = false; down = true; } if (down) { up = true; down = false; } } } } |
Form1.cs:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| namespace Arkanoid { public partial class Form1 : Form { Timer tim_thegame = new Timer(); Ball ball = new Ball();
private void Form1_Load(object sender, EventArgs e) { ball.Width = 16; ball.Height = 16; ball.Image = Arkanoit.Properties.Resources.ball; ball.Top = 200; ball.Left = 200; pan_gamefield.Controls.Add(ball); tim_thegame.Tick += new EventHandler(tim_thegame_Tick); tim_thegame.Interval = 10; tim_thegame.Enabled = true; }
void tim_thegame_Tick(object sender, EventArgs e) { if (ball.Top <= pan_gamefield.Top) { ball.ChangeDirectionY(); } else if (ball.Bottom >= pan_gamefield.Bottom) { ball.ChangeDirectionY(); } ball.MoveYourself(); } } |
Der Ball startet jetzt auf dem Spielfeld und fährt nach unten, prallt ab und verschwindet nach oben aus dem Bild. Habe ich etwas bei der Kollisionsabfrage falsch gemacht?
Warum geht es nach unten, aber nach oben nicht?
Horschdware - Di 27.09.11 10:58
Palmm130 hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public void ChangeDirectionY() { if (up) { up = false; down = true; } if (down) { up = true; down = false; } |
|
Du setzt "down" auf true und fragst direkt danach, ob down true ist und setzt dann wiederum up auf true.
Hier wäre ein "else" praktisch.
PS: Kleiner tip:
Wenn du up/down als integer zusammenfasst und link/rechts ebenso kannst du ja folgendes machen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class Ball { private int dy = 1; private int dx = 1; ... }
Move { this.Top += dy; this.Left += dx; }
ChangeDirY { dy *= -1; } ... |
Bei der Kollision musst du dann jeweils nur mit -1 multiplizieren. Du sparst dir so das Hantieren mit den bool'schen Variablen.
Palmm130 - Di 27.09.11 11:31
Dummdidumm, aua!
Vielen Dank, hab ich ausser Acht gelasse -.-
thepaine91 - Di 27.09.11 13:47
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public void ChangeDirectionY() { if (up) { up = false; down = true; } if (down) { up = true; down = false; } up = ! up; down = ! down; } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!