Scrolling beispiel, Player auf Map

Previous topic - Next topic

D2O

Hi, kleines beispiel wie sich der Player auf einer Map bewegt und die map erst ab einer bestimmten position anfäng zu scrollen.
Ist noch ausbaufähig damit der player auch aus dem "Playerbereich" bei mapend weiter läuft ;)

Für die gfx einfach zwei 32*32 bildchen nehmen.
Code (glbasic) Select
Wurde geändert
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

D2O

#1
Erweitert:
Player kann nun auch bei Mapende bis zum Randlaufen :)
Das Ganze natürlich auch ohne Frameverlust bei grossen Maps.

Code (glbasic) Select
// --------------------------------- //
// Project: Advance scrolling by D²O d2o-games.com  //Original scrolling by Schranz0r
// Start: Saturday, February 21, 2009
// IDE Version: 6.171





SETSCREEN 800,600,0 //Bildschrim auflösung setzen
LIMITFPS -1
GLOBAL GraphX%,GraphY%
GETSCREENSIZE GraphX, GraphY //Bildschrim auflösung in die Variablen speichern


@Global_Var:


SETTRANSPARENCY RGB(255,0,0) // Tranparenz farbe auf rot setzen

LOADSPRITE "gras.png", 0 //Bild laden mit der ID 0
LOADSPRITE "player.png",1
GLOBAL playerx%,playery%

playerx = 200
playery = 200

GLOBAL gox%,goy% //Wird für Mapscrolling benötigt


GLOBAL MaxTX% = 40 // Tileanzahl X Achse
GLOBAL MaxTY% = 40 // Tileanzahl Y Achse
GLOBAL TS% = 32 // Tilegrösse 32pixel

GLOBAL level%[]
DIM level [MaxTX][MaxTY] // Array erstellen

GLOBAL scroll_speed% = 1 // Scrollspeed 1pixel
GLOBAL x%,y%,startx%,starty%,endx%,endy% //Var für forschleife
GLOBAL posx%,posy% // Var für die scollposition


@Mainloop:
//######################## Mainloop Start ################################
WHILE TRUE
updatefor()
scroll()
scrollmap(gox,goy)

FOR y = starty TO endy
FOR x = startx TO endx
DRAWSPRITE 0,posx+TS*x,posy+TS*y

NEXT
NEXT

DRAWSPRITE 1,playerx,playery

PRINT "startx:"+startx,10,10
PRINT "endx: "+endx,10,20
PRINT "starty:"+starty,10,30
PRINT "endy: "+endy,10,40
PRINT "Fames: "+getfps(),10,50
PRINT "posx: "+posx,10,60

// Optische Kontrollinien

DRAWLINE 150,150,150,450,RGB(0xff, 0x00, 0x00)
DRAWLINE 650,150,650,450,RGB(0xff, 0x00, 0x00)

DRAWLINE 150,150,650,150,RGB(0xff, 0x00, 0x00)
DRAWLINE 150,450,650,450,RGB(0xff, 0x00, 0x00)

SHOWSCREEN
WEND
END
//######################## Mainloop End #################################




@Functions:

// Variablen für Forschleife updaten, enthält Globale variablen
FUNCTION updatefor:
//Startwert für die forschleife
startx = ABS(posx/TS)
starty = ABS(posy/TS)

//endwerte für die forschleife
endx = startx +(GraphX/TS)
IF endx > MaxTX THEN endx = MaxTX

endy = starty +(GraphY/TS)+1   //+1 da man hier in einen Kommabereich reinkommt!
IF endy > MaxTY THEN endy = MaxTY


ENDFUNCTION

// Für das scrolling
FUNCTION scroll:

IF KEY(203)
   
IF playerx < 150  AND posx < 0
DEC playerx,scroll_speed
playerx = 150
gox = 1
ELSE
DEC playerx,scroll_speed
IF playerx < 0 THEN  playerx = 0

ENDIF
ENDIF


IF KEY(205)
   
    IF playerx > 650 - TS AND posx > GraphX-(TS*MaxTX)
    INC playerx,scroll_speed
    playerx = 650 - TS
    gox = 2
    ELSE
    INC playerx,scroll_speed
IF playerx >= GraphX-TS THEN  playerx = GraphX-TS

    ENDIF
ENDIF



IF KEY(208)

    IF playery > 450 - TS AND posy > GraphY-(TS*MaxTY)
    INC playery,scroll_speed
    playery = 450 - TS
    goy = 2
    ELSE
    INC playery,scroll_speed
IF playery >= GraphY-TS THEN  playery = GraphY-TS
    ENDIF
ENDIF


IF KEY(200)

    IF playery < 150 AND posy < 0
    DEC playery,scroll_speed
    playery = 150
    goy = 1
