Code: Alles auswählen
1. Dokument -----------------------------------------------
[code]; Array für Spielemap
Global Dim game_map(15, 27)
; Tile und Spielfigur Grössen
TSDim = 40
; Jump&Run - Engine initialisieren
XIncludeFile "engine.pbi"
jnr_init(15, 27, TSDim, TSDim)
; jnr_map() - Daten einlesen
Dim jnr_map(15, 27)
Restore jnr_data
For z1 = 0 To 15
For z2 = 0 To 27
Read jnr_map(z1, z2)
Next z2
Next z1
; Spielfigur erstellen und positionieren
jnr_addplayers(1, 4)
jnr_setpos(0, 1 * TSDim, 10 * TSDim)
If InitSprite() And InitKeyboard()
If OpenScreen(1024, 768, 32, "Tutorial")
ExamineKeyboard()
; Spielfigur
CreateSprite(0, TSDim, TSDim)
LoadSprite(0,"../Bilder für Game/Ente/ente_rechts.bmp")
TransparentSpriteColor(0,RGB(255,255,255))
; Boden
CreateSprite(1, TSDim, TSDim)
LoadSprite(1,"../Bilder für Game/Pinguin/pinguin_rechts.bmp")
;TransparentSpriteColor(1,RGB(255,255,255))
;Wand
CreateSprite(2, TSDim, TSDim)
LoadSprite(2,"../Bilder für Game/Pakman/Pakman_offen_rechts.bmp")
;TransparentSpriteColor(2,RGB(255,255,255))
; Gamemap laden
For z1 = 0 To 15
For z2 = 0 To 27
Read game_map(z1, z2)
Next z2
Next z1
; Geschwindigkeit kann hier angepasst werden
SetFrameRate(120)
; Loop-Schleife
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
; Spielfigur steuern
If KeyboardPushed(#PB_Key_Up)
jnr_jumping(0, 2 * TSDim, 0)
EndIf
If KeyboardPushed(#PB_Key_Right)
jnr_right(0)
ElseIf KeyboardPushed(#PB_Key_Left)
jnr_left(0)
EndIf
ClearScreen(RGB(0, 0, 0))
; Zugriff auf Engine
jnr_loop()
; Map anzeigen
For z1 = 0 To 15
For z2 = 0 To 27
If game_map(z1, z2) > 0
DisplayTransparentSprite(game_map(z1, z2), z2 * TSDim, z1 * TSDim)
EndIf
Next z2
Next z1
; Spielfigur anzeigen
DisplayTransparentSprite(0, jnr()\x, jnr()\y)
FlipBuffers(0)
ForEver
EndIf
EndIf
; Map-Daten
DataSection
jnr_data:
; Info-Daten für die Jump&Run - Engine
;
; Typ | Begehbar?
; -----------------------------
; 0 = - | (#False)
; 1 = - | (#True)
; 2 = Wolke (Cloud) | (#True)
; 3 = Leiter | (#True)
; ...
Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
game_data:
; Tiles:
; 0 = Leer
; 1 = Mauersprite
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
EndDataSection
-------------------------------------------------------------------------------------
2.Dokument
Code: Alles auswählen
; Globale Variablen
Global Dim jnr_map.l(0, 0)
; Struktur eng
Structure eng
engine.s
copyright.s
mwidth.l
mheight.l
twidth.l
theight.l
offsety.l
offsetx.l
pwidth.l
pheight.l
EndStructure
Global eng.eng
eng\engine = "Jump & Run - Projekt"
; Struktur jnr
Structure jnr
x.l
y.l
cx.l[4]
cy.l[4]
speed_x.l
speed_y.l
height.l
jump.l
jumpdelay.l
jumptimer.l
moving.l
EndStructure
Global NewList jnr.jnr()
; Deklarierungen
Declare cloud()
; Prozeduren
Procedure checkdx()
!extrn _PB_DDrawBase
!MOV Eax,[_PB_DDrawBase]
ProcedureReturn
InitSprite()
EndProcedure
Procedure error(error.s, msg.s)
If checkdx() <> #False
CloseScreen()
EndIf
error + Chr(10) + Chr(10) + msg
If OpenWindow(0, 0, 0, 320, 88, eng\engine, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
EditorGadget(0, 4, 4, 312, 56, #PB_Editor_ReadOnly)
AddGadgetItem(0, -1, Error.s)
ButtonGadget(1, 4, 62, 312, 24, "BEENDEN")
SetActiveGadget(1)
EndIf
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1 : Break
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
End
EndProcedure
Procedure getcorners(x.l, y.l)
; Obenlinks
jnr()\cx[0] = (x - eng\offsetx) / eng\twidth
jnr()\cy[0] = (y - eng\offsety) / eng\theight
; Obenrechts
jnr()\cx[1] = ((x - eng\offsetx) + eng\pwidth - 1) / eng\twidth
jnr()\cy[1] = (y - eng\offsety) / eng\theight
; Untenlinks
jnr()\cx[2] = (x - eng\offsetx) / eng\twidth
jnr()\cy[2] = ((y - eng\offsety) + eng\pheight - 1) / eng\theight
; Untenrechts
jnr()\cx[3] = ((x - eng\offsetx) + eng\pwidth - 1) / eng\twidth
jnr()\cy[3] = ((y - eng\offsety) + eng\pheight - 1) / eng\theight
EndProcedure
Procedure movechar(dirx.l, diry.l, jmpfal.l)
If jnr()\moving = #False
ProcedureReturn #False
EndIf
If jmpfal = 1
act_speed = jnr()\speed_y
Else
act_speed = jnr()\speed_x
EndIf
getcorners(jnr()\x, jnr()\y + act_speed * diry)
If diry = -1 ; Nach oben
If jnr_map(jnr()\cy[0], jnr()\cx[0]) And jnr_map(jnr()\cy[1], jnr()\cx[1])
jnr()\y + act_speed * diry
If jnr()\y < eng\offsety
jnr()\y = eng\offsety
EndIf
Else
jnr()\jump = #False
;jnr()\speed_y = 0
jnr()\y = eng\offsety + (jnr()\cy[0] * eng\theight) + eng\pheight
EndIf
EndIf
If diry = 1 ; Nach unten
If jnr_map(jnr()\cy[2], jnr()\cx[2]) And jnr_map(jnr()\cy[3], jnr()\cx[3]) And jnr_map(jnr()\cy[2], jnr()\cx[2]) <> 2 And jnr_map(jnr()\cy[3], jnr()\cx[3]) <> 2
jnr()\y + act_speed * diry
If jnr()\y = eng\offsety + (eng\mheight * eng\theight) - eng\pheight
jnr()\y = eng\offsety + (eng\mheight * eng\theight) - eng\pheight
EndIf
Else
jnr()\jump = #False
;jnr()\speed_y = 0
jnr()\y = eng\offsety + (jnr()\cy[0] * eng\theight)
EndIf
EndIf
getcorners(jnr()\x + act_speed * dirx, jnr()\y)
If dirx = -1 ; Nach links
If jnr_map(jnr()\cy[0], jnr()\cx[0]) And jnr_map(jnr()\cy[2], jnr()\cx[2])
jnr()\x + act_speed * dirx
If jnr()\x < eng\offsetx
jnr()\x = eng\offsetx
EndIf
EndIf
EndIf
If dirx = 1 ; Nach rechts
If jnr_map(jnr()\cy[1], jnr()\cx[1]) And jnr_map(jnr()\cy[3], jnr()\cx[3])
jnr()\x + act_speed * dirx
If jnr()\x = eng\offsetx + (eng\mwidth * eng\twidth) - eng\pwidth
jnr()\x = eng\offsetx + (eng\mwidth * eng\twidth) - eng\pwidth
EndIf
EndIf
EndIf
EndProcedure
Procedure jump()
jnr()\height - jnr()\speed_y
jnr()\y - jnr()\speed_y
If jnr()\height <= 0
jnr()\height = 0
jnr()\jump = #False
EndIf
movechar(0, -1, 1)
EndProcedure
Procedure fall()
If jnr_map(((jnr()\y - eng\offsety) + eng\pheight / 2) / eng\theight, ((jnr()\x - eng\offsetx) + eng\pwidth / 2) / eng\twidth) = 3
ProcedureReturn
EndIf
jnr()\y + jnr()\speed_y
movechar(0, 1, 1)
EndProcedure
Procedure cloud()
getcorners(jnr()\x, jnr()\y + 1)
If jnr_map(jnr()\cy[2], jnr()\cx[2]) = 2 Or jnr_map(jnr()\cy[3], jnr()\cx[3]) = 2
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
;- --------------------
; --------------------------------------------------------------------------------
; Von hier an beginnen die verwendbaren Befehle
; --------------------------------------------------------------------------------
; Die Engine initialisieren
Procedure jnr_init(mwidth.l, mheight.l, twidth.l, theight.l, offsetx.l = 0, offsety.l = 0)
; mwidth = Kartenbreite in Tiles
; mheight = Kartenhöhe in Tiles
; twidth = Tilebreite in Pixel
; theight = Tilehöhe in Pixel
; offsetx = Abstand in Pixel vom linken Rand zur dargestellten Karte
; offsety = Abstand in Pixel vom oberen Rand zur dargestellten Karte
If (twidth%Cool <> 0
error("Fehler : jnr_init(...)", "Parameter [twidth] nicht durch 8 teilbar!")
EndIf
If (theight%Cool <> 0
error("Fehler : jnr_init(...)", "Parameter [theight] nicht durch 8 teilbar!")
EndIf
eng\mwidth = mwidth
eng\mheight = mheight
eng\twidth = twidth
eng\theight = theight
eng\offsetx = offsetx
eng\offsety = offsety
eng\pwidth = twidth
eng\pheight = theight
EndProcedure
; Ein Spieler hinzufügen
Procedure jnr_addplayers(players.l, speed.l)
For z1 = 1 To players
AddElement(jnr())
jnr()\speed_x = speed
jnr()\speed_y = speed
jnr()\x = 0
jnr()\y = 0
jnr()\jump = #False
jnr()\jumpdelay = 0
jnr()\jumptimer = ElapsedMilliseconds()
jnr()\moving = #True
For z2 = 0 To 3
jnr()\cx[z2] = 0
jnr()\cy[z2] = 0
Next z2
Next z1
EndProcedure
; Ein Spieler entfernen
Procedure jnr_delplayer(player.l)
SelectElement(jnr(), player)
DeleteElement(jnr(), 1)
EndProcedure
; Dieser Befehl kommt in die Spielehauptschleife!
Procedure.l jnr_loop()
ForEach jnr()
If jnr()\jump = #True
jump()
Else
fall()
EndIf
Next
EndProcedure
; Setzt die X und Y - Position
Procedure jnr_setpos(player.l, x.l, y.l)
SelectElement(jnr(), player)
jnr()\x = x
jnr()\y = y
EndProcedure
; Gibt die X-Position zurück
Procedure jnr_getposx(player.l)
SelectElement(jnr(), player)
ProcedureReturn jnr()\x
EndProcedure
; Gibt die Y-Position zurück
Procedure jnr_getposy(player.l)
SelectElement(jnr(), player)
ProcedureReturn jnr()\y
EndProcedure
; Springt die gewünschte Höhe an!
Procedure jnr_jumping(player.l, height.l, delay.l)
SelectElement(jnr(), player)
getcorners(jnr()\x, jnr()\y + 1)
If jnr()\jump = #True Or ElapsedMilliseconds() - jnr()\jumptimer < jnr()\jumpdelay
ProcedureReturn #False
EndIf
If jnr_map(jnr()\cy[2], jnr()\cx[2]) And jnr_map(jnr()\cy[3], jnr()\cx[3]) And cloud() = #False
ProcedureReturn #False
Else
jnr()\jump = #True
jnr()\height = height
jnr()\jumpdelay = delay
jnr()\jumptimer = ElapsedMilliseconds()
ProcedureReturn #True
EndIf
EndProcedure
; Nach oben laufen
Procedure jnr_up(player.l)
SelectElement(jnr(), player)
ProcedureReturn movechar(0, -1, 0)
EndProcedure
; Nach unten laufen
Procedure jnr_down(player.l)
SelectElement(jnr(), player)
ProcedureReturn movechar(0, 1, 0)
EndProcedure
; Nach rechts laufen
Procedure jnr_right(player.l)
SelectElement(jnr(), player)
If jnr()\jump = #False
jnr()\jumpdelay = 0
EndIf
ProcedureReturn movechar(1, 0, 0)
EndProcedure
; Nach links laufen
Procedure jnr_left(player.l)
SelectElement(jnr(), player)
If jnr()\jump = #False
jnr()\jumpdelay = 0
EndIf
ProcedureReturn movechar(-1, 0, 0)
EndProcedure
; Bewegungen blockieren
Procedure jnr_stopmoving(player.l)
SelectElement(jnr(), player)
jnr()\moving = #False
EndProcedure
; Geschwindigkeit ändern
Procedure jnr_setspeed(player.l, speedx.l)
SelectElement(jnr(), player)
jnr()\speed_x = speedx
EndProcedure
; Was für ein Tile befindet sich unter dem Spieler
Procedure jnr_gettile(player.l, x.l, y.l)
SelectElement(jnr(), player)
ProcedureReturn jnr_map(((y - eng\offsety) + eng\pheight / 2) / eng\theight, ((x - eng\offsetx) + eng\pwidth / 2) / eng\twidth)
EndProcedure