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

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • 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: 1066
    • 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: 5060
  • 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 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • 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: 5060
  • 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 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • 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: 10741
  • 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: 1066
    • 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: 10741
  • 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: 1066
    • 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