scrollen?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Die Linked Lists machen meine Engine nur etwas langsamer...
Bild
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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
Bild
Antworten