Seite 2 von 4

Verfasst: 27.03.2008 14:14
von gnasen

Code: Alles auswählen

; Hier wird eine Structure erstellt, dies hat den Sinn, das wir der Liste waypoints() nicht nur zB einen Long Wert zuweisen, sondern eine x und eine y koordinate.

Structure waystruc
  
  x.l
  y.l
  
EndStructure

; Diese Liste wird hier jetzt erstellt. Eine Liste ist praktisch wie ein Sammelbehälter. Wir können Elemente hinzufügen (bei uns entspricht jedes Element einer X/Y koordinate) und dessen Werte bearbeiten

Global NewList Waypoints.waystruc()

; In dieser Prozedur wird die Liste Waypoints() befüllt. Dafür übergeben wir P1(x1|y1) und P2(x2|y2). Der Abstand ist quasi die Geschwindigkeit.

Procedure MakeWaypoints(X1.l, Y1.l, X2.l, Y2.l, Abstand.f)
  
  Protected Punktanzahl.l
  Protected a.l
  
  ;Diese Rechnung gibt nur die Schrittanzahl aus (siehe Post weiter oben)
  
  Punktanzahl = Round(Sqr( ((X2-X1) * (X2-X1)) + ((Y2-Y1) * (Y2-Y1)) ) / Abstand, 0) + 1
  
  ;Für jeden Schritt (zB. 7) werden die entsprechenden Koordinaten berechnet und unserer Liste hinzugefügt.
  
  For a = 0 To Punktanzahl
    
    AddElement(Waypoints())
    Waypoints()\x = (X2-X1) * a / Punktanzahl + X1
    Waypoints()\y = (Y2-Y1) * a / Punktanzahl + Y1
    
  Next
  
EndProcedure

;Zum Testen:

CallDebugger

MakeWaypoints(3, 12, 85, 97, 5)

ForEach Waypoints()
  
  Debug Str(Waypoints()\x) + "|" + Str(Waypoints()\y)
  
Next
PS: Falls die Bewegungen sehr genau sein sollen, wie schon gesagt wurde, die longs in floats abändern.

Verfasst: 27.03.2008 16:01
von Gn00bi
vielen dank für die mühe, ich glaub damit kann ich was anfangen

Verfasst: 05.04.2008 00:02
von Gn00bi
ich habe jetzt das ganze soweit, das der schuss auch fliegt (ja, ja, ich weiß hat ganz schön gedauert, hatte aber letzte woche nich viel zeit), aber jetzt ist das Problem, das er ja immer genau da aufhört, wo vorher das ziel war, das heißt man mus einfach nur einen schritt zurückmachen, und der schuss erreicht einem nicht mehr. desweiteren, hab ich auch noch nich so ganz raus, wie man den schuss wieder auf anfangsposition zurücksetzt. Es reicht übrigens dieser eine Schuss (vorerst). Wäre nett, wenn mir jemand helfen könnte. Hier nochmal mein Code mit fraglichen Stellen hervorgehoben:

Code: Alles auswählen

InitSprite()
InitKeyboard()

;-Konstanten
#tmapX = 31
#tmapY = 23
#SPEED = 1

Procedure Collision1(x1.f, y1.f)
 Kollision1 = 0
  
  Restore Map
  
  For pmapY1 = 0 To #tmapY
    For pmapX1 = 0 To #tmapX
     
      a.b

      Read a
      If a = 1
        If SpriteCollision(0, Int(x1), Int(y1), 1, pmapX1*32, pmapY1*32)
          Kollision1 = 1
          Break 2
        EndIf
      EndIf
     
    Next
  Next
  
  ProcedureReturn Kollision1
EndProcedure

Procedure Collision2(x2.f, y2.f)
 Kollision2 = 0
  
  Restore Map
  
  For pmapY2 = 0 To #tmapY
    For pmapX2 = 0 To #tmapX
     
      a.b

      Read a
      If a = 1
        If SpriteCollision(0, Int(x2), Int(y2), 1, pmapX2*32, pmapY2*32)
          Kollision2 = 1
          Break 2
        EndIf
      EndIf
     
    Next
  Next
  
  ProcedureReturn Kollision2
EndProcedure
;------->Struktur
Structure waystruc 
  x.l
  y.l 
