Schussüberprüfung mit Fadenkreuz

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Schussüberprüfung mit Fadenkreuz

Beitrag 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
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Wie sollen wir dir ohne Sourcecode helfen können? Kiffis Glaskugel is leider noch immer in der Reparatur... :?
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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) 
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

kannst auch mal hier rein gucken:
http://www.purebasic.fr/german/viewtopic.php?t=9093
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Antworten