First Person Shoter Frage

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
kob
Beiträge: 116
Registriert: 01.01.2008 02:02
Computerausstattung: 2x 2.4 GHz Amd Cpu | Geforce N9600GT OC |2.5GB Ram |Windows 7 Ultimate
Wohnort: Fulda

Fertig

Beitrag von kob »

Hier ist der beispiel source , ohne Entity's und so , nict grade ausfürbahr , solle aber das problem erleutern :

Code: Alles auswählen

InitEngine3D() ; Init solle klar sein
InitSprite()
InitMouse()
InitKeyboard()

OpenScreen(1024,768,32,"TeStInG...")

Structure Shot ; Structure für die schüsse , die später durch die welt dewegt werden 
ID.l
EntityID.l
X.f
Y.f
Z.f
MoveX.f
MoveY.f
MoveZ.f
Speed.f
Damage.l
EndStructure

Global PiOver180 = (ATan(1)*4)/180 ; GLobale variablen , und die liste für die schüsse
Global NewList Shot.Shot()

Procedure AndY_AddShot(ID,Entity,x,y,z,MoveX.f,MoveY.f,MoveZ.f,Speed) ; Soll einen schuss zur der liste hinzufügen 

AddElement(Shot()) ; AddElement also added ein element zur liste
Shot()\ID = ID
Shot()\EntityID = Entity
Shot()\X = X
Shot()\Y = Y
Shot()\Z = Z
Shot()\MoveX = MoveX
Shot()\MoveY = MoveY
Shot()\MoveZ = MoveZ
Shot()\Speed = Speed

EndProcedure

Procedure AndY_ExamineShot();soll die schüsse atualisiren 
If CountList(Shot()) => 1 ; hat liste einträge ?
ForEach Shot() ; jeden schuss durchgehen

Shot()\X + ( Shot()\MoveX * 3 ) ; Bewegung 
Shot()\Y + ( Shot()\MoveY * 3 ) 
Shot()\Z + ( Shot()\MoveZ * 3 )

EntityLocate(Shot()\EntityID,Shot()\X,Shot()\Y,Shot()\Z) ; Entity bewegen 

Next 
EndIf
EndProcedure

Procedure AndY_DeleteShot(ID) ; soll einen schuss löschen
If CountList(Shot()) => 1
ForEach Shot() ; Jedes element

If Shot()\ID = ID ; ID = FindeID then LÖSCHEN 
DeleteElement(Shot())
EndIf

Next 
EndIf
EndProcedure

CreateCamera(1,0,0,100,100);Erstellt kamera

Repeat ;Sollte klar sein

ExamineMouse() ; Aktualisirt die maus
ExamineKeyboard()

