Problem mit Map Editor aus Tutorial
Übersicht

BassmasterBetreff: Problem mit Map Editor aus Tutorial |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich habe mir gerade eine map mit dem RPG Editor aus dem Tutorial von der Robsite HP gemacht. Nun habe ich die Map in mein Spiel eingebaut aber irgendwie funktioniert die Kollision nicht mehr richtig. An manchen Stellen kann man aus der Map rauslaufen. An anderen wiederum kann man z.b. durch das Wasser gehen und an einer anderen Stelle auf der Map kann man dann z.b. wiederum nicht durch gehen. Mein rpg: Code: [AUSKLAPPEN] Graphics 1024,768,16,0 Tileset = LoadAnimImage("tileset.png",32,32,0,6) Global char = LoadImage ("char2.png") MaskImage char ,255,255,255 ;----------------------------------- Global ppx = 5*31 ;X-Position des Charackters Global ppy = 7*31 ;Y-Position des Charackters Global py = 7 ;Kollisions X-Position des Charackters Global px = 5 ;Kollisions Y-Position des Charackters Global scrolly ;Die Variable fr die ScrollY-Position Global scrollx ;Die Variable fr die ScrollX-Position Global gold = 10 ;start geld ;-------------------------------- ;Aktiviert den Backbuffer Repeat SetBuffer BackBuffer() Cls Dim map(31,23) load() ;die array wird eingelesen und die map wird gemalt For x = 0 To 31 For y = 0 To 23 DrawBlock tileset,x*31-scrollx,y*23-scrolly,map(x,y) Next Next DrawImage char,ppx-scrollx,ppy-scrolly ;figur malen ;------------------------------------------------------------------------------------------------------------------------------ Select move ;links Case 1 ;Spielerposition ndern scrollx = scrollx - 2 ppx = ppx - 2 ;Variable, die zhlt wie weit der Spieler bereits bewet wurde counter=counter+1 If counter = 16 Then px = px - 1 counter = 0 move = 0 EndIf ;Rechts Case 2 ;Spielerposition ndern scrollx = scrollx + 2 ppx = ppx + 2 ;Variable, die zhlt wie weit der Spieler bereits bewet wurde counter = counter+1 If counter = 16 Then px = px + 1 counter = 0 move = 0 EndIf ;runter Case 3 ;Spielerposition ndern scrolly = scrolly + 2 ppy = ppy + 2 ;Variable, die zhlt wie weit der Spieler bereits bewet wurde counter = counter+1 If counter = 16 Then py = py + 1 counter = 0 move = 0 EndIf ;rauf Case 4 ;Spielerposition ndern scrolly = scrolly - 2 ppy = ppy - 2 ;Variable, die zhlt wie weit der Spieler bereits bewet wurde counter = counter+1 If counter = 16 Then py = py - 1 counter = 0 move = 0 EndIf End Select ;Cursor Rechts If KeyDown(205) Then ;Kollision checken, wie ihr es schon kennt If map(px+1,py) < 3 Then ;der nchste Tastatur-eingabe-impuls wird mglich sobald die vorige Bewegung abgeschlossen ist ;das heit in der Zeit wo keine Tastatur-eingabe erfolgen kann wird zur Zeit gescrollt If move=0 Then ;die Scrollroutine move=2 ( Case 2 ) wird aufgerufen move = 2 End If End If End If ;Cursor Links If KeyDown(203) Then ;Kollision checken, wie ihr es schon kennt If map(px-1,py) < 3 Then ;der nchste Tastatur-eingabe-impuls wird mglich sobald die vorige Bewegung abgeschlossen ist ;das heit in der Zeit wo keine Tastatur-eingabe erfolgen kann wird zur Zeit gescrollt If move=0 Then ;die Scrollroutine move=1 ( Case 1 ) wird aufgerufen move = 1 End If End If End If ;runter key If KeyDown(208) Then If map(px,py+1) < 3 Then If move = 0 Then move = 3 End If End If End If ;rauf key If KeyDown(200) Then If map(px,py-1) < 3 Then If move = 0 Then move = 4 End If End If End If ;-------------------------------------------------------------------------------------------------------------------------------------------------------- hebel_trigger() Flip Forever ;funktion zum Laden der map und der variable tile Function load() ;einlesen der datei karte$ = ReadFile("map1.map") ;einlesen der array und der variable tile For x = 0 To 31 For y = 0 To 23 tile = ReadLine(karte$) map(x,y) = ReadInt(karte$) Next Next ;schlieen der datei CloseFile(karte$) End Function Function hebel_trigger() If KeyHit(57) Then ;und die spielerposition auf den hebel-tile befindet If map(px,py) = 2 Then ;dann wird die gesamte karte eingelesen und alle tür-tiles in graß-tiles ;umgewandelt For y = 0 To 31 For x = 0 To 23 If map(x,y) = 4 Then map(x,y) = 0 End If Next Next End If End If End Function Der Editor aus dem Tutorial: Code: [AUSKLAPPEN] ;Kurz die funktions erklährung ;---------------------------------------- ;s-Taste = speichern ;l-Taste = laden ;l-Maustaste = Tile-setzen ;r-Maustaste = Tile wird wieder graß ;ESC-Taste = Beenden ;1-6 Tasten = Tiles wechseln ;---------------------------------------- ;legt eine array an, die bei einer bildschirm auflösung ;von 1024*768 pixeln genau auf den monitor passt, also ;ohne überstehende unnütze tiles, die man nicht sehen ;kann, weil kein scrolling eingebaut wurde. Dim map(31,23) ;den Grafikmodus laden, wie vorher erwähnt 1024*768*16 Graphics 1024,768,16,1 ;Läd das tileset, dessen tiles 32*32 pixel groß sind ;das erste tile hat den wert 0 und es sind insgesamt 6 dieser ;mini bilder Tileset = LoadAnimImage("tileset.bmp",32,32,0,6) ;ein mauszeiger, den ich mit Hypersnap aus einer curser-datei ;in das bitmap-format umgewandelt habe. Maus = LoadImage("maus.bmp") ;hier werden alle variablen globalisier, die auch in den ;functionen verwendet werden. Global x,y,mx,my,mapx,mapy,tile = 1 ;Startet die Hauptschleife Repeat ;Aktiviert den Backbuffer SetBuffer BackBuffer() ;ESC-Taste zum beenden des programs If KeyDown(1) Then End ;die array wird eingelesen und die map wird gemalt For x = 0 To 31 For y = 0 To 23 DrawImage tileset,x*32,y*32,map(x,y) Next Next ;Die Tasten von 1 - 6 ich erklehre mal kurz die ;functione: ;Das zu malende tile hat die framezahl : ;1-Taste = 1 ;2-Taste = 2 ;3-Taste = 3 ;4-Taste = 4 ;5-Taste = 5 ;6-Taste = 0 If KeyDown(2) Then tile = 1 If KeyDown(3) Then tile = 2 If KeyDown(4) Then tile = 3 If KeyDown(5) Then tile = 4 If KeyDown(6) Then tile = 5 If KeyDown(7) Then tile = 0 ;die veriablen mx und my werden den koordinaten der maus ;zugewiesen. mx = MouseX() my = MouseY() ;wenn man die Linke maustaste drückt.... If MouseDown(1) Then ;wird die function scroll aufgerufen.... scroll() ;und dei aktuelelle positon des mauszeigers, ;die in der function scroll berechnet wird... ;also das tile wird einfach auf klick ;gesetzt, wobei das frame des tilesets ;die veriable tile angibt. map(mapx,mapy) = tile End If ;die selbe prozedur, nur dass diesmal die ;rechte maustaste gedrückt wird, und das ;tile nur in das frame mit dem wert 0 umgeändert wird. If MouseDown(2) Then scroll() map(mapx,mapy) = 0 End If ;S-Taste ;Die function zum speichern der map und der variabele tile If KeyHit(31) Then save() ;L-Taste ;Funktion zum laden der map und der veriable tile If KeyHit(38) Then load() ;malt den mauszeiger an den koordinaten mx und my, die ;vorher bereits den maus-ko. zugeteilt wurden DrawImage maus,mx,my ;flippen und wieder zum anfang der schleife Flip Forever ;die function zum berechnen der position des tiles, das ;gesetzt werden soll Function scroll() ;mapx wied berechnet, indem man die ;aktuelle position der mauszeigers(mx,my) ;durch 32 teilt, dadurch kann mapx und mapy ;nur in 32ger schritten gesetzt werden, ;also was dazwischen ist wird ignoriert mapx = (mx)/32 mapy = (my)/32 End Function ;funktion zum Speichern der map und der veriable tile Function save() ;dei datei wird erst geschrieben.... karte$ = WriteFile("map1.map") ;dann wird die array mal wieder für die zeile ;in der map(x,y) vorkommt eingalesen... For x = 0 To 31 For y = 0 To 23 ;speichert in der datei karte$ die veriable tile WriteLine(karte$,tile) ;hier wird jetzt die array map(x,y) gespeichert WriteInt(karte$,map(x,y)) Next Next ;nicht vergessen umbedingt closefile eingeben ;sonst können fehler auftreten!!! CloseFile(karte$) End Functi on ;funktion zum Laden der map und der variable tile Function load() ;einlesen der datei karte$ = ReadFile("map1.map") ;einlesen der array und der variable tile For x = 0 To 31 For y = 0 To 23 tile = ReadLine(karte$) map(x,y) = ReadInt(karte$) Next Next ;schließen der datei CloseFile(karte$) End Function |
||
Lador |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du glaubst wohl, dass dir jemand antworten wird, wenn du uns so viel Code hinschleuderst...Ich habe den Code nur mal überflogen und bin auf das hier gestoßen:
Code: [AUSKLAPPEN] ;die array wird eingelesen und die map wird gemalt
For x = 0 To 31 For y = 0 To 23 DrawBlock tileset,x*31-scrollx,y*23-scrolly,map(x,y) Next Next Hast du pro Tile wirklich 31*23 Pixel? Vor allem fällt mir gerade noch das hier auf: Code: [AUSKLAPPEN] Global ppx = 5*31 ;X-Position des Charackters
Global ppy = 7*31 ;Y-Position des Charackters Wenn du schon 31*23 hast, dann mach bei ppy wenigstens 7*23. Vielleicht war das ja schon dein Problem...Außerdem solltest du nicht in jeder Schleife die Map neu laden, lösche es aus der Repeat-Schleife und setze es davor. Wenn das dein Problem immer noch nicht gelöst hat, dann schau doch mal selbst bei deiner Kollision nach, z.B. ob alles, auf dem du laufen kannst die Werte 0-2 haben. MFG Lador |
||
![]() |
Hip Teen |
![]() Antworten mit Zitat ![]() |
---|---|---|
So spontan ist mir auch was aufgefallen, was nicht stimmen kann (hängt warscheinlich nicht mit zusammen, aber egal ^^)
Code: [AUSKLAPPEN] ppx = ppx - 2
müsstest du da nicht um mehr als 2 erhöhen? Die Zeile steht an der Stelle, bei der die Richtungsänderung übernommen wird. Edit: Blub, ich hab quatsch geredet. Einfach ignorieren ![]() ![]() Edit2: hm, vielleicht hängt dein Problem mit der count Variable zusammen. Benutz mal für jede Richtung eigene count Variable. Da könnte ein potentieller Bug drinnenstecken |
||
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger" |
Bassmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Funktioniert nicht ![]() @Lador Ich hab das Tileset benutzt welches bei dem map editor dabei war dort ist 1 Tile 32 Hoch und 32 Breit. Aber es muss doch zu so einer Sache auch irgend ein Tutorial geben bei Goolge hab ich leider net das richtige gefunden ka wo ich noch suchen soll. |
||
Lador |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Na also: 32*32. Warum schreibst du dann 31*23? Das ist vom Bildschirm, aber in der For-Schleife mit x und y wo der gesamte Bildschirm gezeichnet wird, musst du *32 und *32 und nicht *31 und *23 nehmen...Deswegen "läuft deine Figur immer ein paar Pixel zu weit". Und dass sie auf Wasser laufen kann, musst du wie gesagt bei der Kollision überprüfen. Da heißt es doch "wenn die Position auf der Karte z.B. (px+1,py) < 3 ist, dann..." und je nach dem, welche Stelle in deinem Tileset das Wasser hat, musst du das eben so setzen.
Beispiel: Dein Tileset besteht wahrscheinlich aus 192*32 Pixeln. Du hast praktisch 6 Tiles, von dem jedes aus 32*32 Pixeln besteht. Dann könnte der Aufbau folgendermaßen sein: 1. Tile: Wiese 2. Tile: Erde 3. Tile: Wasser 4. Tile: Stein 5. Tile: Busch (durch den man nicht gehen kann) 6. Tile: Blume (die man nicht zertreten will^^) Da der Computer bei 0 anfängt zu zählen, entspricht: Wiese = 0 Erde = 1 Wasser = 2 Stein = 3 Busch = 4 Blume = 5 Wenn du jetzt < 3 schreibst, wären Wiese, Erde und Wasser erlaubt. Bei < 2 sind es nur Wiese und Erde. Kannst du mir folgen? (Noch einfacher kann ich es dir fast nicht mehr machen^^.) MFG Lador |
||
Bassmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das mit der Kollision funktioniert jetzt schonmal nur jetzt sieht meine Map irgendwie total anderes aus als wie ich sie in dem Editor erstellt habe. ^^
Aber mir kommt der Editor sowie seltsam vor, vielleicht kann ja da ja mal wer kurz rüberschauen. Ich hab mal die ganzen Kommentare da raus genommen so ist es dann übersichtlicher: Code: [AUSKLAPPEN] ;Kurz die funktions erklärung ;---------------------------------------- ;s-Taste = speichern ;l-Taste = laden ;l-Maustaste = Tile-setzen ;r-Maustaste = Tile wird wieder gra ;ESC-Taste = Beenden ;1-6 Tasten = Tiles wechseln ;---------------------------------------- Dim map(31,23) Graphics 1024,768,16,1 Tileset = LoadAnimImage("tileset.bmp",32,32,0,6) Maus = LoadImage("maus.bmp") Global x,y,mx,my,mapx,mapy,tile = 1 Repeat SetBuffer BackBuffer() If KeyDown(1) Then End For x = 0 To 31 For y = 0 To 23 DrawImage tileset,x*32,y*32,map(x,y) Next Next ;Das zu malende tile hat die framezahl : ;1-Taste = 1 ;2-Taste = 2 ;3-Taste = 3 ;4-Taste = 4 ;5-Taste = 5 ;6-Taste = 0 If KeyDown(2) Then tile = 1 If KeyDown(3) Then tile = 2 If KeyDown(4) Then tile = 3 If KeyDown(5) Then tile = 4 If KeyDown(6) Then tile = 5 If KeyDown(7) Then tile = 0 mx = MouseX() my = MouseY() If MouseDown(1) Then scroll() map(mapx,mapy) = tile End If If MouseDown(2) Then scroll() map(mapx,mapy) = 0 End If If KeyHit(31) Then save() If KeyHit(38) Then load() DrawImage maus,mx,my Flip Forever Function scroll() mapx = (mx)/32 mapy = (my)/32 End Function Function save() karte$ = WriteFile("map1.map") For x = 0 To 31 For y = 0 To 23 WriteLine(karte$,tile) WriteInt(karte$,map(x,y)) Next Next CloseFile(karte$) End Function Function load() karte$ = ReadFile("map1.map") For x = 0 To 31 For y = 0 To 23 tile = ReadLine(karte$) map(x,y) = ReadInt(karte$) Next Next CloseFile(karte$) End Function |
||
![]() |
kriD |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab mir den code nicht angesehen, aber du musst die daten in GENAU der reihenfolge wieder auslesen, wie du sie gespeichert hast..
MfG kriD |
||
Wenn ich du wäre, wäre ich lieber ich! |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würds ja mit Writebyte(s) speichern, und dann mit Readbyte(s) auslesen. z.B. Writeline speichert einen String, und ich denke das brauchste nicht, oder?
MfG Nici |
||
Bassmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gibt es denn da irgendwelche nachteile wenn ich z.b. Writeline anstatt Writebytes benutze? | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du verbrauchst mehr Speicherplatz mit writeline. Allerdings sind die Daten mit Writeline leichter für Menschen lesbar. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja du kannst kein plattenspeicher für ints, floats etc sparen.
und es gibt natürlich auch zeilen dann in der datei ... vor allem hat readline dann probleme wenn du davon ausgegangen bist dass nur mit writeline zeilen erzeugt ... wenn du jedoch chr 10 + 13 reinschreibst hättest du auch ne neue zeile und dein gesamtes auslesen wär schrott sprich writeline taugt nur wenn du text speichern willst, nicht wenn es primär um nicht text basierende daten geht |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Bassmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mhhm ich hab mir das mal auf Blitzbase angekuckt ich bleib erst mal bei writeline das ist doch irgendwie einfacher^^
Es hat jetzt endlich geklappt die Map zu Laden nur jetzt hab ich ein neues Problem ![]() Wenn ich die Bewegungsroutinen mit in das Programm einfüge dann meint der immer "Forever without Repeat" aber ich hab repeat mit eingefügt. Code: [AUSKLAPPEN] ;variablen ;----------------------------------- Global ppx = 10*32 ;X-Position des Charackters Global ppy = 7*32 ;Y-Position des Charackters Global py = 7 ;Kollisions X-Position des Charackters Global px = 10 ;Kollisions Y-Position des Charackters Global scrolly ;Die Variable fr die ScrollY-Position Global scrollx ;Die Variable fr die ScrollX-Position Global gold = 10 ;start geld ;-------------------------------- ;------------------------------------------------------------------------------- file = ReadFile("data/map/testmap.ini") ReadLine(file) m_x = ReadLine(file) m_y = ReadLine(file) CloseFile file ts_info = ReadFile("data/gfx/tileset/tileset_01.ini") set_tiles = ReadLine(ts_info) CloseFile ts_info Graphics 1024,768,32,0 ;-------------------------------------------------------------------------------------------------------------- Repeat SetBuffer BackBuffer() Cls t_set = LoadAnimImage("data/gfx/tileset/tileset_01.bmp", 32, 32, 0, set_tiles) char = LoadImage("data/gfx/tileset/figur.bmp") MaskImage char ,255,255,255 Dim m_map(m_x,m_y) datei=ReadFile("data/map/testmap.map") For y=0 To m_y-1 For x=0 To m_x-1 m_map(x,y) = ReadLine(datei) Next Next CloseFile datei For y=0 To m_y-1 For x=0 To m_x-1 ;hier werde die bilder gezeichnet DrawImage t_set, x*32, y*32, m_map(x,y) DrawImage char,ppx-scrollx,ppy-scrolly Next Next ;----Bewegungsroutinen------------------------------------------------------------------------ Select move ;links Case 1 ;Spielerposition ndern scrollx = scrollx - 2 ppx = ppx - 2 ;Variable, die zhlt wie weit der Spieler bereits bewet wurde counter=counter+1 If counter = 16 Then px = px - 1 counter = 0 move = 0 EndIf ;Cursor Links If KeyDown(203) Then ;Kollision checken, wie ihr es schon kennt If map(px-1,py) < 3 Then ;der nchste Tastatur-eingabe-impuls wird mglich sobald die vorige Bewegung abgeschlossen ist ;das heit in der Zeit wo keine Tastatur-eingabe erfolgen kann wird zur Zeit gescrollt If move=0 Then ;die Scrollroutine move=1 ( Case 1 ) wird aufgerufen move = 1 End If End If End If Flip Forever |
||
![]() |
Hip Teen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ich das richtig gesehen hab, schließt du dein Select nicht mit End Select ab. Das dürfte das sein, was dem Compiler Schwierigkeiten bereitet. | ||
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger" |
Bassmaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jo stimmt das wars thx habs wohl übersehen : -/ | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group