Kollision !?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Xsoft
Beiträge: 15
Registriert: 24.09.2004 18:17
Wohnort: Hessen
Kontaktdaten:

Kollision !?

Beitrag von Xsoft »

Hallo,
ich habe ein Problem. Naja wie ihr seht (im "mein 2d shooter" thread) hat mir sunny geholfen, dass schiessen einzubauen. Es funzt für beide Spieler. Ich wollte fragen, wie man eine Kollision macht? habe überhaupt keine ahnung^^ kann mir das jemand erklären?

Code: Alles auswählen

; Code
Structure bullet_struc 
  pos_x.w 
  pos_y.w 
  speed_x.w 
  speed_y.w 
  graphic.w 
EndStructure 

NewList bullet.bullet_struc() 



InitSprite() And InitKeyboard() 

PlayerX = 20 
PlayerY = 700 

PlayerTwoX = 500
PlayerTwoY = 10 


OpenScreen(1024, 768, 32, "Muake - 2D Shooter") 

; Player one and two
 LoadSprite(0,"player1.bmp")
 LoadSprite(1,"player2.bmp")
 graphic.w = LoadSprite(2,"shoot.bmp")
 LoadSprite(3,"player2_explosion.bmp")
 
 

Repeat 

  ClearScreen(0,0,0) 
  
  ForEach bullet() 
    bullet()\pos_x = bullet()\pos_x + bullet()\speed_x 
    bullet()\pos_y = bullet()\pos_y + bullet()\speed_y 
    DisplaySprite(bullet()\graphic, bullet()\pos_x, bullet()\pos_y) 
    If bullet()\pos_y <= 0 
      DeleteElement(bullet()) 
    EndIf 
  Next bullet() 
  
DisplayTransparentSprite(0,PlayerX,PlayerY)
DisplayTransparentSprite(1,PlayerTwoX,PlayerTwoY)
  
  FlipBuffers() 
  
  If KeyboardPushed(#PB_Key_Right) 
    PlayerX + 6 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left) 
    PlayerX - 6 
  EndIf 
  

  If KeyboardPushed(#PB_Key_D) 
    PlayerTwoX + 6 
  EndIf 
  
  If KeyboardPushed(#PB_Key_A) 
    PlayerTwoX - 6 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Space) 
    If space = 0 
      space = 1 
      AddElement(bullet()) 
      bullet()\pos_x = PlayerX 
      bullet()\pos_y = PlayerY 
      bullet()\speed_y = -20 
      bullet()\speed_x = 0 
      bullet()\graphic = 2 
    EndIf 
  Else 
    space = 0 
  EndIf 


  If KeyboardPushed(#PB_Key_LeftAlt) 
    If alt = 0 
      alt = 1 
      AddElement(bullet()) 
      bullet()\pos_x = PlayerTwoX
      bullet()\pos_y = PlayerTwoY 
      bullet()\speed_y = 10
      bullet()\speed_x = 1
      bullet()\graphic = 2
    EndIf 
  Else 
   alt = 0 
  EndIf 
  

 ExamineKeyboard() 
  
Until KeyboardPushed(#PB_Key_Escape) 
hier ist der code.. wie soll ich das machen?

Ich hoffe es kann mir jemand helfen !!!!!

mfg xsoft
Windows XP Home Edition - SP1 - Pure Basic 3.93 - jaPBe
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

wenn du die kollision nicht selbst schreiben wills, benutz doch spritecollision() bzw spritepixelcollision().

wenn du sie selbst schreiben willst gibt es da verschiedene möglichkeiten.

bei der bounding box collision vergleichst du zb einfach nur ob sich die eckpunkte überlegern.

für bounding spheres brauchst du nur den abstand mit phytagoras ausrechnen.
Benutzeravatar
Xsoft
Beiträge: 15
Registriert: 24.09.2004 18:17
Wohnort: Hessen
Kontaktdaten:

Beitrag von Xsoft »

Ja ich weiß das man es mit spritepixelcollision() oder spritecollision() machen kann..jedoch muss man ja dann das Sprite ändern bzw. durch ein neues ersetzen? wie??

vielen dank !
Windows XP Home Edition - SP1 - Pure Basic 3.93 - jaPBe
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

wie, was, wo muß etwas ersetzt werden?

guck mal in die dokumentation zu spritecollision.
Benutzeravatar
Xsoft
Beiträge: 15
Registriert: 24.09.2004 18:17
Wohnort: Hessen
Kontaktdaten:

Beitrag von Xsoft »

hab das schon gemacht..
schau mal..ich will wenn das sprite also bullet mit dem gegnerischen schiff zusammenprallt das dann das gegnerische schiff (normal) durch das andere Sprite ersetzt wird.Also das sprite mit der explosion..
wie geht das??

mfg
Windows XP Home Edition - SP1 - Pure Basic 3.93 - jaPBe
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

ganz einfach, du lädst ein drittes sprite mit der grafik deines zerstörten schiffens ganz zum anfang und wenn du die andere grafik haben willst zeichnest du einfach das andere sprite.

also zb mit einer if anweisung und einer variablen die den zustand des schiffes verdeutlicht:

If raumschiff_zustand 1
zeichne_intaktes_schiff
Else
zeichne_schrottschiff
EndIf
Antworten