EndStructure

Global NewList Waypoints.waystruc()

Procedure MakeWaypoints(X1.f, Y1.f, X2.f, Y2.f, Abstand.f)
 
   Punktanzahl.l
   b.l

  Punktanzahl = Round(Sqr( ((X2-X1) * (X2-X1)) + ((Y2-Y1) * (Y2-Y1)) ) / Abstand, 0) + 1

   For b = 0 To Punktanzahl
    AddElement(Waypoints())
    Waypoints()\x = (X2-X1) * b / Punktanzahl + X1
    Waypoints()\y = (Y2-Y1) * b / Punktanzahl + Y1
  Next
 
EndProcedure 

;-Bildschrim öffnen
OpenScreen(1024, 768, 32, "Test")

;-Sprites createn+malen
CreateSprite(0, 32, 32)
 StartDrawing(SpriteOutput(0))
  Box(0, 0, 32, 32, RGB(255, 255, 255))
 StopDrawing()

CreateSprite(1, 32, 32)
 StartDrawing(SpriteOutput(1))
  Box(0, 0, 32, 32, RGB(0, 0, 255))
 StopDrawing()

CreateSprite(2, 32, 32)
 StartDrawing(SpriteOutput(2))
  Box(0, 0, 32, 32, RGB(255, 0, 255))
 StopDrawing()
 
CreateSprite(3, 10, 10)
 StartDrawing(SpriteOutput(3))
  Circle(5, 5, 5, RGB(0, 255, 100))
 StopDrawing()
 
 CreateSprite(4, 1024, 768)
 TransparentSpriteColor(4,RGB(0,0,0))
 StartDrawing(SpriteOutput(4))
  Box(0, 0, 1024, 768, RGB(0, 0, 0))
 StopDrawing()
  
;-Startvariablen
x1.f = 32
y1.f = 32
x2.f = 1024 - 64
y2.f = 768 - 64
Schuss1x = x1
Schuss1y = y1

;-Framerate
SetFrameRate(60)

Repeat
  ExamineKeyboard()  

