[C#] Snake Fragen

10/03/2012 18:53 xazorstix#1
Hey e*pvpers,

Ich habe mir gedacht mal ein Snake Spiel zu machen.
Ich habe bereits die Schlange(wird mit 4 Buttons bewegt), random position vom "essen" und eine Kollisionsfunktion.

Nun zu meinem Problem:
Ich muss bisher noch jedesmal den Button anklicken wenn ich die Schlange bewegen will.
Wie kriege ich es hin das der Code in der Funktion
Code:
private void x()
weiterläuft bis ein anderer Button gedrückt wird.
Mein bisheriger Versuch:
Code:
private void button_down_Click(object sender, RoutedEventArgs e)
{
      down();
      downn = true;
}

private void up()
{
      while(!downn)
      {
            margdown -= vel;
            head.Margin = new Thickness(margleft, margdown, 0, 0);
      }
}
Wenn ich nun allerdings einen Button drücke(z.B. up) hängt sich das Programm auf und ich muss es über den Task Manager schließen.

Den Schwanz der Schlange möchte ich wie den Kopf als Rechteck machen. Ich will natürlich nicht xx Rechtecke in XML vordefinieren.
Also erzeuge ich mit diesem Code
Code:
Rectangle tail1 = new Rectangle();
            tail1.Height = 7.5;
            tail1.Width = 10;
            tail1.Fill = new SolidColorBrush(Colors.Black);
            tail1.Margin = new Thickness(100, 100, 0, 0);
            tail1.HorizontalAlignment = HorizontalAlignment.Left;
            tail1.VerticalAlignment = VerticalAlignment.Top;
das Rechteck. Allerdings sehe ich dieses Rechteck nicht.

mfg
10/03/2012 20:37 nkkk#2
wenn du das mit windows forms machen willst musst du einen timer (den findest du in der toolbox) verwenden, oder einen zweiten thread.
10/03/2012 21:10 xazorstix#3
Hey,
ich mache es mit WPF.
Den Timer habe ich in WPF nicht in der Toolbox.
Hab grad das hier versucht: [Only registered and activated users can see links. Click Here To Register...]
Problem besteht weiterhin, "Kopf" hat sich gar nicht mehr bewegt.

Wie meinst du das mit einem 2. Thread ?

Der Score setzt sich teilweise einfach mal von z.B. 40 auf 338 oder von 29 auf 1072.
Ich verwende nur Inkremente bei der Score Variable. oO
10/03/2012 21:35 nkkk#4
naja wpf hab ich noch nie benutzt aber der link den du gefunden hast sieht doch ganz ordentlich aus.

was was den dein code als du das verscht hast?

und zu der anderen frage: deine form läuft in eine thread das heist die kann genau eine Sache gleichzeitig machen: deswagen friert die from bei codes wie

Code:
private void up()
{
      while(!downn)
      {
            margdown -= vel;
            head.Margin = new Thickness(margleft, margdown, 0, 0);
      }
}
auch ein, da er permanent die while schleife durchläuft hat er keine zeit mehr deine benutztereingaben zu verarbeiten.
der DispatcherTimer erlaubt es dir alle x ticks eine aktion duchzuführenin der zeit dazwischen hat der thread dann zeit deine benutztereingaben zu verarbeiten.


mit einem zweiten thread kann man 2 sachen GLEICHZEITIG machen. (z.B. mit new System.Thrading.Thread() ....) dann kannst mit deinem hauptthread die benutzteringaben verarbeiten udn mit dem zweiten arbeiten, das "2 sachen glewichzeitig" kann allerings auch naja zu komplizierten fehlern fürhen wenn man es fallsch anwendet, und hier würde ich die dazu raten einem timer zu benutzten.
10/03/2012 21:46 xazorstix#5
Danke danke :)
Hab durch deine Erklärung meinen Fehler gefunden. Werde ihn gleich mal berichtigen.

Hast du vllt auch noch eine Idee für das Rechteck ?
10/04/2012 10:09 kissein#6
Quote:
Originally Posted by xazorstix View Post
Danke danke :)
Hast du vllt auch noch eine Idee für das Rechteck || die Sache mit dem Score ?
Code:
myGrid.Children.Add(tail);
Ausserdem empfehle ich das für graphics das using verwendet wird, sonst muss man manuell disposen