universal mapeditor beispiel
Übersicht

QuäinyBetreff: universal mapeditor beispiel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich hab mir den mapeditor mal gewonloaded und das RPG Beispiel runtergeladen, so hier ist es, aber es klappt nicht, mapengine hab ich schon in den jeweiligen Ordner kopiert. Er zeigt einen Fehler mit dem "layer.layer" an, aber was ist daran falsch?Danke schon im vorraus ![]() Code: [AUSKLAPPEN] ;---------------------------------------------------------------------ANIMBANK ;offset byte description ;--------------------------------------------------------------------- ;00 2 animation frames ;02 2 animation start ;04 1 animation mode (1=paused, 2=forward, 3=backward) ;05 1 default tile value ;06 4 last millisecs time ;10 2 current frame number ;12... 2 animation image ;14... 2 animation time ;--------------------------------------------------------------------- Type tile Field anims ;animation count Field banka ;animations handle bank Field bankd ;default tile value Field count ;frame count Field factor ;y-factor Field file$ ;filename Field image ;image handle Field mask ;mask color Field sizex ;tile size x Field sizey ;tile sizey End Type Const tile_default=20 Const tile_minsize=08 ;--------------------------------------------------------------------- Function tile_animate() Local bank Local frame Local frames Local i Local layer.layer Local mode Local tile.tile Local time1 Local timediff Local timemax time2=MilliSecs() For tile=Each tile For i=1 To tile\anims bank =PeekInt (tile\banka,i*4-4) frames =PeekShort(bank,0) mode =PeekByte (bank,4) time1 =PeekInt (bank,6) frame =PeekShort(bank,10) timediff=time2-time1 Repeat timemax=PeekShort(bank,frame*4+10) If mode=1 Or mode<0 Or mode>3 Or timemax=0 Then ;PAUSE PokeInt bank,6,time2 Exit EndIf If timediff<=timemax Then PokeInt bank,6 ,time2-timediff PokeShort bank,10,frame Exit EndIf timediff=timediff-timemax If mode=2 Then frame=frame+1 ;FORWARD If mode=3 Then frame=frame-1 ;BACKWARD If frame<1 Then frame=frames If frame>frames Then frame=1 Forever Next Next For layer=Each layer If (layer\code=layer_image Or layer\code=layer_block) And layer\tile<>Null Then If layer\frame=>1 And layer\frame<=layer\tile\anims And layer\mode>0 Then bank =PeekInt (layer\tile\banka,layer\frame*4-4) frames =PeekShort(bank,0) mode =layer\mode time1 =layer\time frame =layer\tmp timediff=time2-time1 Repeat timemax=PeekShort(bank,frame*4+10) If mode=1 Or mode<0 Or mode>3 Or timemax=0 Then ;PAUSE layer\time=time2 Exit EndIf If timediff<=timemax Then layer\time=time2-timediff layer\tmp=frame Exit EndIf timediff=timediff-timemax If mode=2 Then frame=frame+1 ;FORWARD If mode=3 Then frame=frame-1 ;BACKWARD If frame<1 Then frame=frames If frame>frames Then frame=1 Forever EndIf EndIf Next End Function ;--------------------------------------------------------------------- Function tile_animreset() Local bank Local i Local layer.layer Local start Local tile.tile time=MilliSecs() For tile=Each tile For i=1 To tile\anims bank=PeekInt(tile\banka,i*4-4) start=PeekShort(bank,2) PokeInt bank,6,time PokeShort bank,10,start Next Next For layer=Each layer If layer\code=layer_image Or layer\code=layer_block Then layer\time=time layer\tmp=layer\start If layer\tmp<0 Then layer\tmp=1 EndIf Next End Function ;--------------------------------------------------------------------- ;file: find this tileset file name ;RETURN: tileset type handle (null=not found) ;--------------------------------------------------------------------- Function tile_find.tile(file$) Local tile.tile For tile=Each tile If tile\file$=file$ Then Return tile Next End Function ;--------------------------------------------------------------------- ;tile: tileset handle ;anim: anim number (1...) ;RETURN: anim value (0-255) ;--------------------------------------------------------------------- Function tile_getanimval(tile.tile,anim) Local bank If tile=Null Then Return If tile\banka<>0 And anim=>1 And anim<=tile\anims Then bank=PeekInt(tile\banka,anim*4-4) ;animbank Return PeekByte(bank,5) ;default value EndIf End Function ;--------------------------------------------------------------------- ;tile: tileset handle ;frame: frame number (1...) ;RETURN: frame value (0-255) ;--------------------------------------------------------------------- Function tile_getframeval(tile.tile,frame) If tile=Null Then Return If tile\bankd<>0 And frame=>1 And frame<=tile\count Then Return PeekByte(tile\bankd,frame-1) EndIf End Function ;--------------------------------------------------------------------- ;RETURN: number of images with loading errors ;--------------------------------------------------------------------- Function tile_load() Local b Local error Local g Local r Local tile.tile For tile=Each tile If tile\image<>0 Then FreeImage tile\image tile\image=0 EndIf If tile\file$<>"" Then tile\image=LoadAnimImage(map_path+tile\file$,tile\sizex,tile\sizey,0,tile\count) ;<<<remove 2 for BB2D/BB3D If tile\image=0 Then error=error+1 EndIf If tile\image<>0 Then r=(tile\mask And $FF0000)/$10000 g=(tile\mask And $FF00)/$100 b=(tile\mask And $FF) MaskImage tile\image,r,g,b EndIf Next If map_image<>0 Then FreeImage map_image map_image=0 EndIf If map_backgr$<>"" Then map_image=LoadImage(map_path$+map_backgr$) ;<<<remove 2 for BB2D/BB3D If map_image=0 Then error=error+1 EndIf Return error End Function ;--------------------------------------------------------------------- Function tile_reset() Local tile.tile For tile=Each tile If tile\banka<>0 Then FreeBank tile\banka If tile\bankd<>0 Then FreeImage tile\bankd If tile\image<>0 Then FreeImage tile\image Delete tile Next End Function ;--------------------------------------------------------------------- ;tile: tileset handle ;anim: anim number (1...) ;frame: current anim frame (1...) ;--------------------------------------------------------------------- Function tile_setanimframe(tile.tile,anim,frame) Local bank Local frames If tile=Null Then Return If tile\banka<>0 And anim=>1 And anim<=tile\anims Then bank=PeekInt(tile\banka,anim*4-4) ;anim bank frames=PeekShort(bank,0) ;anim frames If frame<1 Then frame=1 If frame>frames Then frame=frames PokeInt bank,6,MilliSecs() ;anim time PokeShort bank,10,frame ;anim frame EndIf End Function ;--------------------------------------------------------------------- ;tile: tileset handle ;anim: anim number (1...) ;mode: anim mode (1=paused, 2=forward, 3=backward) ;--------------------------------------------------------------------- Function tile_setanimmode(tile.tile,anim,mode) Local bank If tile=Null Then Return If tile\banka<>0 And anim=>1 And anim<=tile\anims Then bank=PeekInt(tile\banka,anim*4-4) ;anim bank PokeByte bank,4,mode ;anim mode EndIf End Function ;--------------------------------------------------------------------- ;tile: tileset handle ;anim: anim number (1...) ;value: default tile value (0-255) ;--------------------------------------------------------------------- Function tile_setanimval(tile.tile,anim,value) Local bank If tile=Null Then Return If tile\banka<>0 And anim=>1 And anim<=tile\anims Then bank=PeekInt(tile\banka,anim*4-4) ;animbank PokeByte bank,5,value ;default value EndIf End Function ;--------------------------------------------------------------------- ;tile: tileset handle ;frame: frame number (1...) ;value: default tile value (0-255) ;--------------------------------------------------------------------- Function tile_setframeval(tile.tile,frame,value) If tile=Null Then Return If tile\bankd<>0 And frame=>1 And frame<=tile\count Then PokeByte tile\bankd,frame-1,value EndIf end function |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast den Type "layer" nicht deklariert. Also kannst du auch keine Variable mit diesem Typ haben.
mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Quäiny |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
und wie soll ich das machen, ich hab keinen plan, das ist ja ein beispiel und da ist das nicht angegeben | ||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann mir schwer vorstellen, dass das das Original-Beispiel ist. So ein Fehler ist doch recht grob. Dir fehlt einfach sowas:
Code: [AUSKLAPPEN] Type layer
Field waswessich End Type Kann es sein, dass du da eine Include-Datei zum Laufen bringen willst? Also dass der eigentliche Mapeditor in ner anderen BB-Datei drin steckt? Nur eine Vermutung. Hab mich noch nie mit Mapeditoren ausn inet gespielt. Schreib sie mir immer selber ![]() mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
QuäinyBetreff: ok noch mal von neu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sry, das ist der eigentliche code, da sagt er bei dem fenster, das die function sort fehlerhaft ist
Code: [AUSKLAPPEN] ;////////////////////////////////////////////////////////////// ;// PLEASE COPY MAPENGINE-FOLDER INSIDE THIS EXAMPLE-FOLDER // ;// BITTE KOPIERE MAPENGINE-ORDNER IN DIESEN BEISPIEL-ORDNER // ;////////////////////////////////////////////////////////////// ;---------------------------------------------- ;- Beispiel für den Mapeditor von TS - ;-RPG Grafiken mit Kollisionen und Pfadfindung- ;- und levelwechsel - ;- von Jan Kuhnert - ;---------------------------------------------- ;---------------------------------------------- ;- Example vor the Mapeditor from TS - ;-RPG Graphics with Collisions And Pathfinging- ;- and levelswitch - ;- by Jan Kuhnert - ;---------------------------------------------- ;---------------------------------------------- ;-Check out: - ;- -www.Mapeditor.de.vu - ;- -www.Blitzbase.de - ;- -www.FX-Visions.de - ;- -www.Eastern-sphere.de - ;---------------------------------------------- ;---------------------------------------------- ;- Programmed in Blitz Basic Plus - ;---------------------------------------------- ;---------------------------------------------- ;- Graphics: - ;- www.RPG2000.de from the famous RPG Maker - ;---------------------------------------------- ;---------------------------------------------- ;- Pathfinding: - ;- www.Blitzbase.de from TS - ;---------------------------------------------- ;---------------------------------------------- ;- Question please in the Blitz Basic Forum - ;- German: www.Blitzforum.de - ;- International: www.Blitzbasic.com - ;- Or a Mail to cruiser@bossmail.de - ;---------------------------------------------- ;---------------------------------------------- ;- Buy this - ;- Editor: www.Mapeditor.de.vu - ;- - ;- Book: Spieleprogrammieren - ;- lernen in Blitzbasic - ;- - ;- by Renè Meyer - ;- - ;- 3D Editor: www.Scream3d.de - ;- - ;- Partikelengine: - ;- www.X-pressive.com\PartikelCandy - ;- - ;- and every thing from Jan Kuhnert =) - ;---------------------------------------------- ;Include the Mapengine ;Lädt die Zeichen routine, die beim Editor dabei ist. Include "mapengine\mapengine.bb" ;Map, to load ;Karte die Zu laden ist Global startx,goneX,posx,starty,goneY,posy,animframe,endx,endy,gox,goy Type lvl_wechsel Field x Field y Field ziel$ End Type Dim nodemap(0,0) Dim map(0,0) ;some thing for the pathfinding ;paar was für die Pfadfindung Global mapwidth Global mapheight Dim dirx(7) Dim diry(7) Dim dirz(7) Data 0,-1,0, -1,0,0, 1,0,0, 0,1,0, -1,-1,1, 1,-1,1, -1,1,1, 1,1,1 For i=0 To 7 Read dirx(i) Read diry(i) Read dirz(i) Next ; Create a window in the center of the Desktop ; Erstellt ein Fenster in der Mitte des Desktop Fenster=CreateWindow ("Jans RPG Example", ClientWidth(Desktop())/2-200, ClientHeight(Desktop())/2-212, 401,450,0,11) ;Canvas ;erstellt das Sichfenster Canvas=CreateCanvas (1,5, 390, 390, Fenster ) SetGadgetLayout Canvas,1,1,1,1 ;timer for the fps ;Uhr, für die Frames pro Sekunde Timer=CreateTimer (500) ;Without timer modern PC's have 200 and more FPS! ;ohne Timer Haben Moderne Rechner 200 und mehr Bilder pro sekunde! loadlevel("Data\Jan1.map") ;Load the picture from the Hero ;lädt das Bild, des Helden Global Held_Pic = LoadAnimImage("Data\Held_jan.bmp",24,32,0,12) MaskImage Held_pic,255,0,255 ;Canvas sizes ;Zeichenfläsche größen Const width=390 Const height=390 ;fill a string for the Statustext ;ein String für den Statustext Werbung$ = "visit www.Mapeditor.de.vu and www.fx-visions.de ESC to Close" ;init. the Backbuffer ;lädt den Backbuffer SetBuffer CanvasBuffer (Canvas) ;Main part ;Hauptschleife While Not KeyHit(1) ;Wait for Windows events ;Wartet auf Windows Erreignisse Repeat Event = WaitEvent () If event = $803 Then End Until event = $4001 ;Make some comercial for the Statustext ;so nun mal ein wenig Werbung :-) g$="" For m = 0 To i/5 g$ = g$ + " " Next SetStatusText (Fenster, g$+Werbung$) i = i + h If i = 250 Then h = -1 ElseIf i =0 Then h = 1 ElseIf h = 0 Then h=1 EndIf ;center the player in the Canvas ;hällt den Spieler mittig map_scrollx= (StartX * 16) - (width /2 - 8)+posx+goneX map_scrolly= (Starty * 16) - (height /2 - 8)+posy+goneY ;Mapeditor routins ;Mapeditor routinen tile_animate() draw_map2() ;calculate some things for the Mouse Position ;errechnet die Mausposition realmouseX = MouseX()-(GadgetX (fenster)+GadgetX (canvas)) realmouseY = MouseY()-(GadgetY (fenster)+GadgetY (canvas)) FaktorX# = Float(width)/Float(GadgetWidth (canvas)) Faktory# = Float(height)/Float(GadgetHeight (canvas)) ;find the path and move at Mousehit ;lässt die Figur beim Tastendruck laufen If MouseDown(1) Then endx = ((realmouseX*FaktorX#)-posx+map_scrollx+8)/16-1 endy = ((realmouseY*FaktorY#)-posy+map_scrolly)/16-2 If endx > 0 And endy > 0 And endx < mapwidth And endy < mapheight Then If map(endx,endy) = 0 Then pathfinding0(endx,endy,startx,starty) EndIf EndIf If goX*16 < (startX*16)+GoneX Then goRealX# = goRealX#-(1.0/FPS*40.0): Animfloat# = Animfloat# + (z#/FPS): Animframe = 9 + (Animfloat#/4) If goX*16 > (startX*16)+GoneX Then goRealX# = goRealX#+(1.0/FPS*40.0): Animfloat# = Animfloat# + (z#/FPS): Animframe = 3 + (Animfloat#/4) If goY*16 < (startY*16)+GoneY Then goRealY# = goRealY#-(1.0/FPS*40.0): Animfloat# = Animfloat# + (z#/FPS): Animframe = 0 + (Animfloat#/4) If goY*16 > (startY*16)+GoneY Then goRealY# = goRealY#+(1.0/FPS*40.0): Animfloat# = Animfloat# + (z#/FPS): Animframe = 6 + (Animfloat#/4) goneX = goRealX# goneY = goRealY# If goneX >=16 Then StartX = StartX+1:goRealX# = 0:gonex=0 If goneY >=16 Then StartY = StartY+1:goRealY# = 0:goney=0 If goneX <=-16 Then StartX = StartX-1:goRealX# = 0:gonex=0 If goneY <=-16 Then StartY = StartY-1:goRealY# = 0:goney=0 If Int(Animfloat#) >= 9 Then z# = -40 ElseIf Int(Animfloat#) = 0 Then z# = 40 ElseIf Int(Animfloat#) <= 2 Then z# = 40 EndIf ;find the path ;Pfadfinde Ergenisse auswerten If goneX = 0 And goneY = 0 Then For node.node=Each node If node\parent<>Null Then If node\X= startx And node\Y = starty Then gox = node\parent\x goy = node\parent\y EndIf EndIf Next EndIf ;Check if the player Collide with the Levelout ;testet, ob der Spieler mit dem Levelausgang kollidiert For lvl.lvl_wechsel = Each lvl_wechsel If startx = lvl\x And starty = lvl\y Then NewLvl$ = "Data\"+lvl\ziel$+".map" DebugLog lvl\ziel$+".map" loadlevel(NewLvl$) EndIf Next ;Show the FPS ;Zeigt die Bilder pro Sekunde t3 = t3+1:If t3 = 4 Then t3=0:t2=t1:t1 = MilliSecs():Fps = 5000.0/(t1-t2) Text 0,0,"FPS: " + FPS ;Flip Buffers ;Zeichnet flimmerfreies Bild FlipCanvas Canvas,1 Wend End ; The function from TS, but with Player drawing ; Die function aus der Mapengine, nur mit Spieler zeichenen Function draw_map2() Local b Local g Local layer.layer Local px Local py Local r Viewport map_x, map_y, map_width, map_height Origin map_x, map_y If map_visible=1 Then If map_mode=2 And map_image<>0 Then px=map_getscreen(map_posx,map_parax,map_scrollx) py=map_getscreen(map_posy,map_paray,map_scrolly) TileBlock map_image,px,py ElseIf map_mode=3 And map_image<>0 Then px=map_getscreen(map_posx,map_parax,map_scrollx) py=map_getscreen(map_posy,map_paray,map_scrolly) TileImage map_image,px,py EndIf EndIf For layer=Each layer If layer\visible=1 Then Select layer\code Case layer_map layer_map_draw(layer) Case layer_clone layer_clone_draw(layer) Case layer_image layer_image_draw(layer) Case layer_block layer_block_draw(layer) End Select EndIf ;Draw the Player ;zeichnen des Spielers! If layer\name$ = "Player" Then Color 0,0,255 Oval (endx*16)+posx-map_scrollx,(endy*16)+posy-map_scrolly,16,16,0 Rect (endx*16)+posx-map_scrollx+7,(endy*16)+posy-map_scrolly,2,16,0 Rect (endx*16)+posx-map_scrollx,(endy*16)+posy-map_scrolly+7,16,2,0 Color 255,0,0 Oval (startx*16)+goneX+posx-map_scrollx,(starty*16)+goneY+posy-map_scrolly,16,16,0 DrawImage Held_Pic,(startx*16)+goneX+posx-map_scrollx-4,(starty*16)+goneY+posy-map_scrolly-16,Int(Animframe ) EndIf Next End Function Function loadlevel(Levelname$) ;Load the Map ;Lädt die Karte error=map_load(Levelname$,"") ;Check for errors ;Verarbeitet die Fehler Select error Case 1 Notify "File not found" Case 2 Notify "File size corrupted" Case 3 Notify "No read access" Case 4 Notify "Not valid file" Case 5 Notify "Checksum problem" Case 6 Notify "Password problem" Case 7 Notify "Load image problem" End Select If error>0 Then End ;read some data from the mapengine ;liest Daten aus dem Types von TS's Mapengine For node.node=Each node Delete node Next For lvl.lvl_wechsel =Each lvl_wechsel Delete lvl Next For layer.layer = Each layer ;Data for the Collisions ;Daten für die Kollisionen If layer\name$ = "Player" Then mapwidth =layer\sizeX mapheight =layer\sizeY Dim nodemap(mapwidth,mapheight) PosX = layer\Posx PosY = layer\posy Dim map(layer\sizeX,layer\sizeY) For x = 0 To layer\sizeX For y = 0 To layer\sizeY map(X,Y)= layer_getvalue(layer,x,y) Next Next EndIf ;Read the start position from the player ;liest die Player Position If layer\name$ = "Start" Then startx = (layer\posx)/16-posx/16 StartY = (layer\posy)/16-posy/16 Endx = startx endy = StartY gox = startX Goy = StartY EndIf ;find the exit of the map ;findet die Stellen, wo ein Levelwechsel Statfinden soll. If Left(layer\name$,3) = "lvl" Then lvl.lvl_wechsel = New lvl_wechsel lvl\x = (layer\posx)/16-(posx/16) lvl\Y = (layer\posy)/16-(posy/16) lvl\ziel$ = Right(layer\name$,Len(layer\name$)-3) EndIf Next End Function ;the Pathfinding routine ;die Pfadfinde Routine Type node Field parent.node Field cost Field x Field y End Type Type open Field node.node End Type Type path Field node.node End Type ;you can change it with the 8 way routine, easyly ;man can diese durch die 8 wege Routine einfach austauschen. Function pathfinding0(startx,starty,endx,endy) Delete Each node Delete Each open Delete Each path Dim nodemap(mapwidth,mapheight) If startx=endx And starty=endy Then Return node.node=New node node\x=startx node\y=starty open.open=New open open\node=node nodemap(startx,starty)=1 .again0 node=Null cost=2147483647 For open=Each open delta=Abs(open\node\x-endx)+Abs(open\node\y-endy) If open\node\cost+delta<cost Then cost=open\node\cost+delta node=open\node tempopen.open=open EndIf Next If node=Null Then Return Delete tempopen For i=0 To 3 x=node\x+dirx(i) y=node\y+diry(i) If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then If map(x,y)=0 And nodemap(x,y)=0 Then tempnode.node=New node tempnode\parent=node tempnode\cost=node\cost+1 tempnode\x=x tempnode\y=y open.open=New open open\node=tempnode nodemap(x,y)=1 If x=endx And y=endy Then finish=1:Exit EndIf EndIf Next If finish=0 Then Goto again0 While tempnode\parent<>Null path.path=New path path\node=tempnode tempnode=tempnode\parent Wend path.path=New path path\node=tempnode End Function |
||
![]() |
Entenfels |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Quäiny,
ich habe auch erst vor ein paar Monaten mit BB angefangen und wollte mich ebenfalls an einem RPG-Editor üben. Die RPG-Tutorials haben mich nicht weitergebracht, doch mein Tipp wäre das Tyle-Editor-Tutorial. Damit konnte zumindest ich viel mehr anfangen. Und hat man erst mal das kapiert, versteht man auch das andere besser. Hoffe, es hilft dir Grüße Entenfels |
||
Die Details sind zu 94 Prozent zutreffend, bei sechs Prozent unvermeidbarer Extrapolation.
-Artemis Fowl von Eoin Colfer |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube du compilierst ganz einfach die falsche Datei, nämlich eine der Includes.
Klick mal in der IDE auf die Date in der das wirkliche Beispiel drin ist... |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group