;-Steuerung Spieler1  
  If KeyboardPushed(#PB_Key_Up)
    If Collision1(x1, y1-#SPEED) = 0
      y1 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    If Collision1(x1, y1+#SPEED) = 0
      y1 + #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    If Collision1(x1-#SPEED, y1) = 0
      x1 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    If Collision1(x1 + #SPEED, y1) = 0
      x1 + #SPEED
    EndIf
  EndIf

;-Steuerung Spieler2  
  If KeyboardPushed(#PB_Key_W)
    If Collision2(x2, y2-#SPEED) = 0
      y2 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_S)
    If Collision2(x2, y2+#SPEED) = 0
      y2 + #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_A)
    If Collision2(x2-#SPEED, y2) = 0
      x2 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_D)
    If Collision2(x2 + #SPEED, y2) = 0
      x2 + #SPEED
    EndIf
  EndIf


;beenden
  If KeyboardPushed(#PB_Key_Escape)
   Quit = 1
  EndIf

;-Sprites erstellen   


ClearScreen(RGB(0,255,255))

;-------->Schuss
 If KeyboardReleased(#PB_Key_L)
  u = 1
  xx1.f = x1.f
  xx2.f = x2.f
  yy1.f = y1.f
  yy2.f = y2.f
 EndIf
    
If u = 1
 MakeWaypoints(xx1.f,yy1.f,xx2.f,yy2.f,2)
 If g =< ListIndex(Waypoints())
  g + 1
 EndIf
 
 SelectElement(Waypoints(), g)
 If SpriteCollision(3, Waypoints()\x, Waypoints()\y, 2, x2, y2) = 1
  u = 0
 EndIf
 DisplaySprite(3, Waypoints()\x, Waypoints()\y)
 ResetList(Waypoints())
EndIf

If u =0
 ClearList(Waypoints())
EndIf
;-Spieler anzeigen
 DisplaySprite(1, x1, y1)
 DisplaySprite(2, x2, y2)

  Restore Map
  For pmapY1 = 0 To #tmapY
    For pmapX1=0 To #tmapX
      a.b
      Read a
      If a = 1
        DisplaySprite(0, pmapX1*32, pmapY1*32)
      EndIf
    Next
  Next

  Restore Map
  For pmapY2 = 0 To #tmapY
    For pmapX2=0 To #tmapX
      a.b
      Read a
      If a = 1
        DisplaySprite(0, pmapX2*32, pmapY2*32)
      EndIf
    Next
  Next

  FlipBuffers()

Until Quit = 1
End

;-Map daten
DataSection
  Map:
  Data.b 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, 1, 1, 1, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
  Data.b 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  Data.b 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  Data.b 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  Data.b 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 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, 1, 1, 1, 1
EndDataSection

Verfasst: 05.04.2008 06:02
von tobe
hi Gn00bi,

ich hab deinen code mal etwas umgebaut,
den schuss teil hab ich ganz neu gemacht, jetzt fliegt der schuss auch weiter ;)

Code: Alles auswählen

EnableExplicit
InitSprite()
InitKeyboard()

;-Konstanten
#tmapX = 31
#tmapY = 23
#SPEED = 1
#SCHUSSSPEED = 2

Define.f x1, x2, y1, y2, Schuss, SchussX, SpeedX, SchussY, SpeedY, a, b, c
Define Quit, pmapX, pmapY
Dim Map.b(#tmapX, #tmapY)

Procedure Collision(x.f, y.f)
  Protected pmapX, pmapY
  Shared Map()
  For pmapY = 0 To #tmapY
    For pmapX = 0 To #tmapX
      If Map(pmapX, pmapY) = 1
        If SpriteCollision(0, x, y, 1, pmapX*32, pmapY*32)
          ProcedureReturn 1
        EndIf
      EndIf
    Next
  Next
EndProcedure

;-Map einlesen
Restore Map
For pmapY = 0 To #tmapY
  For pmapX = 0 To #tmapX
    Read Map(pmapX, pmapY)
  Next
Next

;-Bildschrim öffnen
OpenScreen(1024, 768, 32, "Test")

;-Sprites createn+malen
CreateSprite(0, 32, 32)
StartDrawing(SpriteOutput(0))
  Box(0, 0, 32, 32, RGB(255, 255, 255))
StopDrawing()

CreateSprite(1, 32, 32)
StartDrawing(SpriteOutput(1))
  Box(0, 0, 32, 32, RGB(0, 0, 255))
StopDrawing()

CreateSprite(2, 32, 32)
StartDrawing(SpriteOutput(2))
  Box(0, 0, 32, 32, RGB(255, 0, 255))
StopDrawing()
 
CreateSprite(3, 10, 10)
StartDrawing(SpriteOutput(3))
  Circle(5, 5, 5, RGB(0, 255, 100))
StopDrawing()
 
CreateSprite(4, 1024, 768)
TransparentSpriteColor(4,RGB(0,0,0))
StartDrawing(SpriteOutput(4))
  Box(0, 0, 1024, 768, RGB(0, 0, 0))
StopDrawing()

;-Startvariablen
x1.f = 32
y1.f = 32
x2.f = 1024 - 64
y2.f = 768 - 64

;-Framerate
;SetFrameRate(60)

Repeat
  ExamineKeyboard() 
  
  ;-Steuerung Spieler1 
  If KeyboardPushed(#PB_Key_Up)
    If Collision(x1, y1-#SPEED) = 0
      y1 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    If Collision(x1, y1+#SPEED) = 0
      y1 + #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    If Collision(x1-#SPEED, y1) = 0
      x1 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    If Collision(x1 + #SPEED, y1) = 0
      x1 + #SPEED
    EndIf
  EndIf
  
  ;-Steuerung Spieler2 
  If KeyboardPushed(#PB_Key_W)
    If Collision(x2, y2-#SPEED) = 0
      y2 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_S)
    If Collision(x2, y2+#SPEED) = 0
      y2 + #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_A)
    If Collision(x2-#SPEED, y2) = 0
      x2 - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_D)
    If Collision(x2 + #SPEED, y2) = 0
      x2 + #SPEED
    EndIf
  EndIf
  
  ;beenden
  If KeyboardPushed(#PB_Key_Escape)
    Quit = 1
  EndIf
  
  ;-Sprites erstellen   
  
  ClearScreen(RGB(0,255,255))
  
  ;-------->Schuss
  If KeyboardReleased(#PB_Key_L)
    Schuss = 1
    SchussX.f = x1 + 16
    SchussY.f = y1 + 16
    a.f = x2 - x1
    b.f = y2 - y1
    c.f = Sqr(a*a + b*b)
    SpeedX.f = a / c * #SCHUSSSPEED
    SpeedY.f = b / c * #SCHUSSSPEED
  EndIf
  If Schuss = 1
    SchussX + SpeedX
    SchussY + SpeedY
    ; If Map(Int(SchussX / 32), Int(SchussY / 32)) = 1
      ; Schuss = 0
    ; EndIf
    If SpriteCollision(3, SchussX, SchussY, 2, x2, y2)
      Schuss = 0
    EndIf
    If SchussX < 0 Or SchussX > 1024 Or SchussY < 0 Or SchussY > 768
      Schuss = 0
    EndIf
    DisplaySprite(3, SchussX, SchussY)
  EndIf

  ;-Spieler anzeigen
  DisplaySprite(1, x1, y1)
  DisplaySprite(2, x2, y2)
  
  For pmapY = 0 To #tmapY
    For pmapX=0 To #tmapX
      If Map(pmapX, pmapY) = 1
        DisplaySprite(0, pmapX*32, pmapY*32)
      EndIf
    Next
  Next
  Delay(1) ; 100% CPU auslastung verhindern
  FlipBuffers()
  
Until Quit = 1
End

;-Map daten
DataSection
  Map:
  Data.b 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, 1, 1, 1, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
  Data.b 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  Data.b 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
  Data.b 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  Data.b 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 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, 1, 1, 1, 1
EndDataSection
mfG
tobe

Verfasst: 05.04.2008 14:06
von PMV
tobe hat geschrieben:hi Gn00bi,

ich hab deinen code mal etwas umgebaut,
den schuss teil hab ich ganz neu gemacht, jetzt fliegt der schuss auch weiter ;)

Code: Alles auswählen

  Delay(1) ; 100% CPU auslastung verhindern
Bei einem Spiel? (Fullscreen) :?
... kann im schlimmsten falle zwischen Unspielbar und Spielbar entscheiden :wink:

MFG PMV

Verfasst: 05.04.2008 14:13
von Kaeru Gaman
klar gibt es bessere möglichkeiten als Delay(1), und ein Delay(0) würde schon reichen,
aber besser so als mit FlipBuffers() die CPU zu braten, das tut nicht not.

Verfasst: 05.04.2008 14:45
von tobe
@PMV
beim aktuellen stand von Gn00bi's code wird das delay sicher nichts verschlimmern, egal ob fullscreen oder windowed modus, es ging mir ja nur um die 100% cpu auslastung ;)

@Kaeru Gaman
theoretisch hast du recht, aber bei mir dauert ein delay() immer 16ms, liegt wohl an windoof selbst, erst wenn ich mit timeBeginPeriod_() rumspiele dann arbeitet delay() genauer.

Verfasst: 05.04.2008 14:49
von Andreas_S
tobe hat geschrieben:...dauert ein delay() immer 16ms...
1. Parameter fehlt...
2. Woher willst du das wissen?

Verfasst: 05.04.2008 15:17
von Kaeru Gaman
stimmt schon, dass das OS eine kleinste Einheit hat,
allerdings kommt das auch auf die vorher abgelaufenen tics an.
wenn du also ein delay an das andere fügst, wirst du mit 13-16ms laufen,
wenn du aber vorher was anderes machst, kann es passieren,
dass das Delay wirklich nur so kurz wird wie angegeben.

anyhow, einfach nur ein Delay ist ein recht unfertiger timer.
besser ist es, etwas komplexer auf ne framerate von 30 bzw. max. 60 zu timen.
höhere frameraten sind unnütz und unfug.
bei 60fps hast du eigentlich immer genug zeit für deine berechnungen.
bei höheren fps kommst du nur in zeitdruck, und sehen tut man nix mehr davon.
etliche monitore unterstützen das auch garnicht erst.

Verfasst: 05.04.2008 15:46
von Andreas_S
und kann man die kleinste Einheit wählen?
Mir ist nur aufgefallen das sich ElapsedMillisecounds() oder getTickCount() immer in 16er Schritten bewegen...