Problem mit Kamera in Spiel

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
GeRoNIMO
Beiträge: 5
Registriert: 26.01.2009 23:17

Beitrag 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
---------------------------------------------------------------------------------------
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Könntest du bitte deinen 1. Post editieren? Ist einfach furchtbar wenn man soweit runterscrollen muss....
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

ja, bitte.
Win11 x64 | PB 6.20
GeRoNIMO
Beiträge: 5
Registriert: 26.01.2009 23:17

Beitrag von GeRoNIMO »

Hey könnter ihr mir jetzt bitte helfen is wichtig. danke
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
GeRoNIMO
Beiträge: 5
Registriert: 26.01.2009 23:17

Beitrag 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
xperience2003
Beiträge: 972
Registriert: 04.10.2004 18:42
Computerausstattung: Amiga, LinuxMint, Windows7
Wohnort: gotha
Kontaktdaten:

Beitrag 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
amiga rulez...
Rebirth Software
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Learning by doing... :lol:

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