Seite 1 von 1

Schussüberprüfung mit Fadenkreuz

Verfasst: 15.08.2006 05:35
von Rubiko
Huhu,
hier mal wieder eine Frage von mir ;)

Ich such mich jetzt schon die ganze Zeit mit der Forensuche schlapp, bin aber wohl der einzige der in Bezug hierrauf ne Frage hat.

Naja, es geht um einen Shooter in 2D (als gutes Beispiel nehme ich jetzt mal Moorhühner)
Dabei hat man ein Fadenkreuz, dass man mit der Maus steuert und schießt die Hühner ab.. einfach

Nur ich hab überhaupt keine Idee wie ich überprüfen soll ob gerade das Fadenkreuz über einen Gegner ist und ob der User dann "abdrückt".
Mit SpriteCollision und MouseButton(1) will das nicht klappen.
(Beispiel)

Code: Alles auswählen

...
If SpriteCollision(1, MouseX(), MouseY(), 0, EnemyA()\, EnemyA()\y)
  DeleteElement(EnemyA())
Endif
...
Dabei fiel mir aber noch was auf: Wenn ich zu oft die linke Maustaste hintereinander drück crasht das ganze Programm und es hilft nurnoch "sofort beenden" oder per Debugger killen in der IDE
Ist das normal?

Ich wäre für Tipps offen

Vielen Dank im Vorraus
Rubiko

Verfasst: 15.08.2006 05:40
von hardfalcon
Wie sollen wir dir ohne Sourcecode helfen können? Kiffis Glaskugel is leider noch immer in der Reparatur... :?

Verfasst: 15.08.2006 05:45
von Rubiko
ok, mein Fehler aber Danke für die schnelle Antwort.
Mir ging es in erster Linie ja erstmal darum, Tipps für die Schussüberprüfung zu bekommen

Code: Alles auswählen

If InitKeyboard() = 0
  MessageRequester("Fehler!", "Die Tastatur konnte nicht initalisiert werden. DirectX7 oder höher notwendig!")
EndIf
If InitSprite() = 0
  MessageRequester("Fehler!", "Grafiken konnte nicht initalisiert werden. DirectX7 oder höher notwendig!")
EndIf  
If InitMouse() = 0
  MessageRequester("Fehler!", "Maus konnte nicht initalisiert werden. DirectX7 oder höher notwendig!")
EndIf  




Structure EnemyA
  x.l
  y.l
  speedx.l
EndStructure
  
Global NewList EnemyA.EnemyA()


Procedure AddEnemyA(x, y, speedx)
  AddElement(EnemyA())
  EnemyA()\x = x
  EnemyA()\y = y
  EnemyA()\speedx = speedx
EndProcedure

Procedure DebugEnemyA()
  StartDrawing(WindowOutput(0))
  DrawText(10, 10, "Current EnemyA : "+Str(CountList(EnemyA())), RGB(255, 255, 255), RGB(0, 0, 0))
  DrawText(10, 25, Str(CollisionState), RGB(255, 255, 255), RGB(0, 0, 0))
  StopDrawing()
EndProcedure


OpenWindow(0, 0, 0, 500, 300, "Storm the Base", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 500, 300, 0, 0, 0)

Timer.l = ElapsedMilliseconds()
Delay.l 
CollisionState = 0


Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  ClearScreen(RGB(0, 0, 0))
  
  
  LoadSprite(0, "A.bmp")
  LoadSprite(1, "B.bmp")
  TransparentSpriteColor(0, RGB(255, 0, 255))
  TransparentSpriteColor(1, RGB(255, 0, 255))
  
  DisplayTransparentSprite(1, MouseX(), MouseY())


  ForEach EnemyA()
    DisplayTransparentSprite(0, EnemyA()\x, EnemyA()\y)  
    EnemyA()\x + EnemyA()\speedx
  Next

  If KeyboardPushed(#PB_Key_Up) And Delay = 0
    AddEnemyA(15, Random(200), 1)
    Delay = 5
  EndIf
  
  ForEach EnemyA()
    If EnemyA()\x>500 : DeleteElement(EnemyA()) : EndIf
  Next
  
  
  If Delay>0 : Delay - 1 : EndIf
  

  
  DebugEnemyA()

  
  
  Delay(1)
  FlipBuffers(1)
Until KeyboardPushed(#PB_Key_Escape)  
Is aber'n bisschen unaufgeräumt...
Was die Sprites angeht... is nurn Simples A und'n Fadenkreuz aus Paint...
braucht ihr die auch noch?

Sorry nochmal

Verfasst: 15.08.2006 06:12
von #NULL
1.) loadsprite() und transparentspritecolor() raus aus der schleife, also davor.
2.) das aufhängnen kommt von der fehlenden message bearbeitung -> windowevent().
3.) in der kollisionsprüfunng muß auch noch ein mousebutton() rein (ist jedenfalls sinnvoller)

