RPG verschiedene maps zeigen[2D]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: RPG verschiedene maps zeigen[2D]

BeitragFr, Feb 16, 2007 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 17, 2007 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 17, 2007 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Shocked um alles aufeinmal zu sehen Embarassed ).

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

BeitragSo, Feb 18, 2007 1:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
hoffentlich konnte ich dir helfen
....

AraneA

BeitragSo, Feb 18, 2007 1:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 19, 2007 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für eure antworten, ich merke scho dass ich a wengle umständlich vorgestellt habe Surprised

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.. Confused

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 Shocked ? Kann ich mir nicht vorstellen.

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

AraneA

BeitragMo, Feb 19, 2007 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 19, 2007 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 19, 2007 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 20, 2007 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed ?

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

AraneA

BeitragDi, Feb 20, 2007 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ic hweiß gar nicht, warum du das so komplizierst machst Wink
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

BeitragDi, Feb 20, 2007 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, aber wo wird da ne neue karte geladen ? bzw. geprüft. Embarassed

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. Confused

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

BeitragDi, Feb 20, 2007 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 20, 2007 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
ahh uff! * hand gegen kopf schlag * !

Jetzt hats klick gemacht... Ok ich probier des etz mal so umzusetzten. Mal schauen ob des was wird. Cool

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Dottakopf

BeitragDi, Feb 20, 2007 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Shocked !

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 Rolling Eyes

P.S. AraneA ich hab dir Pm geschickt

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group