Seite 1 von 1

Verfasst: 07.03.2009 18:28
von GeRoNIMO
Hey hab mal ne Frage zur Kamera, was muss ich machen, damit die Kamera sich bewegt, wenn ich am Bildschirmrand bin.

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
[/code]
-------------------------------------------------------------------------------------

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
---------------------------------------------------------------------------------------

Verfasst: 07.03.2009 18:34
von cxAlex
Könntest du bitte deinen 1. Post editieren? Ist einfach furchtbar wenn man soweit runterscrollen muss....

Verfasst: 07.03.2009 18:35
von Andesdaf
ja, bitte.

Verfasst: 12.03.2009 12:06
von GeRoNIMO
Hey könnter ihr mir jetzt bitte helfen is wichtig. danke

Verfasst: 12.03.2009 12:21
von Kaeru Gaman
ihr seid alle drei nicht höflich!

wie wärs, wenn ihr erstmal vor die tür geht und euch kloppt,
und ich lösch solange die überzähligen postings....

Verfasst: 12.03.2009 19:20
von GeRoNIMO
Ich bins nochma und zwar wäre ich euch unendlich dankbar, wenn ihr mir helfen würdet auf den oben genannten code ein Hauptmenü einzubauen. Muss nichts besonderes sein nur Spiel starten, beenden un evtl noch en highscore button. Hey dieses Projekt ist echt wichtig, ist für die schule.
Falls ich ein bissel unfreundlich rübergekommen bin tuts mir echt leid sry. hoffe ihr könnt mir helfen


thx im voraus

Verfasst: 13.03.2009 19:56
von xperience2003
Ich bins nochma und zwar wäre ich euch unendlich dankbar, wenn ihr mir helfen würdet auf den oben genannten code ein Hauptmenü einzubauen.
also wenn du das nich hinkriegst, was solls dann erst mit schussroutinen, gegnerbewegung und anderen game-schnick-schnack werden

Verfasst: 13.03.2009 21:59
von Tur0k
Learning by doing... :lol:

Es gibt *glaub* genug Beispiele im Forum. Wie wärs mit [SUCHEN]. :?