[GELÖST] Tilemaps - Aktionsfelder erstellen?
Übersicht

CO2ehemals "SirMO"Betreff: [GELÖST] Tilemaps - Aktionsfelder erstellen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Ich habe mal wieder ne frage: Ich habe eine Tilemap, und möchte, das einige tiles davon aktionsfelder sind. leider habe ich keine ahnung, wie ich das realisieren könnte, zumal je nach aktionsfeld eine neue tilemap geladen wird. Ich gebe mal ein beispiel: Der spieler rennt auf der hauptmap rum. nun steht er vor einem getileten haus. er geht auf das aktionsfeld, und der innenraum des hauses wird geladen. die hauptmap verschwindet, der innenraum wird sichtbar. dann geht er wieder aus dem haus raus, und stellt sich vor ein anderes haus. hier wird auch wieder der innenraum geladen, welcher sich aber vom anderen haus unterscheidet. also: 1. Wie kann ich ein aktionsfeld als solches "definieren"? 2. Wie kann ich dem Rechner sagen, welche tilemap zu laden ist? ganz nebenher: 3. wie kann ich bei tilemaps eine pixelangabe machen? also wenn ich ein objekt (meinetwegen einen baum) platzieren will, wie finde ich raus, welchen pixel ich nehmen muss? mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
- Zuletzt bearbeitet von CO2 am Mo, Sep 26, 2011 21:06, insgesamt einmal bearbeitet
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab das so gelöst, das ich jedem Feld einen String mit geben, mit der Map die es laden soll. Wenn der String leer ist, dann passiert halt nichts.
Nun überprüfe ich jedes mal wenn der Spieler gezeichnet wird (genau genommen nur wenn er sich gerade bewegt hat, aber das ist ja nicht so wichtig) ob x mod Tilesize = 0 und y mod Tilesize = 0 ist. Wenn er sich nicht pixel weise bewegt, dann musst du halt eine kleine Toleranz einbauen. Sollten die beiden Bedingungen Stimmen, neue Map laden und fertig. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist ein klares Anwendungsgebiet für die BMax-Funktionspointer!
Du speicherst jedes Tile als Objekt in einem zweidimensionalen Array (Bild allein reicht nicht). Als ein Field gibst du das Bild an und als ein weiteres eine Funktion für die Aktion. GGf. kannst du so auch Aktualisierungen von Tiles (z.B. Graswachstum) implementieren. In diesen annonymen Funktionen lässt du den Rechner einfach eine neue Tilemap laden. Woher die kommt, sei dir überlassen (entweder aus einem anderen Array oder aus einer Datei). Die Kollisionsüberprüfung, ob das Aktionstile betreten wurde, hat Ana hervorragend berschrieben. BlitzMax: [AUSKLAPPEN] Type tile ZEVS |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das was du dir vorstellst, würde ich ganz stumpf als EventTrigger bezeichnen.
Meine umsetzung dafür wäre.. mh wie erklär ich das denn mal ![]() Ich würde es via Type machen. BlitzMax: [AUSKLAPPEN] Type TEventTrigger Erstmal so grob ![]() Diesem Trigger kannst du zb ein Field obj:Object und ein field id:Int mitgeben. Nun ist es wichtig, das du solche 'aktionsfelder' entsprechend rausfinden kannst. Am besten wäre es, wenn du eine art LandschaftsTile hast wo jede kachel ihr eigenes objekt hat. Allerdings reicht es, wenn du die entsprechdenen teile finden kannst und für dich auch weißt, wo was gemacht wird. Wenn du die Trigger-objekte zuweist, kannst du das objekt zb als string nutzen (da string Objekt ist und somit ein extend von Object) Dort schreibst du deine anweisung rein - zb nameDerMap Ich weiß nicht genau ausm kopf raus, wie man eine funktion mit parameter pointern konnte, aber irgendwie ging das ![]() Du hast also deine Trigger-objekte und weißt, wo was zum einsatz kommt. Als funktionspointer hast du zb die Funktion "ChangeMap" hinterlegt. BlitzMax: [AUSKLAPPEN] Function ChangeMap(ev:TEventTrigger) Tja und nun.. musst du einfach noch für jeden MapTrigger eine data erstellen. Ich nutze das immer so, das das Objekt sich selbst als parameter übergibt, damit man aus der funktion heraus zugriff auf die Felder hat. Andererseits ist man an eine statische anzahl an parametern gebunden, was ich persönlich weniger bevorzuge. Du kannst in ZielMap zb auch einen gewissen platz reservieren, zb 8 zeichen (8 byte), welche du mit zielMap[0] etc ausliest und per "Local x:short = (a shl 8) | (b)" und "Local y:short = (c shl 8) | (b)" wieder zusammen setzt. So kannst du in dem string gleichzeitig auch integer etc speichern (natürlcih vor dem mapladen abschneiden!) und direkt den spieler an die position setzen. edit: Ach ZEVs hatte schon die selbe idee. Ich wurde beim schreiben unterbrochen, deshalb hat meine antwort etwas gedauert :3 Und - nicht zu vergessen: Sobald der spieler oder was auch immer den Trigger auslösen soll, das feld betritt, muss die Methode "Activate()" ausgelöst werden. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Lösungen gereichen Euch zu Ehren!!!
aber dies ist ein Anfänger-Forum, und hier muss die Lösung auch so sein, dass ein Anfänger sie nachvollzierhen kann! Ana's Vorschlag reicht vollkommen aus! Bei der Umsetzung kommt es nun darauf an, wie Du die MAP im Programm verwaltest. Als Array oder über Types? Lass mal den Code zum Laden der Tilemap sehen, dann kann man dir auch konkrete Vorschläge machen , wie du das ganze um Aktionsmöglichkeiten erweitern kannst. Angenommen die Tiles sind bei Dir so organisiert: BlitzMax: [AUSKLAPPEN] Global Map%[40,40] dann bietet sich an, parallel ein Stringfeld mitlaufen zu lassen: BlitzMax: [AUSKLAPPEN] Global Map%[40,40] , ActionMap$[40,40] oder etwas eleganter: die Map um eine weitere Dimension zu erweitern: BlitzMax: [AUSKLAPPEN] Global Map[40,40,2] |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein dreidimensionales Int-Array ist weitaus weniger elegant als ein zweidimensionales Type-Array. Auch zwei Arrays parallel zu führen finde ich in diesem Fall sehr fragwürdig.
Natürlich ist das die Beginners-Corner, aber es gibt nun mal eine Hand voll Leuten, die der Meinung sind, Hilfesuchenden von Anfang an die korrekte Antwort zu geben. Und auch diese kann man so formulieren, dass sie für Anfänger nachvollziehbar ist. Zudem gibt es Themen, um die kommt kein Anfänger herum. Und sowieso denke ich nicht, dass Type-Arrays CO2 überfordern werden. Die 3. Frage verstehe ich nicht ganz, CO2. Willst du von der Mausposition (in Pixeln) zu den Array-Indizes gelangen? Dann einfach Code: [AUSKLAPPEN] xIndex = (MouseX()-kartenOffsetX) / tileBreite Die Ganzzahldivision alleine genügt, um das Resultat immer abzurunden und so bis an den äussersten Tile-Rand das richtige anzupeilen.
mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Um mal meinen Senf zum Off-topic krams zu geben:
Klar, anfängerforum. aber nicht jeder anfänger mag anfänger bleiben ![]() ich gestehe, es mag oft vorkommen, das man themen, die man schon hunderte male selbst behandelt hat, etwas leichter von der hand beschreibt, als es gefordert ist. Ich für meinen teil setze immer eines vorraus: Der hilfesuchende sollte nicht die scheu haben, nachzufragen. Als ich in blitzmax groß durchgestartet bin, gab es viele, im nachhinein betrachtet, nichtige fragen die mich gequählt haben. aber ich habe immer zu nachgefragt, auch wenns am ende peinlich war, wie einfach das alles doch ist. Nun versuche ich möglichst vielen leuten zu helfen und dem board ein klein wenig von dem zurückzugeben, was ich bekommen habe: Geteilte erfahrungen und ansätze. Auch jetzt noch poste ich sachen ins Beginners Corner, wenn ich glaube, das diese frage elementar ist. Auch wenn ich schon ne ganze ecke mehr weiß wie zb vor 2 jahren ![]() Also vielleicht weiß auch CO2 schon den ein oder anderen Kniff, den andere nicht kennen. @CO2: Wenn du etwas nicht verstehst, frag nach. Keine scheu, so einfach ist das. Auf fragen gibt es antworten, auf unklarheiten erklärungen. Und wenn doch wer eine biestige bemerkung macht, lass dich davon nicht einschüchtern - aber allen vor weg: Bring eigeninitiative und lernbereitschaft mit. ![]() @Midimaster: Ich muss zustimmen, die laderoutine wird einiges helfen können. Mich persönlich würde auchnoch das rausfinden einens Tiles interessieren. Es gibt 20millionen wege, seine Koordinaten etc zu organisieren ^^ --- Und nochetwas: Zitat: ganz nebenher:
3. wie kann ich bei tilemaps eine pixelangabe machen? also wenn ich ein objekt (meinetwegen einen baum) platzieren will, wie finde ich raus, welchen pixel ich nehmen muss? Entweder wird gefragt, welches bild gezeichnet werden soll, das ist eine frage, die mit der Laderoutine für die Tilemap an sich erledigt werden kann. Oder aber es wird nach der genauen position gefragt, wo der Baum denn hingezeichnet werden soll. Auch das kann, wahrscheinlich, relativ leicht beantwortet werden. Mein größtes problem war immer die übersetzung der Screenkoordinaten in Weltkoordinaten - das ist eine sache der Organisation. Poste uns doch einmal: 1) wie wird die spielerposition bestimmt? 2) wie findest du raus, welches tile unter dem spieler ist? (findest du das atm überhaupt schon raus?) 3) wie wird deine Map geladen / nachgeladen? |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich fühle mich geschmeichelt, aber dennoch halte ich meine Lösung auch für anfängergerecht (wenn auch nicht unbedingt meine Erklärung).
Vielleicht sollte ich es mit einer graphischen Darstellung versuchen: Leicht hellgrün hab ich Funktionen dargestellt, die Tiles sind dagegen dunkelgrün. Links oben sieht man die graphische Verdeutlichung des tile-Types (aktion + Bild), im unteren Teil der Aufbau der Tilemap mit der referenzierten Funktion rechts oben. Das globale Array Tilemaps enthält - wer hätte das gedacht - alle Tilemaps. Das Speichern der Tilemaps in einem Array hat den Vorteil der schnellen Ausführungszeit und der internen Speicherung von Tilemaps (wie viele Spiele gibt es, wo man in ein Haus gehen kann, alles auf den Kopf stellen kann, rein und wieser raus geht und alles ist so wie vorher). Diese Funktionsreferenz "->2" hat PhillipK aber bereits besser durch Trigger gelöst. Wieso soll man mit BMax programmieren, wenn man sich nur auf die primitive BB-Syntax beschränkt? OOP und Funktionsreferenzen sind ein Segen - auch für sog. Anfänger. Bzw.: Midimasters Ansatz mag am einfachsten zu verstehen, am besten erklärt und vorerst am einfachsten zu implementieren sein - aber später wird es dann schwierig, wenn man an den Ausbau denkt, denn nicht alle Aktionsfelder müssen auch automatisch Türen sein (Schalter, Items etc. sind auch möglich). Mit dem OOP-Ansatz ist diese Implementierung kein Problem, bei Midimasters dagegen werden die Strings komlexer, müssen interpretiert werden, was man mit ein paar annonymen Funktionen schnell weglassen kann (natürlich nur mit PhillipKs Trigger-Engine). ZEVS |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bedanke mich herzlich für die zahlreichen Antworten und gleichzeitig entschuldige ich mich, das ich erst jetzt zurückschreiben kann. ![]() @ Ana: Erstmal danke dir ![]() Zitat: Ich hab das so gelöst, das ich jedem Feld einen String mit geben, mit der Map die es laden soll. Wenn der String leer ist, dann passiert halt nichts. Was meinst du denn mit "Feld"? ein Array-Feld oder ein Type-Feld? ![]() Zitat: (...) Sollten die beiden Bedingungen Stimmen, neue Map laden und fertig. Das wäre jetzt schon die Kollision InGame, woll? ![]() @ ZEVS: Ok, auch dir danke für die Hilfe, - 1. Post: Jetzt habe ich einige Fragen zum Code: Was macht diese Funktion? BlitzMax: [AUSKLAPPEN] Function loadTilemap1() Was macht die Funktion "action()" im tile-Type? Also ist sie quasi eine kennung der aktionstiles, oder enthält sie code, welcher beim betreten eines aktionsfeldes ausgeführt wird? Was heißt "teleporterImage", bzw. wofür steht es? - 2. Post: Welche tiles wären denn aktionstiles? @ PhillipK: Auch dir danke ich für die Hilfe ![]() - 1. Post: Immer diese Types ![]() ![]() was macht die Funktion "func()"? wofür steht "ev"? (Weil du das öfter im Code hast) was macht die Zeile "Self.onActivate(Self)" Das wären jetzt die allerwichtigsten, der Rest klärt sich, wenn ich die befehle kenne (Ich bin noch nicht so weit, lese nämlich parallel ein Tutorial, und da bin ich gerade bei "Method") ![]() - 2. Post: Zitat: @CO2: Wenn du etwas nicht verstehst, frag nach. Siehe oben ![]() Zitat: 3. wie kann ich bei tilemaps eine pixelangabe machen? also wenn ich ein objekt (meinetwegen einen baum) platzieren will, wie finde ich raus, welchen pixel ich nehmen muss? Da wollte ich wissen, wie ich einen Baum oder andere Objekte an einem pixel genau zeichnen kann. Also ich wollte wissen, wie ich herausfinde, wie die pixelkoordinaten sind. wenn ich also z.b.: eine tilemap 10 x 10 tiles groß habe, möchte ich den pixel herausfinden, der sich in der mitte des tiles an posx = 2 und posy = 5 befindet. Wie geht das?
Zitat: 1) wie wird die spielerposition bestimmt? Wie meinst du das? ob sich der spieler pixelgenau oder tilegenau bewegt? Wenn ja: pixelgenau ![]() Zitat: 2) wie findest du raus, welches tile unter dem spieler ist? (findest du das atm überhaupt schon raus?) Das habe ich bisher noch nicht herausgefunden ![]() ![]() Zitat: 3) wie wird deine Map geladen / nachgeladen? in einem Array, welches soviele felder hat, wie es maps gibt. dann wird einfach vor der hauptschleife eine For - Next schleife gemacht, in der das array mit den maps gefüllt wird. Oder wolltest du jetzt den Code haben?
@ Midimaster: Natürlich auch dir Besten dank! ![]() Zitat: Lass mal den Code zum Laden der Tilemap sehen, dann kann man dir auch konkrete Vorschläge machen , wie du das ganze um Aktionsmöglichkeiten erweitern kannst. Habe den noch nicht in eine funktion gepackt...: BlitzMax: [AUSKLAPPEN] Global map:Int[19, 19]Das ist jetzt der Grundcode, so wie ich ihn hatte (ohne die aktionstiles). Zum tilemapfile (.tmd - Datei): Diese ist so aufgebaut, das erst map_width und map_height als int eingetragen sind, danach die jeweiligen "IDs" im tileset als byte. Zitat: dann bietet sich an, parallel ein Stringfeld mitlaufen zu lassen: Das würde dann die anderen Map-Pfade enthalten, oder wie?
Zitat: oder etwas eleganter: die Map um eine weitere Dimension zu erweitern: Nur zum Verständnis: "0" wäre kein Aktionsfeld, "1" wäre ein aktionsfeld, oder wie? Und wo wird der map-pfad gespeichert?
@ Holzchopf: Auch dir Danke. Zitat: Willst du von der Mausposition (in Pixeln) zu den Array-Indizes gelangen? Siehe Antwort PhillipK ![]() Ich hoffe ich habe keinen Vergessen, wenn doch, laut "Hier" schreien, dann werde ich das ändern ![]() mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du die Basics wie Maus- und Spielerposition noch nicht raus hast, starte mit weniger. Fang mit einem simplen, unbewegtem 2D Array an und benutzte die BlitzBasic RPG Tutorials. Kümmere dich um die Grundlegenden Dinge - dann erst arbeite dich zu größeren Aktionen hoch. | ||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beides natürlich, ich würde ein Array von Types verwenden. Mit dem Array kann man durch Division mit Rest leicht die Position bestimmen ohne alle Felder ablaufen zu müssen, mit dem Type kannst du verschiedene Elementartypen verwenden. Denke es ist einfach super unbequem seinen Maps nur nummern zu geben und langsam (und irgendwie auch einfach zu wider) seine Koordinaten als String zu speichern.
Ungefähr sowas: BlitzMax: [AUSKLAPPEN]
So ungefähr hätte ich es gelöst. Funktionspointer und sowas sind zwar schön und gut, aber es geht halt auch so und ich find es erstmal deutlich einfacher wenn man das Thema nicht kennt und nur eine Antwort will. Anderseits kann es sich bestimmt lohnen sich damit zu beschäftigen (auch wenn es wichtigeres gibt). |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@CO2
danke für den Lade-Code. Jetzt kann man sehen, wie Du die Map in deinem Code "verwaltest". Das dachte ich mir schon, dass Du es mit einem ARRY machst: Map[x,y] Zwei Arrays Das Stringfeld ist die gedanklich leichteste Erweiterung deines Codes. Dabei läuft einfach ein zweites Feld neben dem ersten her. Es enthält diesmal halt nicht die IDs, sondern z.b. MapPfade, ActionFelder oder was sonst noch auf einem Feld passieren könnte. Es muss auch nicht unbedingt ein Stringfeld sein, sondern kann auch ein INTEGER-Feld mit neuen IDs sein. Du lädst es auf die gleiche Art wie deine Hauptmap aus einer zweiten Map-Datei BlitzMax: [AUSKLAPPEN] ActionMap:Int[19,19] So hast Du eine zweite Map, die für jede Position auf dem Original Map-Feld eine mögliche Action bereithält. die Actions sind wieder nur IDS, die dann in einer SELECT/CASE zu den dort genau beschriebenen Actions führen. Dabei ist es Dir überlassen, welche Action dort durchgeführt wird. Das können Map-Wechsel sein, oder auch kleine Animationen (Explosionen ..., geheime Felder mitten im Gras, bei denen dann ganz wo anders in der Map was passiert ... , Ein dreidimensionales Array statt nun 2 oder gar 3 (falls dir noch was an Erweiterung einfällt) Arrays nebeneinander zu vewalten, kann man auch geschickt alles in ein gemeinsames Array packen. Dazu erhält das Array eine dritte Dimension: BlitzMax: [AUSKLAPPEN] Global Map:IN[19,19,2] Anders als Du glaubst sind aber alle Tile-Daten immer in: BlitzMax: [AUSKLAPPEN] Map[X,Y,0]
und die Action-Daten in: BlitzMax: [AUSKLAPPEN] Map[X,Y,1]
Die 0 und die 1 sind noch keine Werte, sondern nur die Nummer der "Unter-Map", so wie wir vorhin auch zwei Maps hatten. Die Tile-Map ist Untermap 0, die ActionMap ist Untermap 1. Die eigentlichen IDs sind Werte in den Array-Zellen dort: BlitzMax: [AUSKLAPPEN] ' Tile-Map: Die LadeRoutine kann so wie im ersten Beispiel gelöst werden: BlitzMax: [AUSKLAPPEN] Global ActionMap:TStream = ReadFile("data\ActionMap.tmd") du kannst aber die Actions auch punktuell aus einer Text-Datei nachziehen, da ja wahrscheinlich sehr wenige Felder Actions erhalten sollen: BlitzMax: [AUSKLAPPEN] Global ActionListe:TStream = ReadFile("data\ActionListe.txt") Types statt Array-Dimensionen Ich weiss nicht ,wie sicher Du mit TYPES bist. Aber man kann mit Types jedem Feld beliebig viele "Eigenschaften" geben. Der Vorteil: fällt einem später eine weitere "Eigenschaft" ein, dann kann man sie sehr leicht erweitern. Bisher habe Deine Felder folgende Eigenschaften: X Y ID Action Ana hat gleich noch... Begehbar Image MapLink dazugenommen... Es wäre ja durchaus denkbar, dass ein Feld zwar das gleiche Bild, aber unterschiedliche Eigenschaften besitzt. Etwa eine Mauer, die durchlässig ist, oder ein See, auf dem man laufen kann, oder Sand, in dem man einsinkt, etc... Daher zwei Eigenschaften "Image" und "ID". Mit "Begehbar" wirst Du die ständigen Abfragen los, bei welcher ID eine Begehbarkeit vorliegt. Ab sofort "weiss" jedes Feld, ob es begehbar ist. usw.... Code-technisch löst Du TYPES so: BlitzMax: [AUSKLAPPEN] Type Feld |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ohjemine, tut mir leid das ich mal wieder einfach stumpf vor mich hingeredet hab ![]() Ich erklärs mal etwas besser.. Vorraussetzung ist, das du mit dem begriff eines "Objektes" was anfangen kannst - Vergleichbar mit zb. Java. Ein Blitzmax-Type (also ein beliebiges objekt) unterstützt eine schier unbegrenzte anzahl an werten die du als päckchen speichern kannst. Unter anderem ist auch möglich, funktionen zu "verlinken" (stells dir wie eine art Hyperlink in WWW vor. Du rufst es auf und kommst beim ziel an ![]() BlitzMax: [AUSKLAPPEN] Field onActivate(ev:TEventTrigger)
Field beschreibt, das du ein weiteres feld in deinem Objekt haben möchtest. Der Typ ist hier Int() (glaube ich) -> Funktionen werden indirekt als Integer-pointer gehandhabt. Das ermöglicht es dir, deinen Hyperlink in das Feld "onActivate" einzuspeichern. ev:TEventTrigger ist der Parameter der funktion. Ich bin mir nicht ganz sicher, wie es genau ist, ein Funktion mit parameter zu pointern, ich probiers gleich mal aus und schreib dir den Testcode ![]() Da ev:TEventTrigger beschreibt, das deine funktionen die du verlinken möchtest als ersten parameter einen Parameter vom typ 'TEventPointer' erwartet (ev ist hierbei ein willkürlich gewählter name ! wichtig ist das :TEventPointer), musst du auch eben solche funktionen da reinschreiben. Hier mal der Test: BlitzMax: [AUSKLAPPEN] SuperStrict '-> Superstrict muss immer sein, zwingt zum ordentlichen Programmieren. Das ist nichts, was man auf anhieb verstehen muss, zumal ich nicht der beste erklärkünstler bin. Bitte lass dich nicht von den Seltsamen namen verwirren, ich habe sie absichtlich gewählt, damit du siehst, das diese in keinem zusammenhang stehen. Um das ganze nun noch einmal grob mit worten zu beschreiben, wie du es für dein Problem nutzen könntest: Mit dieser Grundstruktur 'TEventTrigger' kannst du eine art schalter programmieren. Für jede sache kannst du einen TEventTrigger anlegen, die data füllen und die funktion umleiten (hey, der Hyperlink!) Bei einem geplanten TileSetwechsel / Mapchange / was auch immer könntest du nun zb für jeden Tür-TEventTrigger die daten in das feld 'data' reinschreiben und die funktion 'WechselMap' ausführen. Wichtig ist hier, das das objekt als Parameter übergeben wird, damit die funktion 'WechselMap' später zugriff auf die zieldaten hat. Allerdings könnte man damit auch etwas anderes machen. Zb einen TEventTrigger erstellen, welcher als data -1 mitbringt (bzw da ist dann besser ein Field value:Int zu empfehlen - ich habe grade keine ahnung, wie man am gescheitesten einen integer-wert in ein object einspeist). Dieser Trigger kriegt nun die funktion 'Mach_mir_aua" aus, was dem spieler die -1 an Hp abzieht. Und schon hast du eine falle ![]() ABER: Du brauchst eine möglichkeit, zu wissen, wann und wo welcher TEventTrigger platziert wird. -------------------------------------------------------- Nun gehe ich mal an deinen Lade code ran - ich finds gut das du bereits gebrauch von eigenen Lade-routinen machst ![]() Ich weiß ich weiß, ich habe schon weiß gott genug getippt. Aber egal ![]() nun, dein system sieht bis jetzt noch leicht erweiterbar aus. Aber vorsicht: Es kann sein, das du viel in deinem Code ändern musst , grade wenn du öfters auf die id zugreifst! (also zb Map[x,y] um die id zu erhalten!) Ich beschreibe nun den weg, wie man das ganze etwas variable gestalten könnte. Zu ersteinmal lagern wir die werte, die du mit deiner map verbindest, in ein Objekt aus. BlitzMax: [AUSKLAPPEN] Type TTile Und dazu erstellen wir noch einen Landschafts-Type - also eine eigene Landschaftsinstanz. Hier mal eine vorgefertigte version: BlitzMax: [AUSKLAPPEN] Type TLandschaft Ich habe lediglich deine Laderoutine in die Funktion ausgelagert. Ansonsten ist es fast identisch. Nun zum unterschied: Du kannst nun über BlitzMax: [AUSKLAPPEN] Global map:TLandschaft = TLandschaft.LoadMap("data\Tileset.png", "data\map.tmd") deine map 'Laden' mehr Globale variablen brauchst du nicht! ![]() TLandschaft ist ein Objekt, LoadMap die funktion. Der Punkt gibt an, das du auf die funktion LoadMap INNERHALB von TLandschaft zugreifen möchtest. Eine methode funktioniert ähnlich, allerdings ist sie instanzgebunden. Das heißt: Hätte 'Type TLandschaft' nun noch zb 'Method Draw()' drinstehen, könntest du mit BlitzMax: [AUSKLAPPEN] map.draw() eben diese draw-methode ausführen lassen. Objekte des Types 'TTile' könnten nun eben diese TEVentTrigger halten. wenn ein Trigger vorhanden ist, dann könnte dieser aktiviert werden, sobald der Spieler "darüber" ist - ganz nach belieben. Methoden haben hier den vorteil, das sie auf die eigenen werte von Map zugreifen können. Aber bitte bitte bitte! Tausch nicht einfach etwas aus! Schau hier drüber, wenn du es verstehst kann ich mirn Keks freuen - ich konnte einmal was erklären. Wenn nicht - nicht einfach austesten! Das ist schon eine größere änderung an deinem Code und könnte mit Restlichen teilen nichtmehr Kompatibel sein. Wenn du ein solches System einbauen möchtest, ersteinmal sicherheitskopie anfertigen und bei jedem Detail nachfragen, was unklar ist. Erst wenn du den umgang verstanden hast, übernehmen ![]() Gruß, der viel schreibende (und kränkelnde) Phillipk ![]() |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Und entschuldigung, das ich erst jetzt zurückschreibe (wenig zeit, neues Schuljahr hat begonnen...). Ich danke wieder für die Zahlreichen Antworten. @ Xeres: Ich versuche ja gerade dieses Spieler position, maus Position auf einer Tilemap zu verstehen... Das RPG Tutorial von Rob's site habe ich fast durch, zumindest bis zu dem punkt "Tilemap laden". Und dann kommt das getue mit der Positionen, und da blicke ich nicht durch... ![]() @ Ana: Ok, also wird die map anstatt mit einem Array vom typ "int" mit meinem definierten Typ gebildet. @ Midimaster: Zitat: Zwei Arrays Auf die Idee wäre ich gar nicht gekommen ![]() Zitat: Ein dreidimensionales Array An diese Methode hatte ich auch gedacht, nur wusste ich nicht, wie das aussehen würde...
Zitat: Types statt Array-Dimensionen Das wäre wohl wirklich die eleganteste Lösung. Und dann wird für die Tilemap wie Ana schon schrieb einfach ein Array mit dem Type als Typ deklariert.
@ PhillipK: Zitat: (und kränkelnde) Phillipk - Gute Besserung ![]() Ich danke dir für diesen wirklich sehr ausführlichen Beitrag. Ok, das grundzeug vom Type kriege ich hin. Ich war ein wenig verwirrt, weil du im 1. Post die variable "ev" benutzt hast, ich dachte das wäre irgendwie eine Konstante, vorgeben von BMax. Jetzt ist auch der Groschen zu "onActivate" gefallen ![]() Zitat: Es kann sein, das du viel in deinem Code ändern musst Ich denke ich werde den Code nochmal neu schreiben, habe jetzt ja soviele erkenntnisse gesammelt.
mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nimm Stift & Zettel zur Hand, und schreib bzw. mal dir das Problem auf. Berechne händisch, was im Programm passieren soll. Auf den Code starren und andere Werte ausprobieren hilft nicht immer und überall dem Verständnis. Wenn du dann erfasst hast, welchen Punkt genau du nicht mehr verstehst, lässt sich da um so leichter helfen.
Ohne Grundlagen wirst du nicht weit kommen. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group