Maus Cursor Egoshooter

  • VB6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Neptun.

    Maus Cursor Egoshooter

    Hallo ihr netten Forummitglieder!
    Tut mir leid für die Noob Frage aber ich komme im Moment nicht weiter.
    Ich und ein paar Freunde sind dabei ein 3D Egoshooter Game zu endwickeln.
    Es soll ähnlich wie Wolfstein 3d werden!
    Also kommen wir zu meiner Frage:
    Info:
    Programmiersprache = Visual Basic 6 & OPENGL
    Problem = Cursor

    Zur Zeit siht der Code zum Maus einfangen und position ermitteln & auswerten so aus:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Declare Function SetCursorPos Lib "user32" ( _
    3. ByVal x As Long, _
    4. ByVal y As Long) As Long
    5. Private Declare Function GetCursorPos Lib "user32" ( _
    6. lpPoint As POINTAPI) As Long
    7. Private Type POINTAPI
    8. x As Long
    9. y As Long
    10. End Type
    11. Private MausPos As POINTAPI
    12. Private Sub Form_Load()
    13. SetCursorPos 750, 500
    14. GetCursorPos MausPos
    15. MsgBox "Zum Beenden drücken sie ESC!", vbOKOnly, "Info"
    16. ShowCursor (0)
    17. End Sub
    18. Private Sub Form_Resize()
    19. ReSizeGLScene ScaleWidth, ScaleHeight
    20. End Sub
    21. Private Sub Form_Terminate()
    22. ShowCursor (1)
    23. End
    24. End Sub
    25. Private Sub Form_Unload(Cancel As Integer)
    26. ShowCursor (1)
    27. End
    28. End Sub
    29. Private Sub Timer1_Timer()
    30. 'Interval = 1000
    31. 'Enabled = true
    32. Private Sub TLenk_Timer()
    33. 'Interval = 1
    34. 'Enabled = true
    35. Dim Temp As POINTAPI
    36. GetCursorPos Temp
    37. If Temp.x < MausPos.x Then
    38. Kamera.DY = Kamera.DY + 1.5
    39. MausPos.x = Temp.x
    40. MausPos.y = Temp.y
    41. End If
    42. If Temp.x > MausPos.x Then
    43. Kamera.DY = Kamera.DY - 1.5
    44. MausPos.x = Temp.x
    45. MausPos.y = Temp.y
    46. End If
    47. End Sub
    48. SetCursorPos 750, 500
    49. End Sub


    aber durch diesen Code siht dan der point in der mitte so schrumpelig und schlampig aus
    kann mir jemand bitte eine andere möglichkeit zeigen?
    ich währe euch sehr dankbar

    übrigens ned wundern ich habe bisher nur nach links und rechts drehen eingebaut und vor/zurück laufen den restlichen überflüssigen code habe ich weggelassen!
    Hallo Coldpepp,
    was sieht schrumpelig aus? Der Mauszeiger wird doch durch
    ShowCursor(0) ausgeschaltet.
    Übrigens:

    Visual Basic-Quellcode

    1. MausPos.x = Temp.x
    2. MausPos.y = Temp.y

    kann man ersetzen durch:

    Visual Basic-Quellcode

    1. MausPos = Temp

    Eine Anwendung sollte nicht mit End beendet werden, sonst
    bleiben Daten im Speicher. Siehe dazu:
    activevb.de/rubriken/faq/faq0013.html
    Gruss,

    Neptun
    ohoo dankesehr schonmal! :)

    also nicht den mauszeiger sondern zum beispiel wen ich nach links or rechts gehe mit der maus dan egal wie schnel ich die maus bewege die kamera bewegt sich immer im selben tempo!

    hier der restliche code vielleicht sagt er dir ja mehr


    Visual Basic-Quellcode

    1. Private Declare Function GetObjectA Lib "gdi32" (ByVal hObject As Long, ByVal nCount As Long, ByRef lpObject As Any) As Long
    2. Global PrgRun As Boolean 'Flag = Programm läuft
    3. Public Texture(15) As GLuint 'Handle der Texturen
    4. Private hrc As Long 'Handle für den OpenGL Gerätekontext
    5. Private Type BITMAP
    6. bmType As Long
    7. bmWidth As Long
    8. bmHeight As Long
    9. bmWidthBytes As Long
    10. bmPlanes As Integer
    11. bmBitsPixel As Integer
    12. bmBits As Long
    13. End Type
    14. Private Type TpVertex 'Vertex-Struktur
    15. x As GLfloat 'X-Koordinate
    16. y As GLfloat 'Y-Koordinate
    17. Z As GLfloat 'Z-Koordinate
    18. U As GLfloat 'U-Koordinate (Textur)
    19. V As GLfloat 'V-Koordinate (Textur)
    20. End Type
    21. Private Type TpTriangle 'Dreieck-Struktur
    22. Vertex(2) As TpVertex 'Array mit 3 Punkten
    23. T As Integer 'Index der verwendeten Textur
    24. End Type
    25. Private Type TpSector 'Sektor-Struktur
    26. Sct_NummTriangle As Integer 'Anzahl der Dreiecke im Sektor
    27. Triangle() As TpTriangle 'Zeiger auf ein Array mit Dreiecken
    28. End Type
    29. Private Sektor(0) As TpSector 'Array für einen Sektor
    30. Public Const PiToRad As Double = 0.0174532925 'Umrechnungsfaktor Grad => Radiant
    31. Private Type TpKamera
    32. x As GLfloat 'X-Position
    33. y As GLfloat 'Y-Position
    34. Z As GLfloat 'Z-Position
    35. DY As GLfloat 'Drehwinkel um Y-Achse
    36. End Type
    37. Public Kamera As TpKamera
    38. Public Sub LoadTexture(ByVal Filename As String, ByVal Index As Long)
    39. Dim bmp As BITMAP
    40. 'Vorraussetzungen:
    41. 'Die Grafik muß quadratisch sein!
    42. 'Die Seitenlänge der Grafiken müssen 2er Potenzen entsprechen:
    43. '16,32,64,128,256,512,1024 Pixel etc.
    44. 'Durch den Umweg über die Picturebox sind aber auch Formate wie jpg oder gif möglich.
    45. 'Die Autosize-Eigenschaft der Picturebox muß auf True stehen!
    46. Form1.Picture1.Picture = LoadPicture(Filename) 'Bild laden
    47. 'GetObjectA gibt Informationen über die im Aufruf übermittelte Bitmap der
    48. 'Picturebox zurück und speichert diese in der bmp-Struktur.
    49. 'Es wird also eine Bitmap aus den Daten der Picturebox im Speicher erstellt.
    50. If GetObjectA(Form1.Picture1.Picture.Handle, LenB(bmp), bmp) Then
    51. glGenTextures 1, Texture(Index) 'kreiert eine Textur
    52. glBindTexture glTexture2D, Texture(Index) 'Zuweisung: die Textur ist 2D
    53. 'Generieren der eigentlichen Texture in OpenGL
    54. glTexImage2D glTexture2D, 0, 3, bmp.bmWidth, bmp.bmHeight, 0, tiBGRExt, GL_UNSIGNED_BYTE, ByVal bmp.bmBits
    55. 'Der 1. Parameter besagt wieder 2D Textur
    56. 'Der 2. Parameter gibt den Grad der Details an, ist aber vorerst einmal unwichtig
    57. 'Der 3. Parameter gibt die Art der Farbkanäle an, 3 = RGB.
    58. 'Parameter 4 und 5 sind Breite und Höhe der Textur
    59. 'Der 6. Parameter gibt die Rahmenbreite an, vorerst aber mal 0.
    60. 'Parameter 7 und 8 geben Farbformat (RGB) und Art der Daten (Unsigned Byte = 0 - 255) an.
    61. 'Der letzte Parameter übergibt schlußendlich die eigentliche Textur.
    62. 'Diese Zeilen legen fest, welcher Filter verwendet werden soll:
    63. glTexParameteri glTexture2D, tpnTextureMinFilter, GL_LINEAR
    64. glTexParameteri glTexture2D, tpnTextureMagFilter, GL_LINEAR
    65. 'tpnTextureMinFilter besagt, mit welchem Filter die Grafik zusammengedrückt werden soll.
    66. 'tpnTextureMagFilter besagt, mit welchem Filter die Grafik auseinandergezogen wird.
    67. 'Der Parameter GL_LINEAR erzeugt das beste Ergebnis, belastet aber den Prozessor.
    68. 'Möglich wäre auch GL_NEAREST. Das entlastet zwar die Hardware, sieht aber schnell recht pixelig aus.
    69. LoadTexturePic = True
    70. End If
    71. End Sub
    72. Public Sub Main()
    73. Dim I As Integer, J As Integer 'Zählvariablen
    74. Dim frm As Form
    75. PrgRun = True 'Flag = das Programm läuft
    76. Set frm = New Form1 'Fenster für OpenGL-Ausgabe
    77. frm.ScaleMode = vbPixels 'das Fenster muß zwingend in Pixel bemessen werden
    78. If CreateGLWindow(frm, 640, 480, 16) Then 'Fenster initialisieren
    79. LoadWorld App.Path & "\World.txt" 'einlesen der Welt-Daten
    80. Do 'Endlosschleife in der das Fenster laufend gelöscht und neu aufgebaut wird.
    81. 'Die Laufzeit dieser Schleife ist ausschlaggebend, wieviele Objekt gezeichnet werden können
    82. glClear clrColorBufferBit Or clrDepthBufferBit ' löscht das Fenster und den Tiefenpuffer
    83. glLoadIdentity 'setzt die aktuelle Modell-Matrix zurück
    84. Kamera.y = Kamera.y 'wir bewegen uns nicht auf/ab und fixieren daher Y
    85. glRotatef 360 - Kamera.DY, 0, 1, 0 'Welt in entgegengesetzter Richtung der Kamera drehen
    86. glTranslatef Kamera.x, Kamera.y, Kamera.Z 'Welt verschieben
    87. 'Darstellung der eingelesenen Daten in einer Schleife
    88. For I = 0 To Sektor(0).Sct_NummTriangle - 1 'alle Dreiecke abarbeiten
    89. 'Auswahl der gewünschten Textur
    90. glBindTexture GL_TEXTURE_2D, Texture(Sektor(0).Triangle(I).T)
    91. glBegin bmTriangles
    92. For J = 0 To 2 '3 Punkte je Dreieck
    93. With Sektor(0).Triangle(I).Vertex(J)
    94. glTexCoord2f .U, .V: glVertex3f .x, .y, .Z
    95. End With
    96. Next
    97. glEnd
    98. Next
    99. SwapBuffers (frm.hDC) 'Puffer tauschen (Double Buffering)
    100. DoEvents
    101. Loop While PrgRun 'Programm nur beenden, wenn PrgRun = False
    102. 'PrgRun ist Global definiert und wird im KeyDown-Ereignis von Form1 bei drücken von Escape gesetzt.
    103. 'alles freigeben und Programm beenden
    104. If hrc <> 0 Then 'hatten wir einen Gerätekontext für OpenGL?
    105. wglMakeCurrent 0, 0 'Freigeben des Gerätekontexts
    106. wglDeleteContext (hrc) 'Freigeben des Renderingkontexts
    107. End If
    108. Unload frm
    109. Set frm = Nothing
    110. End
    111. End If
    112. End Sub
    113. Public Function CreateGLWindow(frm As Form, Width As Integer, Height As Integer, Bits As Integer) As Boolean
    114. Dim Mt_Diffuse(3) As GLfloat 'Material für diffuses Licht
    115. Dim Mt_Ambient(3) As GLfloat 'Material für Umgebungslicht
    116. Dim Mt_Specular(3) As GLfloat 'Material für gespiegeltes Licht
    117. Dim Mt_Shiness(0) As GLfloat 'Glanz des Materials
    118. Dim Lt_Position(3) As GLfloat 'Position der Lichtquelle
    119. Dim Lt_Diffuse(3) As GLfloat 'diffuses Licht
    120. Dim Lt_Ambient(3) As GLfloat 'Umgebungslicht
    121. Dim Lt_Specular(3) As GLfloat 'Spotlicht / Glanzlicht
    122. 'Position der Lichtquelle
    123. 'auf der Z-Achse als positiver Wert = 10 Einheiten vor dem Bildschirm
    124. Lt_Position(0) = 0#: Lt_Position(1) = 0#: Lt_Position(2) = 0#: Lt_Position(3) = 1#
    125. 'Materialeigenschaft für diffuses Licht
    126. Mt_Diffuse(0) = 0.8: Mt_Diffuse(1) = 0.8: Mt_Diffuse(2) = 0.8: Mt_Diffuse(3) = 1#
    127. 'Materialeigenschaft für Umgebungslicht
    128. Mt_Ambient(0) = 0.3: Mt_Ambient(1) = 0.3: Mt_Ambient(2) = 0.3: Mt_Ambient(3) = 1#
    129. 'Materialeigenschaft für Glanz
    130. Mt_Specular(0) = 1: Mt_Specular(1) = 1: Mt_Specular(2) = 1: Mt_Specular(3) = 1
    131. 'Exponent für Glanz
    132. Mt_Shiness(0) = 50#
    133. 'Lichtstärke/farbe für Umgebungslicht
    134. Lt_Ambient(0) = 0.2: Lt_Ambient(1) = 0.2: Lt_Ambient(2) = 0.2: Lt_Ambient(3) = 1#
    135. 'Lichtstärke/farbe für diffuses Licht
    136. Lt_Diffuse(0) = 0.5: Lt_Diffuse(1) = 0.5: Lt_Diffuse(2) = 0.5: Lt_Diffuse(3) = 0.5
    137. 'Lichtstärke/farbe für Spot (Glanz)
    138. Lt_Specular(0) = 1: Lt_Specular(1) = 1: Lt_Specular(2) = 1: Lt_Specular(3) = 1
    139. Dim pfd As PIXELFORMATDESCRIPTOR ' pfd erklärt Windows, wie das Fenster beschaffen sein soll
    140. Dim PixelFormat As GLuint ' enthält das Ergebnis vom Versuch, ein Fenster mit den gegebenen Parametern zu erstellen
    141. pfd.cColorBits = Bits 'Farbtiefe
    142. pfd.cDepthBits = 16 '16 Bit Tiefenpuffer
    143. 'Der Tiefenpuffer enthält die Entfernung eines Pixels zur Kamera (Betrachter).
    144. 'Er verhindert, daß Objekte im Hintergrund beim Zeichnen Objekte im Vordergund überlagern.
    145. pfd.dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER
    146. 'PFD_DRAW_TO_WINDOW = das Format muß als Fenster sichtbar sein können
    147. 'PFD_SUPPORT_OPENGL = das Format muß OpenGL unterstützen
    148. 'PFD_DOUBLEBUFFER = das Foramt muß Double Buffering unterstützen
    149. pfd.iLayerType = PFD_MAIN_PLANE 'Die Hauptebene auf der gezeichnt wird.
    150. pfd.iPixelType = PFD_TYPE_RGBA 'Pixel werden im RGBA Modus dargestellt.
    151. 'RGB ist mit VB identisch. Für A wird ein Alpha-Wert für die Transparenz übergeben
    152. pfd.nSize = Len(pfd) 'Größe der Struktur sollte natürlich stimmen
    153. pfd.nVersion = 1 'Versionsnummer
    154. PixelFormat = ChoosePixelFormat(frm.hDC, pfd) 'Windows nach einem oben beschriebenen Pixelformat fragen
    155. If PixelFormat <> 0 Then
    156. 'Windows hat ein entsprechendes Format gefunden
    157. If SetPixelFormat(frm.hDC, PixelFormat, pfd) <> 0 Then
    158. 'Einrichten des Pixelformates war erfolgreich
    159. hrc = wglCreateContext(frm.hDC)
    160. If hrc <> 0 Then
    161. 'ein Rendering Kontext wurde erstellt
    162. If wglMakeCurrent(frm.hDC, hrc) <> 0 Then
    163. 'Der Kontext wurde aktiviert
    164. frm.Show 'Fenster anzeigen
    165. Call LoadTexture(App.Path & "\mauer.jpg", 1) 'laden und erzeugen eines Textures
    166. Call LoadTexture(App.Path & "\holz.jpg", 2) 'laden und erzeugen eines Textures
    167. Call LoadTexture(App.Path & "\ziegel.jpg", 3) 'laden und erzeugen eines Textures
    168. Call LoadTexture(App.Path & "\rot.jpg", 4)
    169. Call LoadTexture(App.Path & "\gelb.jpg", 5)
    170. Call LoadTexture(App.Path & "\schwarz.jpg", 6)
    171. Call LoadTexture(App.Path & "\grün.jpg", 7)
    172. glEnable glcTexture2D 'Einschalten des Texture Mappings
    173. glShadeModel smSmooth 'schaltet schöne Farbübergange ein
    174. glClearColor 0#, 0#, 0#, 0.5 'schwarzer Hintergrund
    175. glClearDepth 1# 'Tiefenpuffer zurücksetzten (später mehr)
    176. glEnable glcDepthTest 'Aktivierung des Tiefentests (später mehr)
    177. glDepthFunc cfLEqual 'Typ des Tiefentests (später mehr)
    178. glHint htPerspectiveCorrectionHint, hmNicest 'Art der Perspectivenansicht
    179. 'hmNicest = beste Ansicht / hmFastest = schnellste Darstellung
    180. glMaterialfv GL_FRONT, GL_SPECULAR, Mt_Specular(0) 'Materialeigenschaft für Specular setzen
    181. glMaterialfv GL_FRONT, GL_SHININESS, Mt_Shiness(0) 'Exponent für den Glanz
    182. glMaterialfv GL_FRONT, GL_DIFFUSE, Mt_Diffuse(0) 'Materialeigenschaft für Diffus setzen
    183. glMaterialfv GL_FRONT, GL_AMBIENT, Mt_Ambient(0) 'Materialeigenschaft für Ambient setzen
    184. glLightfv GL_LIGHT1, GL_DIFFUSE, Lt_Diffuse(0) 'diffuses Licht setzen
    185. glLightfv GL_LIGHT1, GL_AMBIENT, Lt_Ambient(0) 'Umgebungslicht setzen
    186. glLightfv GL_LIGHT1, GL_SPECULAR, Lt_Specular(0) 'Glanzlicht setzen
    187. glLightfv GL_LIGHT1, GL_POSITION, Lt_Position(0) 'Position der Lampe setzen
    188. glEnable GL_LIGHTING 'Licht einschalten.
    189. glEnable GL_LIGHT1 'Licht Nr. 1 einschalten.
    190. glEnable GL_COLOR_MATERIAL 'Farben unter Textur aktivieren
    191. CreateGLWindow = True
    192. End If
    193. End If
    194. End If
    195. End If
    196. End Function
    197. Public Sub ReSizeGLScene(ByVal Width As GLsizei, ByVal Height As GLsizei)
    198. 'Anpassen der Größe und Initialisierung des OpenGL-Fensters
    199. If Height = 0 Then 'Die Fensterhöhe muß größer 0 sein
    200. Height = 1 'sonst kommt es zu einem Division by Zero Fehler
    201. End If
    202. glViewport 0, 0, Width, Height 'leeren des aktuellen Viewports
    203. glMatrixMode mmProjection 'Auswahl der Projektionsmatrix
    204. glLoadIdentity 'setzt die aktuelle Modell-Matrix zurück
    205. gluPerspective 45#, Width / Height, 0.1, 100# 'Berechnung des aktuellen Seitenverhältnisses des Fensters
    206. glMatrixMode mmModelView 'Auswahl der Modelview Projektionsmatrix
    207. glLoadIdentity 'setzt die aktuelle Modell-Matrix zurück
    208. End Sub
    209. Public Sub LoadWorld(File As String)
    210. Dim I, J As Integer 'Zählvariablen
    211. Dim F As Long 'Dateinummer
    212. Dim Zeile As String 'Einzelzeile aus der Datei
    213. Dim Segment() As String 'einzelne Anweisung / Koordinate in der Zeile
    214. Dim AnzDreieck As Integer 'Anzahl der Dreiecke in der Datei
    215. 'Datei öffnen
    216. F = FreeFile
    217. Open File For Input Shared As #F
    218. '1. Zeile lesen
    219. Line Input #F, Zeile
    220. Segment = Split(Zeile, " ") 'Space als Trennzeichen
    221. 'hier in der 1. Zeile die Anzahl der Dreiecke
    222. If Segment(0) = "NUMTRIANGLES" Then
    223. AnzDreieck = Val(Segment(1))
    224. ReDim Sektor(0).Triangle(AnzDreieck) 'Speicher für Dreieck-Koordinaten
    225. Sektor(0).Sct_NummTriangle = AnzDreieck 'Anzahl der Dreiecke ablegen
    226. I = 0
    227. J = 0
    228. Do 'Alle Dreiecke einlesen
    229. Line Input #F, Zeile 'Zeile lesen
    230. Zeile = Trim(Zeile) 'führende Spaces abschneiden
    231. 'Leere Zeilen und Kommentare (beginnen mit /) ignorieren
    232. If Len(Zeile) > 0 And Left(Zeile, 1) <> "/" Then
    233. Do
    234. Zeile = Replace(Zeile, " ", " ") 'entfernen mehrfacher Spaces
    235. Loop Until InStr(1, Zeile, " ") = 0
    236. If J < 3 Then
    237. Segment = Split(Zeile, " ") 'in Punkte zerlegen
    238. 'Punkte für Dreieck und Texturen in Struktur speichern
    239. Sektor(0).Triangle(I).Vertex(J).x = Val(Segment(0))
    240. Sektor(0).Triangle(I).Vertex(J).y = Val(Segment(1))
    241. Sektor(0).Triangle(I).Vertex(J).Z = Val(Segment(2))
    242. Sektor(0).Triangle(I).Vertex(J).U = Val(Segment(3))
    243. Sektor(0).Triangle(I).Vertex(J).V = Val(Segment(4))
    244. J = J + 1
    245. Else
    246. Sektor(0).Triangle(I).T = Val(Trim(Zeile)) 'Texturindex merken
    247. J = 0 'Punktezähler zurücksetzen
    248. I = I + 1 'nächstes Dreieck
    249. End If
    250. End If
    251. Loop Until I >= AnzDreieck
    252. End If
    253. End Sub


    Ende des Modules :D
    fals jemand jetzt mit dem kommentaren kommen will wie z.B. Ihhh den code hast du geklaut bla bla dan lasst es bitte sein ja ich hab ihn geklaut von so ein tutorial aber ich erweitere den nur ne eigene map hab ich dazu auch schon gemacht sogar mehrere ^^


    @Neptun

    Zählt das mit dem speicher im ram auch für PrgRun = False oder nur für End?
    Hallo Coldpepp,
    der Code nimmt ja auch keinen Bezug auf die Geschwindigkeit
    der Maus. Du musst im Timer-Event die Differenz zwischen
    Temp.x und MausPos.x bilden und in Abhängigkeit von der Grösse
    des Wertes mal mehr und mal weniger zu Kamera.DY addieren oder
    davon subtrahieren.

    Zählt das mit dem speicher im ram auch für PrgRun = False oder nur für End?


    Ist mir nur von End bekannt.
    Gruss,

    Neptun