Tilemap-Editor Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Preakz

Betreff: Tilemap-Editor Problem

BeitragMi, Jan 25, 2012 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Liebe Community,
ich habe mir einen TileMapEditor erstellt und muss nurnoch die Write Read Funktion einbauen. Doch beim auslesen gibt es immer einen Fehler. ("Array Index out of Bounds") Warum auch immer :S *meine map grösse ist 800x600 jedes Tile ist 32x32 ...

Hier mal der schnipsel der 2 Funktionen....
BlitzBasic: [AUSKLAPPEN]
Function LoadMap()
Datei$ = Input("Bitte MAP-Namen eingeben: ")
Datei$ = Datei$ + ".MAP"
bla = ReadFile(datei$)
For i = 0 To gfx_width ;800

For u = 0 To gfx_height ;600
Map(i,u) = ReadLine(bla)



Next
Next
CloseFile (bla)
End Function


Function ExecuteMap()
Locate 10,40
Datei$ = Input("Bitte geben sie einen Datei Namen ein(OHNE.MAP): ")
Datei$ = Datei$ + ".MAP"
Stream = WriteFile(datei$)
For i = 0 To gfx_width; 800
For u = 0 To gfx_height;600
WriteLine stream,map(i,u)
Next


Next
CloseFile (Stream)

End Function


