Author Topic: Scrolling beispiel, Player auf Map  (Read 5630 times)

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1061
    • View Profile
    • http://www.deuteriumoxid.com
Scrolling beispiel, Player auf Map
« on: 2007-Jul-13 »
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
« Last Edit: 2009-Feb-20 by D²O »
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

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1061
    • View Profile
    • http://www.deuteriumoxid.com
Scrolling beispiel, Player auf Map
« Reply #1 on: 2007-Jul-13 »
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
« Last Edit: 2009-Feb-21 by D²O »
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

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5013
  • O Rly?
    • View Profile
Scrolling beispiel, Player auf Map
« Reply #2 on: 2007-Jul-13 »
Sehr schön!
Ich sehe, du hast meinen Code verstanden gehabt !
I <3 DGArray's :D

PC:
AMD RYzen 7 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1061
    • View Profile
    • http://www.deuteriumoxid.com
Scrolling beispiel, Player auf Map
« Reply #3 on: 2007-Jul-13 »
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

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5013
  • O Rly?
    • View Profile
Scrolling beispiel, Player auf Map
« Reply #4 on: 2007-Jul-13 »
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 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1061
    • View Profile
    • http://www.deuteriumoxid.com
Scrolling beispiel, Player auf Map
« Reply #5 on: 2007-Jul-13 »
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
« Last Edit: 2009-Feb-21 by D²O »
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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10695
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: Scrolling beispiel, Player auf Map
« Reply #6 on: 2009-Feb-20 »
Ich glaub' das geht nicht mehr. Bitte ändern, wenn mal Zeit ist, ja?

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1061
    • View Profile
    • http://www.deuteriumoxid.com
Re: Scrolling beispiel, Player auf Map
« Reply #7 on: 2009-Feb-20 »
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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10695
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: Scrolling beispiel, Player auf Map
« Reply #8 on: 2009-Feb-21 »
getestet & geht? Manchmal geht ein
MAX(0, a/b) nicht, weil 0=integer, und a/b=double-> a/b wird auf integer gewandelt :s

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1061
    • View Profile
    • http://www.deuteriumoxid.com
Re: Scrolling beispiel, Player auf Map
« Reply #9 on: 2009-Feb-21 »
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 :)
« Last Edit: 2009-Feb-21 by D²O »
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