Tilemap + Kollision auf schräger Fläche

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

steffenK

Betreff: Tilemap + Kollision auf schräger Fläche

BeitragDi, Feb 27, 2018 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Bisher habe ich immer nur mitgelesen und jetzt würde ich doch einmal Hilfe benötigen.
Ich benutze Blitz nur fürs Prototyping und hänge da jetzt etwas fest.
Ich habe eine Tilemap mit Scrolling welches beides funktioniert.
Ich grübel jetzt schon eine Weile darüber wie ich das Bewegen einer Jump and Run Figur steuere.

Dies soll lediglich über die Tilemap geschehen.
Ohne Kollisionen über direkte BB Befehle.

Die Tilemap habe ich über Array mit Types gelöst, somit kann man das Typekonstrukt jederzeit mit nützlichen Informationen über das Feld erweitern.

Gehen wir von einem 45 Grad Winkel der Einfachheit halber aus, würde sich die Y Koordinate aus X/2 oder X * 0.5 errechnen.
Soweit ist mir das klar.
Inwiefern setze ich das aber um?
Und dann sollen logischerweise auch noch Sprünge hinzukommen und dort fehlt mir gerade der gedankliche Ansatz wenn ich in ein entsprechendes Tile "falle" und dass die Spielfigur nicht direkt auf den entsprechenen Höhenwert Y gesetzt wird.

Ich wäre sehr dankbar wenn mir jemand dort ein wenig auf die Sprünge helfen könnte.
Ich habe das Forum jetzt schon eine Weile durchsucht, aber da ich auf die Kollisionsbefehle verzichten will, war meine Suche bisher erfolglos.

Midimaster

BeitragDi, Feb 27, 2018 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erst mal entsprechen 45° nicht 0.5 sondern ebenfalls 1.0, der Wert von 0.5 entspricht etwa 30%

Dann wäre ein Screenshot ganz schön. Sprichst Du von einem 2D oder 3D Spiel?

Sind die Tiles tatsächlich 45° zum Bildschirm angeordnet oder ganz normal waag- und senkrecht?

Y aus SpielerX

Die Y-Koordinate zu einer bestimmen SpielerX Koordinate könnte man so berechnen

SpielerFloor= TileY + ( SpielerX - TileX ) * 0.5 wenn das Bild in diesem Tile nach rechts unten fällt.

SpielerFloor= TileY - ( SpielerX - TileX ) *0.5 wenn das Bild in diesem Tile nach rechts oben steigt.


Zusätzlich benötigt jedes Tile eine Höhenangabe Floor# , die beschreibt, welchen Y-Wert der "Boden" links im Tile hat. Und außerdem eine Steigung Prozent# , die beschreibt, wie sich dieser "Boden" in Richtung rechter Tilerand verhält.

SpielerFloor= TileY +Floor + ( SpielerX - TileX ) *Prozent

Beispiel:

Deine Tiles sind 32x32pix
Dann hat ein vollständig gefülltes und waagrechten Tile den Floor#= 0 und Prozent#=0
Ein Tile das genau in der Mitte waagrecht ist: Floor#= 16 und den Prozent#=0

Ein Tile das von links unten nach rechts oben steigt: Floor#= 32 und den Prozent#=1
Ein Tile das von links oben nach rechts unten fällt: Floor#= 0 und den Prozent#=-1

Ein Tile das von links unten nach rechts bis auf halbe Höhe steigt: Floor#= 32 und den Prozent#=-0.5
Das nachfolgende Tile wäre dann: Floor#= 16 und den Prozent#=-0.5



langsamer Fall
Der Spieler soll langsam zum Y-Wert sinken: Dann addiertst Du auf seine Y-Koordonate immer nur ein wenig bei jedem FLIP, bis er die neue Zielkoordinate erreicht hat
Code: [AUSKLAPPEN]
If SpielerY<SpielerFloor
   SpielerY=SpielerY+1
ElseIf SpielerY>SpielerFloor
  SpielerY=SpielerY-1
Endif
....
Flip 1




BlitzBasic: [AUSKLAPPEN]
Graphics 800,300

SpielerX=0
SpielerY=101

Repeat
Cls
Color 55,55,55
For i%=0 To 3
Rect i*200,100,200,200,0
Next
Color 0,222,0
Rect 0,100,200,5
SpielerX=SpielerX+1
Rect 200,200,200,5
Line 400,200,600,100
Color 255,0,0
Oval SpielerX-20, SpielerY-20,20,20

If SpielerX<200
SpielerFloor=100
ElseIf SpielerX<400
SpielerFloor=200
ElseIf SpielerX<600
SpielerFloor=200- (SpielerX-400)*0.5
Else
SpielerFloor=600

EndIf
If SpielerY<SpielerFloor
SpielerY=SpielerY+1
ElseIf SpielerY>SpielerFloor
SpielerY=SpielerY-1
EndIf
Flip 1
Until KeyHit(1)
  • Zuletzt bearbeitet von Midimaster am Di, Feb 27, 2018 12:27, insgesamt 3-mal bearbeitet
 

steffenK

BeitragDi, Feb 27, 2018 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach herrje, es ist noch zu früh gewesen Wink
Ja logisch entspricht 45 Grad 1.0

2D
Und hier mal ein Screenshot der Map.
Diese wird mittels eines x,y Arrays dargestellt und gescrollt was eben sichtbar ist.
Deinen Code schaue ich mir dann gleich mal an, beim kurz ausprobieren in BB blieb das Fenster jedoch einfach schwarz.

user posted image

Midimaster

BeitragDi, Feb 27, 2018 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah. Schon so wie ich dachte...

