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.
Wurde geändert
Erweitert:
Player kann nun auch bei Mapende bis zum Randlaufen :)
Das Ganze natürlich auch ohne Frameverlust bei grossen Maps.
// --------------------------------- //
// 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
Sehr schön!
Ich sehe, du hast meinen Code verstanden gehabt !
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 ;)
Jow find ich super!
Sein wissen zu teilen ist in Programmierkreisen ja nicht so selbstverständlich!
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"
// --------------------------------- //
// 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
Ich glaub' das geht nicht mehr. Bitte ändern, wenn mal Zeit ist, ja?
Jepp,
da war noch der alte Sprite befehl drin, habs in Drawsprite geändert.
getestet & geht? Manchmal geht ein
MAX(0, a/b) nicht, weil 0=integer, und a/b=double-> a/b wird auf integer gewandelt :s
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 :)