2016-05-03 18 views
0

Auf meinem vorhergehenden Pfosten erwähnte ich, in meiner Freizeit C# mit der XNA Bibliothek zu studieren, es ist immer der Fall; Ich bin jedoch stundenlang auf etwas gestanden, das ich in der Logik nicht verstehen kann!Das Zeichen entsprechend zu den Fliesen bewegen

Hier ist eine Zusammenfassung der aktuellen Situation, tatsächlich mein Charakter bewegt sich 2 pro 2 Pixel, wobei dieser Wert in einer Variablen gespeichert ist I „Geschwindigkeit“ in Player.cs genannt haben:

private Texture2D texture; 
private Vector2 position, previousPosition; 
private Rectangle sourceRect; 
private KeyboardState currentInput, previousInput; 

private int currentFrame = 0, frameLine = 0; 
private float speed = 2f, elapsedTime, animationTime = 128f; 

(Meine Eingänge sind ZQSD für Azerty Keyboards durch die Art und Weise, D)

public void Update(GameTime gameTime) 
{ 
    currentInput = Keyboard.GetState(); 

    if (currentInput.IsKeyDown(Keys.Z)) 
    { 
     if (!Map.isColliding(position.X, position.Y - speed)) 
      position.Y -= speed; 

     this.Animate(gameTime, 3); 
    } 
    else if (currentInput.IsKeyDown(Keys.Q)) 
    { 
     if (!Map.isColliding(position.X - speed, position.Y)) 
      position.X -= speed; 

     this.Animate(gameTime, 1); 
    } 
    else 
     sourceRect = new Rectangle(32, (32 * frameLine), 32, 32); 

    previousInput = currentInput; 
} 

public void Animate(GameTime gameTime, int m_frameLine) 
{ 
    elapsedTime += (float)gameTime.ElapsedGameTime.TotalMilliseconds; 
    frameLine = m_frameLine; 

    if (elapsedTime > animationTime) 
    { 
     if (currentFrame >= 2) 
      currentFrame = 0; 
     else 
      currentFrame++; 

     elapsedTime = 0; 
    } 

    sourceRect = new Rectangle((32 * currentFrame), (32 * frameLine), 32, 32); 
} 

Map.cs baut die gesamte Karte mit einer Fliese, natürlich, da ich Schwierigkeiten hatte, ein „gutes“ log, um herauszufinden, ic, ich habe Tutorials auf YouTube, also hier ist das Ergebnis trotzdem:

MAP PREVIEW

Jetzt kann ich erklären, wo ich mit diesem gehe! Ich kann normal durch die Karte bewegen, die Kollision funktioniert, aber wenn der Charakter zwischen zwei Kollisionsplättchen (zwischen Wänden) gehen will, wird es nicht funktionieren, wenn ein einzelnes Pixel zu viel links oder rechts (oder höher) ist und nach unten, abhängig von der Richtung):

Dies liegt daran, den Geschwindigkeit Charakter ist zwei Pixel zu einem Zeitpunkt, und manchmal (meistens immer) es ist irgendwie knifflig ihn perfekt in der Mitte zu bekommen, um durch den Gang zu gehen.

Also meine Frage ist, wie könnte ich mit der Verschiebung des Players umgehen, so dass er die Geschwindigkeit hält, aber nur alle 32 Pixel und so weiter auf zum Beispiel stoppen? Ich habe so viele Möglichkeiten versucht, dass es nicht mehr lustig ist, ich bin in einer Logik fest, ich bin sicher, in die falsche Richtung zu schauen, nutzlos ...

Wenn mich jemand mit dieser Situation aufklären könnte, wo beginnen oder was zu ändern, würde ich wirklich schätzen, auch, danke, dass Sie mich gelesen haben !!

+0

Das Objekt wird von Kachel zu Kachel bewegt? Ich meine, das Objekt bewegt sich (Geschwindigkeit * Zeit) bei jedem Bild, in dem die Tasten gedrückt werden. Wenn Sie einen Tastendruck bemerken und das Objekt sich nicht bewegt, feuern Sie eine Animation von der aktuellen Kachel zur nächsten Kachel. vielleicht kannst du den Animate Funktionscode hinzufügen ... – Gusman

+0

Ja ich denke du siehst meinen Punkt! Ich würde global gerne ein Kärtchen zur Fliese verschieben, mit einer bestimmten Geschwindigkeit :) Der Animationscode wurde hinzugefügt! –

+0

Aus meiner Sicht ist Ihre Animation fehlerhaft ... Wenn Sie von A nach B wechseln möchten, benötigen Sie eine Animationsklasse, die die Start- und Endpositionen, die Startzeit und die Dauer hat, wenn Ihr Objekt animiert wird, nicht feuern Sie alle anderen Animationen für das Objekt ab. Dann hätte ich eine Liste von Animationen und in der Update-Phase würde ich die Animation aktualisieren, die eine wahre oder falsche, wahre Bedeutung der Animation zurückgegeben hat, in diesem Fall wird die Animation genau von A nach B wandern. Und um die Endposition zu sichern, würde ich einen Lerp (Start, Ende, Math.Min ((currentTime - startTime)/AnimationLänge, 1). – Gusman

Antwort

1

Wenn ich Ihre Frage richtig verstanden habe, sollten Sie Ihre zukünftige Position basierend auf der tatsächlichen Position Ihres Players berechnen und dann in Richtung seiner zukünftigen Position bewegen. Mit anderen Worten: Ihr Player hat die Position in Vector2 gespeichert. Sie müssen also Ihre nächste Position basierend darauf berechnen, wohin Sie sich bewegen möchten. Wenn Sie sich also nach rechts bewegen wollen, berechnen Sie actual_position + new Vector2 (32,0), für links benötigen Sie actual_position + new Vector2 (-32,0), für top actual_position + new Vector2 (0,32), für bot actual_position + neuer Vektor2 (0, -32). Dann wenden Sie einfach Geschwindigkeit an und wenn der Spieler den berechneten Vektor erreicht, stoppen Sie einfach die Bewegung.

+0

Ja, ich verstehe Ihren Standpunkt! Danke, ich werde das dann versuchen, und über meine Frage, wie ich in den Kommentaren oben gesagt habe, möchte ich eine Kachel zur Verschiebung haben, mit einer bestimmten Geschwindigkeit, da Englisch nicht meine primäre Sprache ist, versuche ich um so genau wie möglich zu sein:] –