ELSE
DEC playery,scroll_speed
IF playery < 0 THEN  playery = 0   
    ENDIF
ENDIF



ENDFUNCTION



FUNCTION scrollmap:l_x%,l_y%
IF l_x = 1 THEN INC posx,scroll_speed
IF l_x = 2 THEN DEC posx,scroll_speed
IF l_y = 1 THEN INC posy,scroll_speed
IF l_y = 2 THEN DEC posy,scroll_speed


IF posx > 0 THEN posx = 0
IF posy > 0 THEN posy = 0
IF posx < (0-(TS*MaxTX)) + GraphX THEN posx = (0-(TS*MaxTX)) + GraphX

IF posy < (0-(TS*MaxTY)) + GraphY THEN posy = (0-(TS*MaxTY)) + GraphY

gox = 0
goy = 0
ENDFUNCTION


FUNCTION getfps:

STATIC fps_time%,fps_counter%,fps%,fps_temp%
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF

RETURN fps
ENDFUNCTION
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Sehr schön!
Ich sehe, du hast meinen Code verstanden gehabt !
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

Jepp: allerding muss ich sagen das ich das vom Prinzieb her schon im Mapeditor nutzte ;)
Dein Beispiel was aber schön übersichtlich, da dachte ich mir, einige habe vieleicht etwas probleme mit so einem scrolling.
Da Poste ich doch auch mal wieder was ;)
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Jow find ich super!
Sein wissen zu teilen ist in Programmierkreisen ja nicht so selbstverständlich!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

#5
Kleine Sprungfunction,
einfach copy and paste , jump() und KeyHitUpdate() im Mainloop aufrufen.

Update:
Funktionsbeispiel direct eingebaut.
Variablen auf Ganzzahlen gestellt. Code geht auch mit "Expliziet"

Code (glbasic) Select
// --------------------------------- //
// Project: Advance scrolling by D²O d2o-games.com  //Original scrolling by Schranz0r
// Start: Saturday, February 21, 2009
// IDE Version: 6.171






SETSCREEN 800,600,0 //Bildschrim auflösung setzen
LIMITFPS 80
GLOBAL GraphX%,GraphY%
GETSCREENSIZE GraphX, GraphY //Bildschrim auflösung in die Variablen speichern


@Global_Var:


SETTRANSPARENCY RGB(255,0,0) // Tranparenz farbe auf rot setzen

LOADSPRITE "gras.png", 0 //Bild laden mit der ID 0
LOADSPRITE "player.png",1
GLOBAL playerx%,playery%

playerx = 200
playery = 200

GLOBAL gox%,goy% //Wird für Mapscrolling benötigt


GLOBAL MaxTX% = 40 // Tileanzahl X Achse
GLOBAL MaxTY% = 40 // Tileanzahl Y Achse
GLOBAL TS% = 32 // Tilegrösse 32pixel

GLOBAL level%[]
DIM level [MaxTX][MaxTY] // Array erstellen

GLOBAL scroll_speed% = 1 // Scrollspeed 1pixel
GLOBAL x%,y%,startx%,starty%,endx%,endy% //Var für forschleife
GLOBAL posx%,posy% // Var für die scollposition


@Mainloop:
//######################## Mainloop Start ################################
WHILE TRUE
KeyHitUpdate()
updatefor()
scroll()
scrollmap(gox,goy)
jump()

FOR y = starty TO endy
FOR x = startx TO endx
DRAWSPRITE 0,posx+TS*x,posy+TS*y

NEXT
NEXT

DRAWSPRITE 1,playerx,playery

PRINT "startx:"+startx,10,10
PRINT "endx: "+endx,10,20
PRINT "starty:"+starty,10,30
PRINT "endy: "+endy,10,40
PRINT "Fames: "+getfps(),10,50
PRINT "posx: "+posx,10,60

// Optische Kontrollinien

DRAWLINE 150,150,150,450,RGB(0xff, 0x00, 0x00)
DRAWLINE 650,150,650,450,RGB(0xff, 0x00, 0x00)

DRAWLINE 150,150,650,150,RGB(0xff, 0x00, 0x00)
DRAWLINE 150,450,650,450,RGB(0xff, 0x00, 0x00)

SHOWSCREEN
WEND
END
//######################## Mainloop End #################################




@Functions:

// Variablen für Forschleife updaten, enthält Globale variablen
FUNCTION updatefor:
//Startwert für die forschleife
startx = ABS(posx/TS)
starty = ABS(posy/TS)

//endwerte für die forschleife
endx = startx +(GraphX/TS)
IF endx > MaxTX THEN endx = MaxTX

endy = starty +(GraphY/TS)+1   //+1 da man hier in einen Kommabereich reinkommt!
IF endy > MaxTY THEN endy = MaxTY


ENDFUNCTION

// Für das scrolling
FUNCTION scroll:

