2016-08-29 3 views
0

Ich mache ein einfaches Spiel. Es gelang mir, meinen Charakter mit Pfeiltasten und Feuer zu bewegen. Ich habe der Karte einige Wände hinzugefügt, die Bildkästen sind. Ich schaffte es die Kollision wie folgt zu erkennen: „colision“Kollisionserkennung und Stop-Bewegung

private void timer6_Tick(object sender, EventArgs e){ 
    foreach (PictureBox pic in brick){ 
     if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)){ 
      Console.WriteLine("Colision!"); 
      switch (rotation){ 
       case "up": 
        canup = false; 
        candown = true; 
        canleft = true; 
        canright = true; 
        break; 
       case "down": 
        canup = true; 
        candown = false; 
        canleft = true; 
        canright = true; 
        break; 
       case "left": 
        candown = true; 
        canup = true; 
        canleft = false; 
        canright = true; 
        break; 
       case "right": 
        candown = true; 
        canup = true; 
        canleft = true; 
        canright = false; 
        break; 
      } 
     } 
     else 
     { 
      Console.WriteLine("No colision?!"); 
     } 
    } 
} 

Es ist, als aber bald erwartet funktioniert, wie ich das Objekt getroffen (Wand) ich Echo, das in Ordnung ist, stoppt auch die Bewegung in die Richtung, in die der Charakter bei der Kollision blickte. Die Sache ist, wenn ich die Kollision verlasse, bleibt eines dieser Bools falsch, was verhindert, dass sich mein Charakter wieder in dieselbe Richtung bewegt. Ich habe versucht, alle diese Bools in anderen Zweig True, aber da es fünf Wände gibt, auch wenn es eine Kollision sonst Zweig wird ausgeführt 4 mal von 5. Ich brauche eine Art von "any" -Funktion, um zu überprüfen, ob keine oder keine Wände sind in einem Moment getroffen werden.

+0

Sie können Kollision überprüfen auf Ihrer 'movement' Funktion -assuming Sie ein- haben, anstatt in Ihrem' Timer' und wenn Sie eine Kollision erkennen, was Sie tun erlaube diese Bewegung nicht. – uTeisT

+2

Betrachten Sie einen anderen Ansatz: Der Benutzer gibt einen * Befehl * ein. Sie * bewerten dann den Befehl im Kontext des Spiels * und der Befehl ist entweder * genehmigt * oder * abgelehnt *. Wenn genehmigt, dann bewegt sich das Zeichen in der angegebenen Richtung; wenn es abgelehnt wird, passiert nichts. Ich denke, wenn Sie Ihr Spiel mit diesem Muster strukturieren, werden viele Ihrer Probleme verschwinden. –

Antwort

1

Ich bin nicht 100% sicher, was Sie bekommen an, aber ich denke, das helfen kann:

canup = true; 
candown = true; 
canleft = true; 
canright = true; 
foreach (PictureBox pic in brick) 
{ 
    if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)) 
    { 
     Console.WriteLine("Colision!"); 
     switch (rotation) 
     { 
      case "up": 
       canup = false; 
       break; 
      case "down": 
       candown = false; 
       break; 
      case "left": 
       canleft = false; 
       break; 
      case "right": 
       canright = false; 
       break; 
     } 
    } 
    else 
    { 
     Console.WriteLine("No colision?!"); 
    } 
    ... 

Das zu Beginn alle bools auf true gesetzt würde, und setzt nur die einzelnen bools als falsch innerhalb der Schleife.

+2

auch Enums statt einer Zeichenfolge für 'Rotation 'könnte helfen –

0

Ist es möglich, dass Sie nur Ihren Charakter stoppen, aber die Kollision nicht lösen? Der Stein und der Charakter sind schließlich ineinander, um eine Kollision auszulösen. Sie müssen auseinander bewegt werden, um wieder kollisionsfrei zu sein.

Gewöhnliche Methoden hierfür sind, die Position des Charakters um einen Rahmen zurückzusetzen, oder genauer gesagt, herauszufinden, wie tief der Charakter den Ziegel durchdrang (͡ ° ͜ʖ ͡ °) und ihn entlang der Richtung zurückbewegte wo kam es von diesem Betrag her.