Seite 2 von 2

Verfasst: 30.12.2004 00:08
von MVXA
Ich wollte nur allgemein meine Meinung zum Programmierer und seinem Projekt äußern. Ich finde die besste Methode ein Projekt zu zerstören ist es das Projekt zu Manipulieren und dann damit andere davon abzuhalten es zu spielen.

@Xsoft
Ich kann dir gerne meine Tile Engine senden aber die ein weniger gutes Beispiel für eine schnelle TileEngine. Sie abreitet mit der Linked List und 2 dimensionalen Arrays.

Verfasst: 30.12.2004 00:20
von Kaeru Gaman
ich arbeite immer mit nem array für die tiles.

gehts auch schneller ???

btw: @littlefurz: deine signatur ist superb :allright:


@XSoft:
stell mal konkretere fragen, bitte...

Verfasst: 30.12.2004 01:19
von MVXA
Die Linked Lists machen meine Engine nur etwas langsamer...

Verfasst: 30.12.2004 13:12
von Leo
Also du machst dir einfach die beiden variablen CameraX und CameraY jetzt zählst du wenn man nach links geht auf CameraX die Geschwindigkeit des Spielers drauf, wenn man nach rechts geht zieht man die Geschwindigkeit ab also

Code: Alles auswählen

if Keyboardpushed(#pb_key_left)
  CameraX + SpielerSpeed
elseif keyboardpushed(#pb_key_right)
  CameraX - SpielerSpeed
endif

if keyboardpushed(#pb_key_up)
  CameraY + SpielerSpeed
elseif 
  CameraY - SpielerSpeed
endif 
und jetzt zählst du diese Kamera Variablen einfach immer auf alles drauf was angezeigt wird, zum Beispiel auf das Bild eines hauses:

Code: Alles auswählen

DisplaySprite(#bild_haus,HausPosX+CameraX,HausPosY+CameraY)
noch fragen?? :D

Verfasst: 30.12.2004 16:10
von MVXA
Wenn ich ein Multiplayer spiel machen würde, dann würde ich das ganze eher mit einem 'Camerapool' lösen. Dieser könnte dann mit dem Server abgeglichen werden. Hier ist mal mein Vorschlag:

Hier die Mapload Engine und auch die TileEngine:

Code: Alles auswählen

    Structure s2Dkamera             ;/ TileKamera was in der Map angezeigt werden soll
        CamX.l                      ; Aktuelle Position der Kamera (Breite)
        CamY.l                      ; Aktuelle Position der Kamera (Höhe)
        CamName.s                   ; Aktueller Name der Kamera
    EndStructure
    
    Structure sTile                 ;/ Einzelne Tiles der Welt
        ImageHandle.l               ; handle zur aktuellen Image des Tiles
        Layer.l                     ; Priorität des aktuellen Tiles 
        Option.l                    ; Einzelne Optionen des Tiles
        TileWidth.l                 ; Breite des Tiles
        TileHeight.l                ; Höhe des Tiles
    EndStructure

NewList CamPool.s2Dkamera()
NewList TilePool.sTile()
Dim MapWorld.s(0, 0) 

Procedure ParseMapFile()
    DefType.s FileValue
    DefType.s tmpZeile
    DefType.l ptrZeile
    
    FileValue = ReplaceString(PeekS(VBin(MapFile, "Map.txt", "")), Chr(10), "")
    Repeat
        ptrZeile + 1
        tmpZeile = Trim(StringField(FileValue, ptrZeile, Chr(13)))
        
        If Len(tmpZeile) <> 0
            Debug tmpZeile ;+ " " + Str(Len(tmpZeile))
            ParseMapScript(tmpZeile)            
        EndIf
    Until tmpZeile = ""
EndProcedure

Procedure ParseMapScript(strZeile.s)
    DefType.s MapCMD, MapParam, strTemp
    DefType.l ParmPtr, tmpFnktmp1, tmpFnktmp2
    Dim MapArray.s(20)
    
    MapCMD   = StringField(strZeile, 1, " ")
    MapParam = Right(strZeile, Len(strZeile) - FindString(strZeile, " ", 1))
    
    For ParmPtr = 1 To 20
        strTemp = Trim(StringField(MapParam, ParmPtr, ","))
        MapArray(ParmPtr - 1) = strTemp
    Next
    

    Select LCase(MapCMD)
        Case "#debug"
            Debug MapArray(0)
        Case "#map"
            Dim MapTile.s(Val(MapArray(0)), Val(MapArray(1)))
            MapSizeX = Val(MapArray(0))
            MapSizeY = Val(MapArray(1))
        Case "#tileset"
            AddElement(TilePool())
            
            tmpFnktmp1 = CatchSprite(#PB_Any, VBin(MapFile, MapArray(0),""))
            UseBuffer(tmpFnktmp1)
            TilePool()\ImageHandle = GrabSprite(#PB_Any, Val(MapArray(1)), Val(MapArray(2)), Val(MapArray(3)), Val(MapArray(4)))
            TilePool()\TileWidth   = Val(MapArray(3))
            TilePool()\TileHeight  = Val(MapArray(4))
            TilePool()\Layer       = Val(MapArray(5))
            TilePool()\Option      = Val(MapArray(6))
            FreeSprite(tmpFnktmp1)
            UseBuffer(-1)
        Case "#display"
            SelectElement(TilePool(), Val(MapArray(0))) 
            DisplaySprite(TilePool()\ImageHandle, 0,0)
            FlipBuffers()
        Case "#world"
            For tmpFnktmp1 = 1 To MapSizeX
                MapTile(tmpFnktmp1, Val(MapArray(0))) = Mid(MapArray(1), tmpFnktmp1, 1)
            Next
    EndSelect
    
EndProcedure

Procedure RenderTileWorld(*UsedCam.s2Dkamera)
    DefType.l MapX, MapY
    DefType.l MapCamX, MapCamY
    
    For MapY = 1 To MapSizeY
        For MapX = 1 To MapSizeX
            SelectElement(TilePool(), Asc(MapTile(MapX, MapY)) - 1)
            MapCamX = (MapX*TilePool()\TileWidth  - TilePool()\TileWidth ) + *UsedCam\CamX
            MapCamY = (MapY*TilePool()\TileHeight - TilePool()\TileHeight) + *UsedCam\CamY
            DisplaySprite(TilePool()\ImageHandle, MapCamX, MapCamY)
        Next        
    Next
EndProcedure