RPG verschiedene maps zeigen[2D]
Übersicht

![]() |
DottakopfBetreff: RPG verschiedene maps zeigen[2D] |
![]() Antworten mit Zitat ![]() |
---|---|---|
HI !
Ich hab mal ne Pause vom meinem aktuellen Projekt gebraucht und mir einfach so mal ne 2D Tilemap - engie angeguckt / also ein RPG (das nennt man doch so?). Alos ich hab momentan einen mapeditor(alle tiles in einem bmp / 3969 tiles zum bearbeiten / tile je 32x32 ). Das laden/speichern und das verwenden in game funtz einwandfrei, doch ich möchte mehrere "sektoren" haben. Also sollte ich am mapende angelangt sein, sollte der alte sektor gelöscht werden und der neue geladen werden. Hab auch scho so inetwa ne Vorstellung wie des funtzen könnte, wollte aber vorher fragen ob das ned vielleicht einfacher geht. Ok erstmal zu meiner Theorie: bei spielstart alle karten aus dem Map-Ordner einlesen dann teile ich die komplette "welt" in Sektoren (Sektor1,sektor2,sektor3...) und dann in der Schleife zeigen bzw löschen : Code: [AUSKLAPPEN] ;die map 1 laden datei1=ReadFile("gfx\map\map1.map") For x=0 To 81 For y=0 To 49 map1(x,y)=ReadLine(datei1) Next Next CloseFile datei karte1$ = ReadFile("gfx\map\map1.map") For x = 0 To 81 For y = 0 To 49 tile = ReadLine(karte1$) map1(x,y) = ReadInt(karte1$) Next Next CloseFile(karte$) ; die map 2 laden ; usw ;sektor1 = true ;sektro2 = false ;usw ;schleife -------------- ;bei verlassen des sektors anderen öffnen If sektor1 = true and hero_x <= 32 then cls sektor1 = false sektor2 = true hx = 64 end if ;sektor 2 zeichenen If sektor2 = true then For x = 0 To 81 For y = 0 To 49 DrawBlock tileset,x*32-scrollx,y*32-scrolly,map2(x,y) Next Next end if Ich hab keine Ahnung ob das überhaupt funktionstüchtig ist. Aber ich will ja auch nur wissen wie man es Richtig macht, so ist es eher umständlich.... Kommt der Gedankengang inetwa hin ? (bin total unerfahren mit RPGs) Work Hard go Pro mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja, was bringen dir ganz viele geladene sektoren?
der sinn von solchen lösungen ist doch gerade, dass nicht so viel Speicher genutz werden muss.. Wenn du alles auf einmal lädst, dann bringt dass nix... Zu dem eingentliochen Problem: Willst du denn eine große Welt? oder Teilbereiche, zwischen denen du hin und herteleportiert wirst? Das zweite ist recht einfach, einfach n Teleporter erschaffen, der die Zielmap, die Position und die neue Position enthält.. Das erste ist schon schwerer, da du immer mehrere "Sektoren" gleichzeitig anzeigen und verwalten musst.. |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hätte gerne beides. Ne relativ großen "Abschnitt" mit scrolling und ab nem gewissen punkt soll dan ein neuer Abschnitt kommen.
Ich glaub des wurde bei Pokemon z.B. auch so gelöst, also ne riesen map und ab nem gewissen punkt kommt plötzlich irgendein "druchgangs Gebäude" oder höhle oder was weis ich... auch hab ich das Problem, dass ich in meinem Editor kein scrolling hab (darum hab ich ne auflösung von 2650x1600 ![]() ![]() Kann man vielleicht ne Mischung machen ? wie geht des mit dem Teleportieren? (einfach n Teleporter erschaffen, der die Zielmap, die Position und die neue Position enthält.. ) wie wird das realisiert ? Ach ja noch was, wie mach ich den das mit Gebäuden und deren Zimmern? mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am besteb machst du dir für jeden Teleporter ein Type.
Also erstellst du einen. Fals du damit nicht umgehen kannst, einfach erstmal eine variable. Bzw. 6 ^^ : Wo steht der Teleporter? -> X und Y Variable Aber auf welcher Map? -> Map Variable Und auf welcher map soll ich raus kommen? -> Ziel mal und Ziel X und Y. Dann ksnnst du z.b. prüfen: if playerx = x and playery = y and playermap = map then new_map = new map newx = newx... und so weiter ![]() hoffentlich konnte ich dir helfen |
||
.... |
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
genauso, wie dus willst mach ich das in dem spiel, an dem ich gerade arbeite...
Zu einer großen, scrollbaren Map: Die einfachste Methode ist: Du erstellst einfach eine größere map, also zB bei 640x480 und 32x32 Pixel großen Tiles passen 20x15 Tiles auf den Bildschirm. Nun machst du dir aber zB eine 40x30 große Map und du benötigst noch zwei offset-variablen für x und y... wenn du dich nun bewegst veränderst du die offset variablen und zeichnest damit die map an die bestimmten Positionen... Damit du bei großen Maps nicht zu viel zeichnest guckst du dann einfach noch welche Tiles auf dem Bildschirm liegen und zeichnest nur die... So hab ich auch noch 500x500 tiles große maps erstellen können, ohne das es langsam wird, du verbrauchst halt mehr speicher... Da ich aber nur 2 int-layer hab geht das auch noch, aber irgendwann wirds echt viel... Zu dem Teleportieren: Wie gesagt habe ich 2 Layer, einen, der alle Grafiken enthält und einen "Objekt-Layer", in dem Kollisionen und Scripte gespeichert werden (und vielleicht später noch was anderes, mal sehen) Ich hab meine Teleports jetzt über scripte gemacht... Ich hab alse jedem Tile beim Objekt-Layer ne id gegeben (zB. 0 = gar nix, -1 = Kollision, positive werte als id eines scriptes) dann hab ich die scripte in nem array gespeichert und wenn ich auf ein tile mit der ID = 17 (Beispiel) laufe, dann wird der Script mit der Id 17 ausgeführt. Wenn das jetzt ein Teleport-Script ist, dann wird halt teleportiert.. zB: Script: Teleport( x, y, map ) dann wird halt die neue map geladen un der spieler an die Position (x,y) gesetzt... Eingentlich ganz einfach.. Bis jetgzt hat damit alles ganz gut geklappt.. Da ich jetzt Bmax nutze bin ich allerdings gerade dabei das ganze neu zu schreiben, da man mit den neuen arrays zB einfach bessere Möglichkeiten hat... |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für eure antworten, ich merke scho dass ich a wengle umständlich vorgestellt habe ![]() Ich greif jetzt mal auf den Lösungsweg von Meiser Dieb zurück, da ich mich mit Types scho recht gut auskennte und ich mich mit scripts noch nicht beschäftigt habe. OK für die Teleporter einen Type erstellen und Variablen speichern. Also inetwa so : Code: [AUSKLAPPEN] type teleport field tel_x field tel_y field tel_map field tel_target field target_x field target_y end type So und dan muss ich ja denen was übergeben for info.teleport = new teleport info\tel_x = 100 info\tel_y = 100 info\tel_map = karte1$ info\tel_target = karte2$ info\target_x = 200 info\target_y = 100 next Hoffentlich hab ich bis jetzt noch nicht allzu viele Fehler ^^ Dann das ganze abfragen Code: [AUSKLAPPEN] for info.teleport = each teleport if hero_x = info\tel_x And hero_y = info\tel_y and info\tel_map = karte1$ then info\tel_map = info\tel_target hero_x = info\target_x hero_y = info\target_y next Wenn ich des jetzt so betrachte tut mir zwar irgendwie der Arsch dabei weh, aber ich habs so verstanden.. ![]() und nochwas, dass ist ja jetzt nur ein Teleporter Was mache ich denn, wenn ich ein großes Höhlensystem erzeugen will, bauch ich da dan 20 teleporter ![]() mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
erstmal:
Code: [AUSKLAPPEN] for info.teleport = new teleport
So nicht... Wenn dann so: Code: [AUSKLAPPEN] For x = 0 to 5
info.teleport = New teleport Next Aber da es eh sinnlos ist ganz oft den gleichen Teleporter zu erstellen ist das eh blöd... Mach dir doch ne Funktion: zB CreateTeleporter( x, y, map, target, tx, ty ) Was mir auch noch auffällt ist, dass du wahrscheinlich nie bei einem solchen Teleporter teleportiert werden würdest, da die wahrscheinlichkeit, dass dein Spieler genau auf den einen Punkt sehr gering ist (gerade wenn dein Spieler sich auch mal nicht mit Integer-Werten hin und herbewegt...) Da musste dann ne Tolleranz einbauen also Code: [AUSKLAPPEN] if hero_x >= info\tel_x-10 And hero_x <= info\tel_x+10 usw
Dann komm ich nochmal dazu, warum ich dir nicht die Types empfehle: Du musst jetzt in jedem Schleifendurchlauf einemal alle Types durchgehen und deren Variablen mit denen des Spielers vergleichen... Wenn du jetzt viele Teleporter hast oder später auch andere Objekte (zB Fallen oder so) die du auch so anlegst, dann wirst du bald sehr viele Types durchgehen und vergleichen müssen... Bei der Methode, die ich vorgeschlagen hatte wird pro Schleifendurchlauf nur der Eintrag des Map-Arrays geprüft, auf dem der Spieler sich gerade befindet... Mfg Lennart |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ahh Ok !
wenn die Types dafür so schlecht geeignet sind werd ich wohl deine Methode anwenden müssen. Doch leider kann ich mir darunter nicht viel vorstellen also die funktionsweise. Sind diese Scripte notwendig und wie geht das den mit den scripten ? wie binde ich diese in Blitz Basic ein ? Mir fehlt einfach das wissen drumrum. Sprich ich weis immer noch nicht wie ich die anderen Karten überhaupt herholen soll. Soll ich im Map-editior lauter verschiedne Sektoren(map1.map,map2.map...) machen und diese dan bei mapwechsel laden ? Was ich damit meine ist, wie funktionierts es im großen und ganzen eigentlich. Zu den Koordinaten : ich glaub schon, dass ich genau treffe, da ich mich ja immer genau um 32 pixel bewege. Wäre echt nett wenn du mir so einen kleinen gesamtüberblick über das mapwechseln geben könntest. Und vielleicht noch n beispeil was beim "wechsel" passiert. (ka : alte_karte löschen, neue_karte zeichnen, player_koordinaten). mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, im großen und ganzen war das, was du unten geschrieben hast odhc schon richtig...
Stell dir vor, du schreibst n PacMan... Da haste dann Level1... Wenn du das geschafft hast startet Level2... Also dein level wird gelöscht und das neue wird geladen... Bei deinem Rpg erfolgt der Level-Wechsel halt nicht, wenn du in einem Level "fertig" bist, sondern, wenn du n Teleporter betrittst.... Wie genau du deine Sektoren oder Level oder wie auch immer machst musste dir halt selber vorher ganz genau überlegen. Was soll dein Spiel können? Was muss es in den einzelnen Levels geben, usw usw..... Ich will zB verschiedene voneinander getrennte "Module" machen, ähnlich wie Neverwinter Nights oder zB die verschiedenen Akte von Diablo 2... Da hab ich ein Modul, welches eine Liste von den enthaltenen Levels hat oder zB das Startlevel und noch mehr... Falls du noch genauere Fragen hast kannste mir ja auch ne Pm schreiben oder bei Icq.. |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
was mein RPG können soll:
Naja so genau hab ich mir des noch nicht überlegt, da ich des ganze ja erstmal lernen will. Ich will erstmal, dass ich die grundsachen wie Pixel by Pixel scrolling, Sachen aufsammeln, NPC u. Schilder anlabern reibungslos klapt und schließlich auch das "wechseln" egal ob das jetzt häuser oder einfach nur Landschaften sind. Wenn das alles steht wende ich mich Gegnern und deren KI zu. Zum wechseln selber : Nehmen wir mal an, dass ich jetzt auf dem Teleporter stehe. Dann muss dieser sektor gelösch werden und ein neuer wird geladen. Dan zeichnet man diesen wieder. Da das ganze aber in ner Schleife stattfindet wird ja dauernt die Map geladen, und dan gezeichnet was dan doch ewig Speicher frisst. Ka ich mein des so: hero_x = ist die varriable welche die " x-Tilekoordinate zurückgibt" If map(hero_x,hero_y) = 6 and hx = 32 and Sektor1 = true then ;6 ist das teleport Tile sektot1 = false sektor2 = true End if if sektor2 = true then karte = readfile(...) ..... end if Ich weis einfach nicht wie ich die karten richtig "herholen soll" . Wie geht des mit der Pm ![]() mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
ic hweiß gar nicht, warum du das so komplizierst machst ![]() wenn du auf den teleporter rennst (egal wie auch immer, du kannst ja statt nehm teleporter einfach mal auf tastendruck die map wechseln... ich hab in meinem rpg einfach n paar variablen für die derzeitige map (kannst dir auch n type machen, oder wie auch immer du willst) Ich geb dir mal n Beispiel: Code: [AUSKLAPPEN] Global map_size_x
Global map_size_y Dim map( 0, 0 ) Function map_load( name$ ) ;Der ganze Datei-Auslese-Kram (je nachdem, wie deine maps aufgebaut sind) map_size_x = ReadByte( Datei ) map_size_y = ReadByte( Datei ) Dim map( map_size_x, map_size_y ) For x = 0 to map_size_x For y = 0 to map_size_y map( x, y ) = ReadByte( Datei ) Next Next End Function So und beim Level-Wechsel einfach inemal die Funktion aufrufen.. Für nen Teleport musste dann halt noch die Figur an die Richtige Stelle setzen... |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok, aber wo wird da ne neue karte geladen ? bzw. geprüft. ![]() Mit dem datei Anlegen und Aufrufen bin ich noch nicht so gesegnet, kann des est so seit 4 tagen... und momentan lade ich die karten so : Code: [AUSKLAPPEN] ;die map-array Dim map(81,49) karte$ = ReadFile("gfx\map\map1.map") For x = 0 To 81 For y = 0 To 49 tile = ReadLine(karte$) map(x,y) = ReadInt(karte$) Next Next CloseFile(karte$) und so zeiche ich diese: Code: [AUSKLAPPEN] For x = 0 To 81 For y = 0 To 49 DrawBlock tileset,x*32-scrollx,y*32-scrolly,map(x,y) Next Next Irgendwie muss ich die Karte$ auf ne andere map datei bringen, oder ? Dann wird automatisch ne andere gezeichnet. ![]() P.S. : ich bin grad im Noobie Chat wenn du Lust und Zeit hast könntest mir da des vielleicht erklären. http://www.darkchrome.de/chat.html mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hab ich doch oben gerade geschrieben...
Du hast doch immer nur die Karte, auf der du dich gerade befindest in deinen Variablen gespeichert... Die neue Karte wird geladen, indem du einfach die Variablen alle auf die Werte der neuen Map setzt... Hier nochmal genauer.... Code: [AUSKLAPPEN] Global map_size_x
Global map_size_y Dim map( 0, 0 ) Function map_load( name$ ) stream = ReadFile( name$ + ".map" ) map_size_x = ReadByte( stream ) map_size_y = ReadByte( stream ) Dim map( map_size_x, map_size_y ) For x = 0 to map_size_x For y = 0 to map_size_y map( x, y ) = ReadByte( stream ) Next Next CloseFile( stream ) End Function Wenn du jetzt also zB auf der Map Wald.map bist und du betrittst einen Teleporter, der dich nach Stadt.map "teleportiert", dann wirst du nicht auf eine 2te andere Map teleportiert, sondern eigentlich veränderst du nur die Map, auf der du dich gerade befindest, indem du sie einfach mit einer neuen überschreibst... |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
ahh uff! * hand gegen kopf schlag * !
Jetzt hats klick gemacht... Ok ich probier des etz mal so umzusetzten. Mal schauen ob des was wird. ![]() mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm ...
Ich habs jetzt geschaft, dass ich von einem "Sektor/map" in den anderen komme und auch wieder zurück. Inklusive den richtigen Spielerkooridinaten. Doch hab ich des, ja wie soll ich es sagen eher Stümperhaft bzw. einfach Notdürftig gelöst... So müssten für ca 30 maps mit jeweils 4 zugängen inetwa 120 Abfragen gemacht werden ![]() Also inetwa so : lol ^^ Code: [AUSKLAPPEN] Function update_map() ;von 1 in 2 If hx = 32 And sektor1 = True Then sektor1 = False ;wohin will der spieler sektor2 = True hx = 2528 ;neue x koordinates setzten scrollx = 2208 hero_x = 79 choose$ = "gfx\map\map2.map" ;map pfad new_map() ;karte mit pfad laden End If ;von 2 in 1 If hx = 2560 And sektor2 = True Then sektor2 = False ;wohin sektor1 = True hx = 64 ;x koordinates scrollx = -256 hero_x = 2 choose$ = "gfx\map\map1.map" ;map pfad new_map() ;karte mit pfad laden End If ; und immer so weiter bis alle Sektoren durch sind ;karte zeichnen For x = 0 To 81 For y = 0 To 49 DrawBlock tileset,x*32-scrollx,y*32-scrolly,map(x,y) Next Next End Function ;--------------------------------------------------------------------------- ;die karte und deren Tiles zeichnen Function new_map() karte$ = ReadFile(choose$) For x = 0 To 81 For y = 0 To 49 tile = ReadLine(karte$) map(x,y) = ReadInt(karte$) Next Next CloseFile(karte$) End Function was soll ich dazu sagen^^ Es geht aber extrem umständlich ![]() P.S. AraneA ich hab dir Pm geschickt mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group