zu meinem Beitrag:

nur das untere Code-Fenster ist lauffähig. Ich habe gerade meinen gesamten Beitrag nochmal editiert und erweitert. Bitte schau ihn Dir erneut an
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

steffenK

BeitragDi, Feb 27, 2018 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wahrscheinlich liegts am Windows 10, aber ich habs im Groben soweit verstanden.
Vielleicht liegts daran dass es keine Sprites sind.
Ich probiere das gegen Abend einzubauen.
Ich danke dir schonmal sehr

edit: wollte grad fast schon einen doppelpost machen Wink
Jedenfalls..hat sich mein Blitz wohl verabschiedet.Irgendwas auf meinem System führt wohl dazu dass es keine grafische Ausgabe mehr gibt.
Da es aber eh zum Prototyping gedacht war, halb so wild.
Daher frage ich einfach nochmal nach der Logik.
Ich habe meine Tilearrays jetzt mit Typedefinitionen für x uny Koordinate ausgestattet.
Kann mir anzeigen lassen auf welchem Tile sich der Spieler gerade befindet und auf welchem Pixel er sich im Tile befindet.
Bei deinem Code nähert er sich glaub immer an den Floor, der sozusagen den Boden darstellt, an.
Egal ob man von unten oder oben kommt.
Oder sehe ich das falsch?

Ich müsste theoretisch im Tile zu der SpielerY immer den Wert addieren welchem SpielerX_im_Tile*0.5 und zwar solange bis er übereinstimmt.
Ich bin mir zwar noch nicht sicher wie ich das umsetze, denn wenn ich auf dem Floor laufe und dann nach links oder rechts will, könnte er ja gleich den Wert Y nach oben oder unten gehen.

Ich bin gerade etwas überfordert und habe Kopfschmerzen(wenn auch nicht davon).
Ich werde erstmal eine Nacht darüber schlafen, die Nuss muss ja zu knacken ein.

Irgendjemand hier hat ja sicherlich schonmal sowas gecodet, aber wenn ich im Netz suche, dann denk ich mir dass es zu den Codes gehört die keiner gerne mal zeigt... hehe
 

steffenK

BeitragMo, März 12, 2018 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Brauche nun doch nochmal Hilfe.
Ich habs jetzt soweit dass ich zumindest wenn der Player in einem Tile mit Schräge steht er abhängig vom lokalen X Wert auf dem dazugehörigen Y Wert steht.
Das mit Der Graviatation bekomme ich noch nicht wirklich hin weil ich auch noch nicht wirklich durchsteige wie ich Player X in einem leeren Teil "auf" dem Bodenteil stehen lasse.
Es befindet sich immer 1 Pixel in dem Bodenteil nach Prüfung und dadurch kann ich nicht auf das benachbarte Schrägen-tile prüfen weil das links bzw. rechts neben dem Player liegende Tile im Boden ist.
Hier muss ich noch ein wenig dran schrauben.
Pseudocode würde mir ein wenig helfen, Blitz läuft bei mir wie gesagt aus welchen Gründen auch immer, nicht mehr.
Jedes Tile wird über ein Array aus Types gemanaged.
Und der Player kann sich frei bewegen und es wird derzeit geprüft welches Tile genau mittig unter ihm liegt.
Er soll sich auf der Schräge eben auch genau erst dann bewegen wenn der Mittelpunkt des Sprites dieses Tile "berührt".(diese Prüfung funktioniert grob)
Gibts für so eine Steuerung kein Beispiel irgendwo?Ich will ja keinen Code übernehmen, lediglich die Funktionsweise besser verstehen.
Der Player soll sich nur auf Geraden und Schrägen bewegen können und der Sprung nebst Gravitation sollen funktionieren.
Wobei ich Sprung und Gravitation(beides eben noch ohne Tileprüfung) schon hinbekommen habe, nur noch nicht in dieses Konstrukt eingebaut habe.

Xeres

Moderator

BeitragMo, März 12, 2018 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich höre nur heraus dass du in etwa das System von Sonic The Hedgehog verwendest.
Was soll Gravitation mit den Tiles zu tun haben? Klingt für mich eher wie ein Problem, das unabhängig sein sollte.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

steffenK

BeitragMo, März 12, 2018 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Gravitation insofern dass Player Y sich immer dann erhöht wenn Player weder springt(vor dem Scheitelpunkt) noch auf dem Boden steht.
Und in einem Tile welches eine Schräge enthält soll er eben auch fallen bis er den dementsprechenden Y Wert abhängig von der Steigung und der X Koordinate erreicht.
So im groben hab ich das ja auch verstanden, nur bei der Umsetzung happert es.
Wie ich den Y Wert im Tile errechne anhand der Steigung weiß ich.
Wie positioniere ich vorallem auch Player Y wenn darunter ein nicht durchgängiger Boden ist.
Zu 100% funktioniert das nämlich nicht.
Und selbst wenn dann funktioniert die Prüfung auf ein Steigungstile nicht wirklich.

Midimaster

BeitragDi, März 13, 2018 1:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht wäre es ja sinnvoll, wenn Du auch immer Code-Teile oder den gesamten (relevanten) Code hier mitveröffentlichst?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDi, März 13, 2018 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann an mir liegen - ich verstehe öfters Sachen nicht - aber aus dem Post deines Texts kann ich einfach nicht eruieren, was dein Problem ist - oder welche Frage du hast.

Irgendwie widersprechen die letzten vier Zeilen alle gegenseitig... Oder weißt du nur, was du tun müsstest, aber es funktioniert nicht immer?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group