Mal eine simple Frage zu tilemapping...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mpreu

Betreff: Mal eine simple Frage zu tilemapping...

BeitragFr, Okt 11, 2013 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab mir einen level gebastelt.
Eine tilemap, welche sich auch scrollen lässt.
Nun werfe ich einfach mal eine Frage in den Raum.
Wenn ich nun mit meiner jump and Run figur oder einem helikopter wie in desert strike über den level jage und die dortigen gegner erledigen will, was wäre die beste art dies umzusetzen?

das zuvor erstellte array welches die map enthält um einen weiteren slot erweitern um dort z.b. gegner zu speichern(etwaige animationen derer ebenso)

und wie kann ich dann die berechnungen ausführen dass der player(egal was das jetzt ist:player, geschoss etc.)
dann dann auch in interaktion durch abschiessen etc. mit diesem oder jenen gegner treten kann?

ich möchte keinen vorgekauten code, sondern lediglich ein paar tips.
vielleicht gibt es auch ein einfach es beispiel dazu in was ich mich einlesen kann.


p.s. problem ist nur weil es ja keine statische map ist sondern eben scrollt...

Abrexxes

BeitragFr, Okt 11, 2013 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde um alle aktiven Objekte die sich bewegen eine imaginäre Box bilden und sehen ob die kollidieren oder nicht. Das ist am einfachtsen und am schnellsten, wenn auch nicht 100% Pixel präzise. Aber so kannst du deine Objekte durch die Gegend jagen wie du willst ohne dich um denn Rest zu kümmern.
[o] [o] (2 Objekte die man sieht, 2 Quadrate die man nicht sieht, kollidieren die= Problem!
Zitat:
ich möchte keinen vorgekauten code


Ok so? Wink
 

PhillipK

BeitragFr, Okt 11, 2013 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die technik die Abrexxes beschreibt ist eine art AABB Smile
Hier mal ein bissl wiki blabla: http://de.wikipedia.org/wiki/H%C3%BCllk%C3%B6rper

Oder anders ausgedrückt:
Du nutzt eine box die deine gegner etc umschließen, damit du per Box-Box kollision (meist reicht simples overlapping) prüfen kannst, ob und was deine gegner / deinen spieler / deine projektiele berührt, ohne das du pixelperfekt prüfst.

Allerdings schreibst du, das du deine gegner in dem array mit speichern möchtest, was für mich bedeutet: Du kannst pro tile immer nur EINEN gegner haben.
Die Tiles sind dann im prinzip genau das: ein viereck was du nutzen kannst, um vorprüfungen zu machen.

Oder noch einfacher: Wenn du zb mit der Maus die tiles anklicken kannst um irgendwas zu machen, dh du bist in der lage die position der tiles zu finden, dann kannst du eben dieses verfahren nutzen um positionen zu bestimmen.

Allerdings verstehe ich nicht ganz was du mit dem scrollen der map meinst.
Bewegst du die blöcke in deinem array, oder sind die daten dort statisch?

Fall 1: Blöcke sind dynamisch im array (vielleicht eine art weltraum-2d-sidescroller?`)
Du wirst auf jedenfall deinen spieler kennen, sowie die anzahl tiles auf dem bildschirm.
Je nach spielerbewegung kannst du als von einer "bildschirmseite" rechnen, auf welchem tile der spieler ist und von diesem auch alles weitere wie projektile ausgehen lassen. In diesem fall musst du dir nur merken, auf welcher position die projektile sind und zb den nächsten tile in bewegungsrichtung prüfen.

Fall 2: Blöcke sind statisch im array und du bewegst eine kamera oder ähnliches.
In diesem fall ist es ratsam, die renderfunktion der blöcke so anzupassen, das sie sich auf den globalen 0,0,0 punkt beziehen.
Dann kannst du realtiv einfach über die absolute position deiner projektile und gegner und auch des spielers an die tiles rankommen, indem du durch die tile-breite und tile-höhe teilst.

AnniXa

BeitragFr, Okt 11, 2013 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
am besten hast du einen map array und zeichnest nur die sichtbaren tiles.

üblicherweise hat man wohl zwei variablen welche sie aktuelle sicht position halten.

dann errechnest du anhand der bildschirmbreite / breite eines tiles, wieviel tiles auf den screen von links nach rechts passen, selbiges auch von oben nach unten.

dann kann man sich ganz leicht eine for schleife schreiben die relativ zum sichtpunkt den bereich der map zeichnet.

also etwas wie

for x = 0 to sichtbare tiles
for y = 0 to sichtbare tiles
zeichne tile, an x*tilebreite, y * tilebreite
aus dem array holst du aber nicht einfach x, sondern x+sichtpunktx , und bei y dasselbe
dazu dann vor dem zeichnen noch ein if ob x+sichtpunktx nicht kleiner als 0 und. nivht grösser als dein map array ist.
next
next

dies ist glaube ich die simpelste tile map variante, für ein weicheres scrolling statt immer nur in tile schritten kann man das etwas modifizieren. Wink

das mit den objekten und interagieren kann man vielseitig lösen und bedarf aber zuvor einer guten überlegung.
+ können objekte sich immer nur schrittweise oder frei bewgen (schrittweise wie bei pokemon z.B immer 1 tile pro schritt)
das z.b. erleichtert das ungemein
+ wenn ja, können mehr als 1 objekt die selbe position einnehmen?
und so weiter, am besten vorher gut durchdenken, damit man eine zugeschnittene verwaltung dafür schreibt

bei shcrittweiter pokemon style bewegung lohnt sich z.b. eher ein seperater array für die objekte, der quasi über die map gemalt wird.

bei freier bewegung lohnt sich eher eine liste.


wobei ich mich mit blitzbasic nicht so auskenne, da ich ewig damit nixmehr gemacht hab seit ich mit blitzmax angefangen habe aber ich denke die herangehensweisen sollten noch so anders sein


edit: malwieder hab ich die frage falsch verstanden xD aber egal vielleicht hilft mein geschreibe trozdem irgendwem
|moonForge|
Ich bin Pokémon Meisterin seit 1998!
 

mpreu

BeitragFr, Okt 11, 2013 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@AnniXa:du gehst glaub ich komplett am topic vorbei...das was du beschreibst habe ich bereits.

Also ich habe eine tilemap....größer als der screen.
Eine Figur auch wenns grad nur ein block ist.
Beim links oder nach rechts bewegen verschiebt sich die tilemap.

Nun möchte ich aber wenn sie die tilemap verschiebt und ein z.b. gegner in den zeichenbaren bereich des screens kommt sich sozusagen dessen interaktion steuern lässt.

Bevor dieser bereich der tilemap in den sichtbaren bereich kommt ist logischerweise jede handlung unlogisch.

Also ich versuch es mal anhand eines beispiels zu erklären.
level ist da, player auch...
ohne scrolling ist klar, prüf ich alles über die bildschirmkoordinaten.
Wenn ich nun die map scrolle und in einem tile der gegner starten soll, aber erst wenn er auch sichtbar ist....das ist das problem.

okay ich geb mich geschlagen...ich nehm vorgekauten code...
tilemap steht, scollen dieser auch, player ist derzeit statisch an einer position und rest der tilemap bewegt sich beim bewegen(dies wird noch abgeändert, aber ich fang erst das ganze an)
vielleicht gibts auch irgendein example für sowas

Hubsi

BeitragFr, Okt 11, 2013 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Was Du (wenigstens) für Deine Gegner brauchst sind relative Positionen um sie frei zu bewegen. Sprich irgendwas in der Richtung:

BlitzBasic: [AUSKLAPPEN]
rel_x = tatsächlich_X - wie_weit_ist_gescrollt


Wie weit gescrollt ist kannst Du ja leicht errechnen mit einer Multiplikation aus "verschobenen" Tiles * Tilegröße und einem eventuellen Pixelwert wenn Du weiches Scrolling hast. Dann bewegst Du den Gegner auf seinen tatsächlichen Pos-Werten und stellst ihn nur auf den relativen dar wenn diese innerhalb Deines Fensters sind, bzw bewegst ihn auch nur dann falls das Dein Ziel war. Sprich rel_x > -32 And rel_x < x_auflösung+32 (ich gehe hier von einer 32 Pixel breiten Spielfigur aus). Für Y ist das ganze simultan.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

AnniXa

BeitragFr, Okt 11, 2013 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
yo mein erster post ging daneben da ich die frage nicht gerafft habe.

also du kennst den sichtbaren Ausschnitt der map, der aktuell zusehen ist?
wenn ja brauchst du ja nur zu prüfen ob die Positionen deiner Objekte im sichtbaren Bereich sind.
also ob x < als linke ecke vom sichtbarem Bereich und x > rechte ecke vom sichtbarem Bereich ist, und dann entsprechend das objekt behandeln
|moonForge|
Ich bin Pokémon Meisterin seit 1998!
 

mpreu

BeitragFr, Okt 11, 2013 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ah annixa...i understand...
dank dir erstmal
 

PhillipK

BeitragFr, Okt 11, 2013 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde es in richtung "megablöcke" lösen, aber das ist übertrieben, wenn wir von einer hand voll instanzen reden.
Also wenn du mehr wie 10.000 einheiten planst, solltest du weiterlesen, ansonsten nicht:

Sektoren
Teile deine map in gedachte "megablöcke" ein. Diese Sektoren sind für teilausschnitte der map verantwortlich und umfassen zb 8x8 blöcke (oder auch 8 blöcke breit, von oben nach ganz unten)

Deine gegner können nun in einer verketteten liste, arrays oder sonstwas mit den sektoren assoziiert werden. Grob also: Der gegner weiß, in welchem sektor er ist (oder besser: Der sektor weiß, welche gegner in ihm sind)

Geht du nun durch und zeichnest die objekte, kannst du dir auch gleich die sichtbaren sektoren merken und hinterher ihre gegner die sie halten updaten.
ABER:: Mach dir die mühe nicht, wenn du nur ne hand voll gegner planst. Eine solche technik lohnt sich wirklich nur wenn a) Deine map eh schon in sektoren unterteilt ist oder b) du absolute unmengen an gegnern planst und somit ein durchlaufen aller gegnerinstanzen zuviel CPU kostet.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group