jetzt werden aber alle gegner, die beim click mit dem kreuz überlappen, auif einmal gelöscht.

Code: Alles auswählen

If InitKeyboard() = 0
  MessageRequester("Fehler!", "Die Tastatur konnte nicht initalisiert werden. DirectX7 oder höher notwendig!")
EndIf
If InitSprite() = 0
  MessageRequester("Fehler!", "Grafiken konnte nicht initalisiert werden. DirectX7 oder höher notwendig!")
EndIf 
If InitMouse() = 0
  MessageRequester("Fehler!", "Maus konnte nicht initalisiert werden. DirectX7 oder höher notwendig!")
EndIf 

Structure EnemyA
  x.l
  y.l
  speedx.l
EndStructure
 
Global NewList EnemyA.EnemyA()


Procedure AddEnemyA(x, y, speedx)
  AddElement(EnemyA())
  EnemyA()\x = x
  EnemyA()\y = y
  EnemyA()\speedx = speedx
EndProcedure

Procedure DebugEnemyA()
  StartDrawing(WindowOutput(0))
  DrawText(10, 10, "Current EnemyA : "+Str(CountList(EnemyA())), RGB(255, 255, 255), RGB(0, 0, 0))
  DrawText(10, 25, Str(CollisionState), RGB(255, 255, 255), RGB(0, 0, 0))
  StopDrawing()
EndProcedure


OpenWindow(0, 0, 0, 500, 300, "Storm the Base", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 500, 300, 0, 0, 0)

Timer.l = ElapsedMilliseconds()
Delay.l
CollisionState = 0


LoadSprite(0, "c:\test\test32.bmp")
LoadSprite(1, "c:\test\test32.bmp")
TransparentSpriteColor(0, RGB(255, 0, 255))
TransparentSpriteColor(1, RGB(255, 0, 255))


Repeat
  WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(RGB(0, 0, 0))
 
  DisplayTransparentSprite(1, MouseX(), MouseY())

  ForEach EnemyA()
    DisplayTransparentSprite(0, EnemyA()\x, EnemyA()\y) 
    EnemyA()\x + EnemyA()\speedx
  Next

  If KeyboardPushed(#PB_Key_Up) And Delay = 0
    AddEnemyA(15, Random(200), 1)
    Delay = 5
  EndIf
 
  ForEach EnemyA()
    If EnemyA()\x>500 : DeleteElement(EnemyA())
    ElseIf MouseButton(1) And SpriteCollision(1, MouseX(), MouseY(), 0, EnemyA()\x, EnemyA()\y) : DeleteElement(EnemyA())
    EndIf
  Next
  
  If Delay>0 : Delay - 1 : EndIf
 
  ;DebugEnemyA()
 
  Delay(1)
  FlipBuffers(1)
Until KeyboardPushed(#PB_Key_Escape) 

Verfasst: 15.08.2006 07:30
von edel
Da ist ein 'ForEach EnemyA() ' zuviel. Den klick mit der Maustaste
kann man sicherlich bequem ueber ein 'event = windowevent
(waitwindowevent(delay)) filtern.


Beispiel : (funktioniert nicht ohne Fenster)

Code: Alles auswählen

Repeat
  event = WaitWindowEvent(1)
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(0)
  
  If KeyboardPushed(#PB_Key_Up) And Delay = 0
    AddEnemyA(15, Random(200), 1)
    Delay = 5
  EndIf
 
  ForEach EnemyA()
    If EnemyA()\x>500 
      DeleteElement(EnemyA())
      Continue
    ElseIf event = #WM_LBUTTONDOWN And SpriteCollision(1, MouseX(), MouseY(), 0, EnemyA()\x, EnemyA()\y) 
      DeleteElement(EnemyA())
      Continue
    EndIf 
    DisplayTransparentSprite(0, EnemyA()\x, EnemyA()\y) 
    EnemyA()\x + EnemyA()\speedx 
  Next
  
  DisplayTransparentSprite(1, MouseX(), MouseY())

  FlipBuffers(1)
Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 15.08.2006 11:23
von Kaeru Gaman
kannst auch mal hier rein gucken:
http://www.purebasic.fr/german/viewtopic.php?t=9093

Verfasst: 15.08.2006 17:04
von Rubiko
@#NULL: Klappt ja schonmal ganz gut, lässt sich bestimmt noch was machen, muss mal rumprobieren
@Kaeru Gaman: Werd's mal angucken

Danke an alle