Probleme mit Fallgeschwindigkeit bei einer TileMap?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

bruce85

Betreff: Probleme mit Fallgeschwindigkeit bei einer TileMap?

BeitragSo, Dez 06, 2009 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ein paar Probleme bei meinem Spiel und zwar, wie bei einer Tile Map mit Pixel by Pixel Bewegung, möchte ich dies jedoch mit einer Temporäre Variable lösen, die z.B. in jeder Schleifendurchlauf um 0.33 erhöht wird und die Temporäre Variable dann die Y Position des Steines zuzuweisen und natürlich die Feldposition in Y-Richtung erhöhen.

Hier mal mein Code ohne Fallgeschwindigkeit:
Code: [AUSKLAPPEN]
  For Local S:TSteine = EachIn Steine
    DrawImage tiles,S.SteinX,S.SteinY,S.Frames
    If Spielfeld[S.FeldX,S.FeldY+1].Typ = 6 Then
      Spielfeld[S.FeldX,S.FeldY].Feld = S.Frames
      Spielfeld[S.FeldX,S.FeldY].FeldBelegt = 1
      ListRemove(Steine,S)
    Else
      If Spielfeld[S.FeldX,S.FeldY+1].Feld = 0 Then
        S.SteinPX = S.SteinPX + 2 '**
        S.SteinY = S.SteinY + 2 '**
        If S.SteinPX >= 40 Then '**
          S.FeldY = S.FeldY + 1 '**
          S.SteinPX = 0 '**
        EndIf
       Else
        Spielfeld[S.FeldX,S.FeldY].Feld = S.Frames
        Spielfeld[S.FeldX,S.FeldY].FeldBelegt = 1
        ListRemove(Steine,S)
      EndIf
    EndIf
  Next


Und hier der Code mit Fallgeschwindigkeit, ich weiss nur nicht, wie ich dann nach jede 40 Pixel die Variable S.FeldY um 1 erhöhen kann:
Code: [AUSKLAPPEN]
  For Local S:TSteine = EachIn Steine
    DrawImage tiles,S.SteinX,S.SteinY,S.Frames
    If Spielfeld[S.FeldX,S.FeldY+1].Typ = 6 Then
      Spielfeld[S.FeldX,S.FeldY].Feld = S.Frames
      Spielfeld[S.FeldX,S.FeldY].FeldBelegt = 1
      ListRemove(Steine,S)
    Else
      If Spielfeld[S.FeldX,S.FeldY+1].Feld = 0 Then
        S.SteinYTemp = S.SteinYTemp + 0.33 '**
        S.SteinPX = S.SteinPX + 2 '**
        S.SteinY = S.SteinY + S.SteinYTemp '**
        'If S.SteinPX >= 40 Then '**
          'S.FeldY = S.FeldY + 1  '** ##Was muss hier hin um die Variable S.FeldY nach jede 40 Pixel um 1 zuerhöhen?
          'S.SteinPX = 0 '**
        'EndIf
       Else
        Spielfeld[S.FeldX,S.FeldY].Feld = S.Frames
        Spielfeld[S.FeldX,S.FeldY].FeldBelegt = 1
        ListRemove(Steine,S)
      EndIf
    EndIf
  Next


Ich habe die Zeilen mit '** gekenntzeichnet, die wichtig sind um die Steine zu bewegen.
Ich danke euch schonmal für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Midimaster

BeitragMo, Dez 07, 2009 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist noch nicht ganz klar, was in Deinem code passiert, bzw was der Fehler sein soll...


Deswegen einige Fragen:

Sind Deine Tiles genau 40 pixel groß? Was genau zählt S.SteinPX? Erkennst Du daran, wann wieder genau ein Feld "überrannt" ist?

S.FeldY gibt doch die Position des Steins auf dem Spielfeld an. Aber wahrscheinlich nicht in Pixeln, sondern im Raster der Tiles, oder?

Und dieses S.SteinYTemp soll dafür sorgen, dass das Fallen ständig beschleunigt wird, oder?

Wieso zählst Du im 2.Beispiel bei S.SteinPX immer noch 2 dazu, obwohl bei S.SteinY ganz was anderes dazuaddiert worden ist. Ist es nicht eher so, dass man bei S.SteinPX auch S.SteinYTemp addieren sollte und und immer ,wenn es mehr als 40 sind wieder 40 abziehen muss?

Was genau ist eigentlich Dein beobachteter Fehler?

Übrigens sehen die Zeilen unter "If Spielfeld[S.FeldX,S.FeldY+1].Typ = 6 Then " und die unter dem letzten "Else" total gleich aus. Warum trifftst Du eine Unerscheidung für Typ 6, wenn die Reaktion doch genau die gleiche ist wie für alle anderen Typen außer 0?
 

bruce85

BeitragMo, Dez 07, 2009 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal für die antwort.

Der Stein soll ja erst Prüfen, ob ein Feld unten drunter den Wert vom Typ 6 hat, wenn richtig, dann nicht mehr weiter runter fallen, weil Typ = 6 das ende des Feldes in der Y-Achse ist.
Und im Else Block Treffe ich ja eine ganz andere Entscheidung vom Typ = 0, diese Prüft, ob ein Feld unten drunter frei ist, wenn ja, dann soll der Stein weiter runter fallen u.s.w.

Wenn ich S.SteinPX = S.STeinPX + 0.33 benutze und beobachte wieviele Pixel der Stein runter fallt, dann is es beim ersten Feld ca. 5.0 Pixel runtergefallen und der Stein is schon beim nächsten Feld, da die Felder 40*40 Pixel haben, also geht das nicht so einfach.

Und du hast recht, das runter fallen der Steine soll ja immer beschleunigt werden, da es besser aussieht als immer nur 2 Pixel nach unten bewegen zu lassen.

Edit: Hier mal ein Screen von meinem einfachen Map Editor:
http://www.imgbox.de/?img=q26067e157.png

Vielleicht sieht man es im Bild besser, was ich erreichen möchte.

Ich hoffe, das du mir weiterhelfen kannst.

MfG

Midimaster

BeitragMo, Dez 07, 2009 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit "else-Block" meine ich den dritten Block. der ist dem ersten sehr ähnlich, oder? Ist aber momentan erst mal egal.

Also das mit SteinPX versteh ich so nicht: SteinPX ist doch in Pixeln gedacht? Wieso dann S.SteinPX = S.SteinPX + 2 im 2.Beispiel? Der Stein hat sich doch in wirklichkeit um S.SteinYTemp weiterbewegt.

Meiner Meinung nach müsste es "S.SteinPX = S.SteinPX +S.SteinYTemp" heißen.

Am S.SteinPX erkennst Du doch, ob der Stein sich schon um 40 pixel, also ein ganzes Feld weiterbewegt hat, oder?

Leider hast Du immer noch nicht geschrieben, welches Verhalten der Steine Du beobachtetst und was Dir daran fehlerhaft vorkommt.
 

bruce85

BeitragMo, Dez 07, 2009 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir.

Ich habe es einfach mal so versucht, wie du es meintest:
Code: [AUSKLAPPEN]
S.SteinYTemp = S.SteinYTemp + 0.33
S.SteinPX = S.SteinPX + S.SteinYTemp
S.SteinY = S.SteinY + S.SteinYTemp
If S.SteinPX >= 40 Then
  S.FeldY = S.FeldY + 1
  S.SteinPX = 0
EndIf


Das funktioniert perfekt.

Und vielen Dank für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group