If KeyboardPushed(#PB_Key_W) ; Bewegung der Camera , das mit Move BlaBlaBla funktionirt , aber nicht hier :)
MoveForward = 1
ElseIf KeyboardPushed(#PB_Key_S)
MoveBackward = 1
Else
MoveGarnicht = 1
EndIf

If KeyboardPushed(#PB_Key_A)
MoveLeft = 1
ElseIf KeyboardPushed(#PB_Key_D)
MoveRight = 1
Else
MoveGarnicht = 1
EndIf

If MouseButton(#PB_MouseButton_Left) = 1 ; Wen TASTE gedrückt ist , dan adde schuss
BewegX.f                  = -Sin(CamrotY*piover180) ; Hier ist der bug denke ich mal 
BewegY.f                  =  Sin(CamrotX*piover180)
BewegZ.f                  = -Cos(CamrotY*piover180)

AndY_Con_DebugText(Str(BewegX)) ; Debugen in console
AndY_Con_DebugText(Str(BewegY))
AndY_Con_DebugText(Str(BewegZ))

AndY_AddShot(1,#SR71_Shell,CameraX(1),CameraY(1),CameraZ(1),BewegX.f,BewegY.f,BewegZ.f,2) ; Schuss adden
EndIf

MouseX = -MouseDeltaX()/10 ;MouseRotation überprüfen
MouseY = -MouseDeltaY()/10
camrotx + Mousey ; CamRotX hoher zählen
camroty + Mousex
If camrotx > 360 : camrotx - 360 : EndIf ;Winkel begränzung
If camroty > 360 : camroty - 360 : EndIf 
If camrotx < 0   : camrotx + 360  : EndIf 
If camroty < 0   : camroty + 360  : EndIf

CameraLocate(1,CameraX(1),PlayerY+PlayerHeight,CameraZ(1))
MoveCamera(1,CameraMoveX,0,CameraMoveZ)
RotateCamera(1,MouseX,MouseY,RollZ) ;PureBasic Sample HERLICH 

RenderWorld() ; WeltDarstellen
AndY_DrawHUD() ; HUD Darstellen crosshair usw...
AndY_Con_DrawBack();Console background 
StartDrawing(ScreenOutput()) ; Anfangen zu MALEN 
DrawingMode(#PB_2DDrawing_Transparent) ; Transparente schrift
DrawText(10,10,Str(Engine3DFrameRate(#PB_Engine3D_Current)),RGB(255,255,255)) ;FPS wichtig
DrawText(10,25,Str(CountRenderedTriangles()),RGB(255,255,255)) ; Triangles wichtig
DrawText(10,50,Str(camrotx),#White) ; Sehrwichtig CamRotX
DrawText(10,75,Str(camroty),#White) ; Sehrwichtig CamRotY

AndY_Con_DrawConsole() ;Console darstellen immer anzeigen , bis ich was anderes sage 

StopDrawing() ; aufhören zu malen 
FlipBuffers() ;darstelen
Until KeyboardPushed(#PB_Key_Escape) ; bis ich kein bock mehr habe
End ; ENDE des programms

Hilft euch das was , danke für die hilfe echt toll hate ich nocht nie so :allright:
Wenn sie weich werden bringt Pandora sie um und scheisst sie aus bevor sie irgend etwas merken.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Also nur mal rein von der Theorie her (hab mir jetzt den Code nicht großartig angeschaut):

Normalerweise hast Du für die Kamera eine Position (x/y/z) und einen Rotations-Winkel. Von diesem Winkel kannst Du den Sinus- und Cosinus-Wert ausrechnen.

Wenn Du nun z.B. ein Geschoß abfeuerst, dann muß sich das ja in eine x- und auch in eine y-Richtung bewegen (oder z statt y, je nachdem wie Dein Koordiantensystem aufgebaut ist). Nun müßte es eigentlich ausreichen, den Sinus auf x und Cosinus auf y draufzuaddieren (oder umgekehrt, das weiß ich leider grad nicht auswendig, aber sowas kann man ja schnell ausprobieren), bzw. diese Werte erst mit der Flug-Geschwindigkeit multiplizieren und diese dann aufzuaddieren.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@ZeHa
das meinte ich mit den Vektoren, da muss man halt ein bissel rechnen.
Formeln, wie man die aktuellen Kamera-Winkel in karthesische Koordinaten umrechnet, gibt es auch im Netz.
die winkel sind praktisch der Kameravektor in Polardarstellung,
und den brauchst man in karthesischer darstellung, um eben x/y/z zu bekommen,
die man dann als bewegungsvektor für das projektil verwenden kann.
die Positions Koordinaten der Kamera sind natürlich die Startkoordinaten des Projektils.

@kob
immerhin schon mal übersichtlicher....
hast du dir denn die Problematik, die ich schon benannt habe, mal genauer angesehen?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kob
Beiträge: 116
Registriert: 01.01.2008 02:02
Computerausstattung: 2x 2.4 GHz Amd Cpu | Geforce N9600GT OC |2.5GB Ram |Windows 7 Ultimate
Wohnort: Fulda

Thanks

Beitrag von kob »

DAnke für die hilfe habe aber leider nicht viel verstanden , liegt daran das ich 15 jahre bin und hauptschule , aber ich glaube du meinst es erwa so für die x akse obder : Cos(Winkel)*BulletSpeed wen nicht formel , und an den letzten der gepostet hat habe name vergesen dan , das problem kenne ich selber mein zimmer ist auch unübersichtlich , habe problem mir ordnung , zerlege projekte immer in kleine datein
Wenn sie weich werden bringt Pandora sie um und scheisst sie aus bevor sie irgend etwas merken.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

tja, dann weiss ich leider auch nicht, wie ich dir weiterhelfen kann.
entweder du findest beispiele, die du direkt abkupfern kannst,
oder du lernst mathe wie 9te,10te Klasse Gimmi.(*)
wenn dus selber proggen willst, musst du so mathe können.

oder du musst nen click-and-go Game-Maker benutzen, die dinger nehmen dir das rechnen ab.
dafür sind es keine Programmierumgebungen wie PureBasic.

(*)
das kannst du auch aus Wiki-Artikeln lernen, und dabei kann dir auch geholfen werden,
und da ist es auch kein Hindernis, wenn du auf die Hauptschule gehst,
solange du es lernen willst und dir Mühe gibst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Wenn ich mir das richtig überlegt hab dann ist das hier vil. hilfreich:

z = (cos beta) * |v|

|v|2D = |v|^2 - z^2

x = (cos alpha) * |v|2D
y = (sin alpha) * |v|2D


|v| ist der Betrag des Geschossvektors, in deinem Fall also die Geschwindigkeit.
alpha ist der winkel auf der XY-Ebene.
beta in steht auf dem 2D Vektor xy.

x, y, z sind dann die zerlegten geschwindigkeiten...


Hoffe das stimmt so, nicht gerechnet...
Benutzeravatar
kob
Beiträge: 116
Registriert: 01.01.2008 02:02
Computerausstattung: 2x 2.4 GHz Amd Cpu | Geforce N9600GT OC |2.5GB Ram |Windows 7 Ultimate
Wohnort: Fulda

Danke

Beitrag von kob »

Vilen dank Andreas_s die formeln werden mir helfen , ich denke mal die laufen , wen nicht pech gehabt . Das ich habtschule bin sollte nicht heisen , das ich kein mahe kann , sondern ein hinweis darauf sein das man nicht gleich mit so übelst harten formeln in textform und dan auch noch fast verschlüsselt ankommen soll , die "OneKlick" game maker habe ich schon gepropt , die sind so PipPipPip^2 gleich wider gelöscht , danke für die hilfe
Wenn sie weich werden bringt Pandora sie um und scheisst sie aus bevor sie irgend etwas merken.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Danke

Beitrag von Kaeru Gaman »

kob hat geschrieben:die "OneKlick" game maker habe ich schon gepropt , die sind so PipPipPip^2 gleich wider gelöscht
dann ist ja gut, dann hast du ne chance mit programmieren. Bild

PS:
ich hab heute nur begrenzt zeit, und übers wochenende bin ich weg,
also ich weiß nicht, wieviel ich heut noch erklären kann.
im zweifel dann nächste woche weiter.

erstmal ein Bild zum Begriff "Ortsvektor":
Bild
der pfeil mit der spitze ist ein Vektor, der wird beschrieben durch drei koordinaten: x,y,z

der kann jetzt einen Ort im Raum ausdrücken, das kennst du von der position der Kamera oder einer Entity.

diesen vektor kannst du aber auch mit zwei winkeln angeben, nämlich die drehung in der waagerechten,
und wie viel er "gekippt" ist in senkrechter richtung.
diese beiden winkel werden bei der kamera rotX und rotY genannt.
rotZ ist die drehung der kamera um die eigene achse, die können wir hier weglassen,
weil man bei shotern immer waagerecht guckt.


zu den zwei winkeln fehlt dir jetzt noch eine Länge, damit du einen bestimmten punkt erreichst.
man kann also aus den beiden Kamerawinkeln und einem Abstand von der Kamera
drei Koordinaten berechnen, namlich wie weit in x, y, z ein Zielpunkt von der Kamera entfernt ist.

diese drei koordinaten beschreiben jetzt den Weg, den ein Projektil in einer gewissen Zeit zurücklegt.
das sind also deine DeltaX, DeltaY, DeltaZ um die du die Position deines Schusses in jedem Frame änderst.

...ich hoffe, das war etwas verständlicher ausgedrückt...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kob
Beiträge: 116
Registriert: 01.01.2008 02:02
Computerausstattung: 2x 2.4 GHz Amd Cpu | Geforce N9600GT OC |2.5GB Ram |Windows 7 Ultimate
Wohnort: Fulda

Leuft

Beitrag von kob »

Das Leuft !!!! aber nicht richtig , kan das an bisem |v| liegen ?
habe da dan einfach mal v genomen anstadt |v| soll das | vieleicht vektor heisen , wen wen ja wie mache ich das ? wäre echt super von dir , wen nicht , komme ich schon irgendwie klar
Wenn sie weich werden bringt Pandora sie um und scheisst sie aus bevor sie irgend etwas merken.
Benutzeravatar
kob
Beiträge: 116
Registriert: 01.01.2008 02:02
Computerausstattung: 2x 2.4 GHz Amd Cpu | Geforce N9600GT OC |2.5GB Ram |Windows 7 Ultimate
Wohnort: Fulda

Thanks

Beitrag von kob »

Danke jetzt habe ich das glaude ich geraft also :

Alpha = CamRotX
Beta = CamRotY
Speed = Beweg

X = (Cos(ALpha)) * Speed
Y = (Sin(Beta)) * Speed

bei z bin ich mir nicht sicher und überhaupt :oops:

Z = (Cos(beta)) * Speed
Wenn sie weich werden bringt Pandora sie um und scheisst sie aus bevor sie irgend etwas merken.
Antworten