IF KEY(203)
   
IF playerx < 150  AND posx < 0
DEC playerx,scroll_speed
playerx = 150
gox = 1
ELSE
DEC playerx,scroll_speed
IF playerx < 0 THEN  playerx = 0

ENDIF
ENDIF


IF KEY(205)
   
    IF playerx > 650 - TS AND posx > GraphX-(TS*MaxTX)
    INC playerx,scroll_speed
    playerx = 650 - TS
    gox = 2
    ELSE
    INC playerx,scroll_speed
IF playerx >= GraphX-TS THEN  playerx = GraphX-TS

    ENDIF
ENDIF



IF KEY(208)

    IF playery > 450 - TS AND posy > GraphY-(TS*MaxTY)
    INC playery,scroll_speed
    playery = 450 - TS
    goy = 2
    ELSE
    INC playery,scroll_speed
IF playery >= GraphY-TS THEN  playery = GraphY-TS
    ENDIF
ENDIF


IF KEY(200)

    IF playery < 150 AND posy < 0
    DEC playery,scroll_speed
    playery = 150
    goy = 1
ELSE
DEC playery,scroll_speed
IF playery < 0 THEN  playery = 0   
    ENDIF
ENDIF



ENDFUNCTION



FUNCTION scrollmap:l_x%,l_y%
IF l_x = 1 THEN INC posx,scroll_speed
IF l_x = 2 THEN DEC posx,scroll_speed
IF l_y = 1 THEN INC posy,scroll_speed
IF l_y = 2 THEN DEC posy,scroll_speed


IF posx > 0 THEN posx = 0
IF posy > 0 THEN posy = 0
IF posx < (0-(TS*MaxTX)) + GraphX THEN posx = (0-(TS*MaxTX)) + GraphX

IF posy < (0-(TS*MaxTY)) + GraphY THEN posy = (0-(TS*MaxTY)) + GraphY

gox = 0
goy = 0
ENDFUNCTION


FUNCTION getfps:

STATIC fps_time%,fps_counter%,fps%,fps_temp%
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF

RETURN fps
ENDFUNCTION


FUNCTION jump:
STATIC s_speed% = 3
STATIC s_ctrl%
STATIC s_temp%
STATIC s_jumpmax% = 120 //Sprunghöhe


IF KeyHit(57) = 2 AND s_ctrl = 0 //Space
s_ctrl = 1
s_temp = playery
ENDIF


IF s_ctrl = 1
DEC playery,s_speed
ENDIF

IF playery < s_temp - s_jumpmax THEN s_ctrl = 3
IF s_ctrl = 3 THEN INC playery,s_speed

IF playery >= s_temp THEN s_ctrl = 0
IF s_ctrl = 0 THEN s_temp = playery

ENDFUNCTION

FUNCTION KeyHitUpdate:
GLOBAL   gKeyDown%[], gKeyState%[]
LOCAL  k%
LOCAL i%
STATIC a%
    // First Time call/ zum ersten Mal hier
    //IF BOUNDS(gKeyDown[],0)=0
    IF a = 0
        DIM gKeyDown[256]
        DIM gKeyState[256]
        a =1
    ENDIF

    // For each key / für jede Taste
    FOR i=0 TO 255
        k = KEY(i)
        // Key is pressed / Taste ist gedrückt
        IF k
            IF gKeyDown[i]
                gKeyState[i]=1
            ELSE
                gKeyDown[i]=1
                gKeyState[i]=2
            ENDIF
        ELSE
            // Key is not pressed / Taste nicht gedrückt

            // Has key been pressed before?
            // War die Taste gedrückt?
            IF gKeyDown[i]
                gKeyDown[i] = 0
                gKeyState[i] = -1
            ELSE
                gKeyState[i]=0
            ENDIF
        ENDIF
    NEXT
ENDFUNCTION





//  0 = not pressed / nicht gedrückt
//  2 = just pressed / gerade runtergedrückt
//  1 = pressed / gedrückt (gehalten)
// -1 = release event / wieder losgelassen
FUNCTION KeyHit: nkey%
    RETURN gKeyState[nkey]
ENDFUNCTION
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

Ich glaub' das geht nicht mehr. Bitte ändern, wenn mal Zeit ist, ja?

D2O

Jepp,
da war noch der alte Sprite befehl drin, habs in Drawsprite geändert.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

getestet & geht? Manchmal geht ein
MAX(0, a/b) nicht, weil 0=integer, und a/b=double-> a/b wird auf integer gewandelt :s

D2O

#9
Jepp, "Kurzcheck", und lief problemlos bei mir.

Aber ich werde das ganze nochmals richtig anschauen und soweit anpassen.

Edit: So, sollte eigendlich überall so laufen.
Falls ich Doch was übersehen haben sollte, gleich hier rein :)
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell