Problem mit Map Editor aus Tutorial

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bassmaster

Betreff: Problem mit Map Editor aus Tutorial

BeitragMi, Feb 20, 2008 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 20, 2008 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 20, 2008 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing Embarassed

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

BeitragMi, Feb 20, 2008 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert nicht Sad


@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

BeitragMi, Feb 20, 2008 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 20, 2008 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es denn da irgendwelche nachteile wenn ich z.b. Writeline anstatt Writebytes benutze?

BladeRunner

Moderator

BeitragDo, Feb 21, 2008 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Crying or Very sad

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

BeitragDo, Feb 21, 2008 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo stimmt das wars thx habs wohl übersehen : -/

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group