Vielen Dank für die Hilfe schonmal im Vorraus (:

MfG
Preakz

BladeRunner

Moderator

BeitragMi, Jan 25, 2012 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
For 0 to bla gibt insgesamt bla+1 Durchläufe, da die 0 ja auch ein Durchlauf ist.
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

Ana

BeitragMi, Jan 25, 2012 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Array denke ich mal ist 800/600 einträge groß? Wenn du von 0 bis 800 gehst sind das aber 801 schritte. Überprüf doch bitte erstmal ob das nicht vielleicht schon das Problem löst wenn du gfxwidth-1 machst.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

Preakz

BeitragMi, Jan 25, 2012 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Klappt immer noch nicht :/ , aber danke für die schnellen antworten .... i.w. hab ich einen denkfehler ... ich hab das nach nem tut gemacht aber leider hat derjenige es nicht zuende geschrieben. Deswegen bin ich selbst am weiterbasteln aber da ich sowas noch nie gemacht hab is das ein bisschen wie eine kleine Katastrophe.... weil ich nicht weiß wie und wo ich anfangen muss ... :
(ich glaub ich fail schon bei der speicher funktion .... )
Hier mal mein Kompletter Map-Editor Code.....


BlitzBasic: [AUSKLAPPEN]

;Initzialisierung
Const gfx_width=800
Const gfx_height=600
Graphics gfx_width,gfx_height,0,2
SetBuffer BackBuffer()

Global timer=CreateTimer(50)
;Für MapLaden oder Neuemap
Global choice$ = ""
;Name für datei
Global Name$ = ""
;New Map or EditMap
Global Status = False
;Map-Eigenschaften, werden in der Funktion "NewMap" festgelegt
Global map_scroll_x
Global map_scroll_y
Global map_width
Global map_height

;Variablen zum Scrollen mit der Maus
Global mausscroll_x
Global mausscroll_y

;Variablen für die Spielerposition
Global set_player=False
Global player_tilex=-1
Global player_tiley=-1
;und das Spieler-Image für die Vorschau
Global player=LoadImage("player.bmp")
MaskImage player,255,0,255

;Für Rasterlinien anzeigen
Global raster=False

;Map-Array
Dim map(map_width,map_height)

Global ausgew_tile=0 ;Diese Zahl wird in den Map-Array gespeichert
Global maus_tilex,maus_tiley ;Maus-Koordinaten in Tiles, wird in der Hauptschleife zugewiesen

;Tileset laden
Global tileset=LoadAnimImage("tileset.bmp",32,32,0,4)


choice$ = Input("Neue Map = 'n' , Map Laden(editieren) = 'l'")
If Choice = "n" Or "N" Then
Status = False
ElseIf choice = "l" Or "L"
Status = True
EndIf
;Map mit den Wunschwerten initialisieren
If Status = False Then
NewMap()
Else
LoadMap()
EndIf
;Hauptschleife
Repeat

UserInput()

DrawGame()

If KeyHit(49) Then ;Wenn "N" gedrückt wird
NewMap()
EndIf
If KeyDown(29) And KeyDown(31) Then
Executemap()
EndIf

WaitTimer timer
Flip 0 : Cls
Until KeyHit(1)
End





Function UserInput()
;Mauskoordinaten ermitteln
maus_tilex=(MouseX()+map_scroll_x)/32
maus_tiley=(MouseY()+map_scroll_y)/32

;Entscheiden, in welchem "Modus" man ist
If set_player=True Then
;Bei Tastendruck Spieler platzieren
If MouseHit(1) Then
If maus_tilex<=map_width And maus_tiley<=map_height Then ;Sicherheitsabfrage. Kleiner als 0 können die Variablen ohnehin nicht sein
If map(maus_tilex,maus_tiley)=0 Then ;Nur auf Wiese setzen
player_tilex=maus_tilex
player_tiley=maus_tiley
set_player=False
EndIf
EndIf
EndIf
Else
;Bei gedrückter linker Maustaste Map verändern
If MouseDown(1) Then
If maus_tilex<=map_width And maus_tiley<=map_height Then ;Sicherheitsabfrage. Kleiner als 0 können die Variablen ohnehin nicht sein
If maus_tilex<>player_tilex Or maus_tiley<>player_tiley Then ;Abfrage, dass Tile unterhalb des Players nicht verändert werden kann (kein Wasser drunter setzen)
map(maus_tilex,maus_tiley)=ausgew_tile
EndIf
EndIf
EndIf
EndIf

;Setzen des Spielers einleiten - Taste "P"
If KeyHit(25) Then
set_player=True
FlushMouse()
EndIf

;Zu setzendes Tile auswählen
If KeyHit(2) Then ausgew_tile=0
If KeyHit(3) Then ausgew_tile=1
If KeyHit(4) Then ausgew_tile=2
If KeyHit(5) Then ausgew_tile=3

;Mapscrolling mit rechter Maustaste
If MouseDown(2) Then
If mausscroll_x<>-1 Then
;Scrollen
map_scroll_x=map_scroll_x+(MouseX()-mausscroll_x)/2
map_scroll_y=map_scroll_y+(MouseY()-mausscroll_y)/2
;Werte begrenzen
If map_scroll_x<0 Then map_scroll_x=0
If map_scroll_y<0 Then map_scroll_y=0
If map_scroll_x>map_width*32-gfx_width+32 Then map_scroll_x=map_width*32-gfx_width+32
If map_scroll_y>map_height*32-gfx_height+32 Then map_scroll_y=map_height*32-gfx_height+32
Else
;Punkt festlegen, von wo aus mit der Maus gezogen wird
mausscroll_x=MouseX()
mausscroll_y=MouseY()
EndIf
Else
mausscroll_x=-1
EndIf

;Per Druck auf "R" Rasterlinien umschalten
If KeyHit(19) Then
raster=Not raster
EndIf
End Function

Function DrawGame()
;Map zeichnen
For y=map_scroll_y/32 To map_scroll_y/32+gfx_height/32+1
If y>map_height Then Exit
For x=map_scroll_x/32 To map_scroll_x/32+gfx_width/32+1
If x>map_width Then Exit
DrawBlock tileset,x*32-map_scroll_x,y*32-map_scroll_y,map(x,y)
Next
Next

;Player- bzw. Tile-Vorschau
If set_player Then
DrawImage player,maus_tilex*32-map_scroll_x,maus_tiley*32-map_scroll_y
Else
DrawImage player,player_tilex*32-map_scroll_x,player_tiley*32-map_scroll_y
DrawImage tileset,maus_tilex*32-map_scroll_x,maus_tiley*32-map_scroll_y,ausgew_tile
EndIf

;Rasterlinien in Form von Rects einzeichnen, da schneller als mit Line
If raster Then
Color 150,150,150
;Senkrecht
For x=0 To gfx_width Step 64
Rect x,0,32,gfx_height,0
Next
;Waagrecht
For y=0 To gfx_height Step 64
Rect 0,y,gfx_width,32,0
Next
EndIf

;Hilfstexte im Editor
Color 255,255,255
;Links
If set_player Then
Text 10,5,"Spieler-Setzen-Modus"
Else
Text 10,5,"Tile-Setzen-Modus"
Text 10,20,"Mit P gelangt man in den Spieler-Setzen-Modus"
EndIf
Text 10,35,"Mausposition: "+maus_tilex+", "+maus_tiley

;Rechts
Text gfx_width-StringWidth("Rasterlinien mit R umschalten")-10,5,"Rasterlinien mit R umschalten"
Text gfx_width-StringWidth("Neue Map mit N erstellen")-10,20,"Neue Map mit N erstellen"
End Function

Function NewMap()
;Abmessungen erfragen. Die Eingabe wird nicht überprüft, Fehleingaben daher möglich
FlushKeys()
map_width=Input("Gewünschte Map-Breite: ")
map_height=Input("Gewünschte Map-Höhe: ")
Dim map(map_width,map_height)

;Werte zurücksetzen
map_scroll_x=0
map_scroll_y=0
player_tilex=-1
player_tiley=-1
set_player=False
End Function

Function LoadMap()
Datei$ = Input("Bitte MAP-Namen eingeben: ")
Datei$ = Datei$ + ".MAP"
bla = ReadFile(datei$)

;!!!! wie kann ich hier die info herausnehmen welche map_breite und welche map_höhe ?
For i = 1 To map_width

For u = 1 To map_height
Map(i,u) = ReadLine(bla)



Next
Next
CloseFile (bla)
End Function


Function ExecuteMap()
Locate 10,40
Datei$ = Input("Bitte geben sie einen Datei Namen ein(OHNE.MAP): ")
Datei$ = Datei$ + ".MAP"
Stream = WriteFile(datei$)
;!!!! wie kann ich hier die info für die map_breite und die map_höhe schreiben bzw. in welches array am besten gesplittet... array 0 ?

For i = 1 To map_width
For u = 1 To map_height
WriteLine stream,map(i,u)
Next


Next
CloseFile (Stream)

End Function
;~IDEal Editor Parameters:
;~C#Blitz 3D


Mir ist aufgefallen das ich immer ein array von der fenstergrößse genommen habe. Jedoch hatte ich die gleichen maße .... und es kam wieder die fehlermeldung. Ich würd jetzt am liebsten noch die map größe und breite reinschreiben damit beim laden der map in den editor das sofort gesetzt wird.

Danke nochmal im vorraus

Mfg
Preakz

ZEVS

BeitragMi, Jan 25, 2012 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
BlitzBasic: [AUSKLAPPEN]
;!!!! wie kann ich hier die info herausnehmen welche map_breite und welche map_höhe
[...]
;!!!! wie kann ich hier die info für die map_breite und die map_höhe schreiben bzw. in welches array am besten gesplittet... array 0 ?

Mitspeichern.
BlitzBasic: [AUSKLAPPEN]

Function ExecuteMap()
;[...]
WriteLine Stream, map_width
WriteLine Stream, map_height
;[...]
End Function


Function LoadMap()
;[...]
map_width = Int(ReadLine(bla))
map_height = Int(ReadLine(bla))
;[...]
End Function

Das mit Locate/Input würde ich mir an deiner Stelle noch mal überlegen. Es ist so gewiss am einfachsten, aber auch am unpraktischsten.
Du hast sehr schön gezeigt, dass du auch in der Lage bist, Funktionsinhalte einzurücken. Mach' das bitte im ganzen Code, so ist es übersichtlicher.
Außerdem ist ein derartig langer Code unhandlich, sodass sicherlich einige nicht die Fragen ganz unten gefunden haben.

ZEVS
 

Preakz

BeitragMi, Jan 25, 2012 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle antwort (: , werd ich gelich mal ausprobieren.
Das mit dem Locate hab ich nur ausnahmsweise gemacht ... ich benutz eigentlich immer nur Text.
Ich wollt nur nicht solange da dran mich aufhalten... (bei Locate die x und y hab ich abgeschätzt deswegen überschneidet sie sich auch...mit dem anderem text ein wenig...)

Eingeproggt

BeitragMi, Jan 25, 2012 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
For i = 1 To map_width

For u = 1 To map_height


Bladerunner und Ana wollten wohl darauf hinaus dass du nicht bei 1 anfängst sondern am Ende bei map_width-1 aufhörst. Bei der Höhe dasselbe.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Preakz

BeitragMi, Jan 25, 2012 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal.... es funtkioniert immer noch nicht :S....
Ich hab mal alles mit grafiken und so hochgeladen ..... wer Zeit und Lust hat mir zu helfen dem danke ich jetzt schonmal über alles (:

http://www.file-upload.net/dow...r.zip.html


Mfg
Preakz

Eingeproggt

BeitragMi, Jan 25, 2012 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast meinen vorigen Beitrag wohl übersehen, lies ihn nochmal Wink
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Preakz

BeitragMi, Jan 25, 2012 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
...ne ... habs schon so eingetragen funkt trotzdem net

Eingeproggt

BeitragMi, Jan 25, 2012 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem von dir verlinkten Upload sehe ich keine Spur davon?
Wie sollen wir denn wissen was jetzt der Fehler sein könnte wenn du uns den alten noch präsentierst und behauptest der wär behoben?
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Preakz

BeitragMi, Jan 25, 2012 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
... ja ich hatte es wieder zurück geschrieben weil die fehlermeldung immer noch die gleiche war... habs so stehen lassen

ich kann auch schreiben von 1 to ... -1 und es ist genau der gleiche scheiss :/

BladeRunner

Moderator

BeitragMi, Jan 25, 2012 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne in den Code gesehen zu haben (da kaum zeit grade- muss ich jedoch anmerken dass mir etwas komisch vorkommt dass deine Kartenauflösung 800*600 sein soll. Das hört sich an als ob Du Auflösung des Bildes und Kartengröße miteinander verwirbelt hast.
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

Eingeproggt

BeitragMi, Jan 25, 2012 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, nachdem du das mit der variablen Breite und Höhe gemacht hast, hast du beim laden vergessen folgendes zu schreiben:
BlitzBasic: [AUSKLAPPEN]
Dim map(map_width,map_height)

(logischerweise nachdem du map_width und map_height einliest)

EDIT: Erklärung:
Am Anfang haben width und height keine Werte, sie sind 0... wenn du dann Dim ausführst hast du einen 0x0-Array... in dem kann man nicht arbeiten. Und von alleine verändert er sich nicht, wenn width und height neu zugewiesen werden - das muss man selber machen Wink
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Preakz

BeitragMi, Jan 25, 2012 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Whey es Klappt Smile danke vielmals Mr. Green

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group