Breakmeout + Abprallwinkel

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Breakmeout + Abprallwinkel

Beitrag von roherter »

Hi @all,
Ich versuche gerade mein erstes Spiel zu schreiben ich habe nur ein Problem das mit dem Abprallen+Winkel hinzubekommen.
Ich habe schon versuch Code aus dem archiv mit einzubauen aber anscheinend muss ich wohl noch mal ganz von vorne anfangen es sei denn jemand kann mir bei dem Problem helfen?

Hier ist mal der Source habe es auch noch ins web gestellt:

Der Link: www.leolasoft-herter.de/breakmeout.rar

Code: Alles auswählen

Enumeration
  #back
  #back2
  #back3
  #first
  #panel
  #ball
  #soundloop
  #space
EndEnumeration
UseJPEGImageDecoder()
UseOGGSoundDecoder()
InitSprite()
InitKeyboard()
InitSound()
NewList breaks1.l()
NewList breaks2.l()
NewList breaks3.l()
NewList breaks4.l()
Structure entries
  lives.l
  EndStructure

Structure pos
  top.l
  left.l
  winkel.l
EndStructure
;-leben
Dim leben.entries(0)
;-
Dim panel.pos(1)
panel(0)\top=500
panel(0)\left=350
Dim ball.pos(1)
ball(0)\top=450
ball(0)\left=400
ball(0)\winkel=0
For a=20 To 700 Step 85
  AddElement(breaks1())
  breaks1()=a
Next a

For a=60 To 700 Step 85
  AddElement(breaks2())
  breaks2()=a
Next a

For a=60 To 700 Step 85
  AddElement(breaks3())
  breaks3()=a
Next a
If OpenScreen(800,600,16,"")
  ;-Sprites
  LoadSprite(#back,"img\linkecke.jpg")
  LoadSprite(#back2,"img\untenoben.jpg")
  LoadSprite(#back3,"img\rechtecke.jpg")
  LoadSprite(#first,"img\line-red-yellow.jpg")
  LoadSprite(#panel,"img\panel.jpg")
  LoadSprite(#ball,"img\ball.jpg")
  LoadSound(#soundloop,"sounds\trancemove.ogg")
  LoadSound(#space,"sounds\space.wav")
;-
EndIf
PlaySound(#soundloop,1)
SoundFrequency(#soundloop, 32000)
ball=0
Repeat
  
 ClearScreen(RGB(0,0,0)) 
  ExamineKeyboard()
  DisplayTransparentSprite(#back,0,0)
  For a=5 To 795 
    DisplayTransparentSprite(#back2,a,0)
  Next a
   DisplayTransparentSprite(#back3,795,0)
  ForEach breaks1()
    DisplayTransparentSprite(#first,breaks1(),100)
  Next
  ForEach breaks2()
    DisplayTransparentSprite(#first,breaks2(),125)
  Next
  ForEach breaks3()
    DisplayTransparentSprite(#first,breaks3(),150)
  Next
  
  DisplayTransparentSprite(#panel,panel(0)\left,panel(0)\top)
   DisplayTransparentSprite(#ball,ball(0)\left,ball(0)\top)
  FlipBuffers()
  If KeyboardPushed(#PB_Key_Right) And panel(0)\left<680
     PlaySound(#space)
    panel(0)\left=panel(0)\left+3
    
  EndIf
  If KeyboardPushed(#PB_Key_Left) And panel(0)\left>10
    PlaySound(#space)
    panel(0)\left=panel(0)\left-3
    
  EndIf
  If KeyboardPushed(#PB_Key_Space) 
    ball=1  
 
EndIf
If ball=1 And ball(0)\top<555 And ballsp=0
  If ball=1 And ball(0)\top>5 And ballsp=1
    ball(0)\top=ball(0)\top-4
    ball(0)\left=ball(0)\left+ball(0)\winkel
    ballsp=1
  Else 
    ballsp=0
  EndIf
Else
  If ball=1 And ball(0)\top>5 And ballsp=1
    ball(0)\top=ball(0)\top-4
    ball(0)\left=ball(0)\left+ball(0)\winkel
    ballsp=1
  Else 
    ballsp=0
  EndIf
EndIf 

  If ball=1 And ball(0)\top<555 And ballsp=0
    ball(0)\top=ball(0)\top+4
    ball(0)\left=ball(0)\left+ball(0)\winkel
    ballsp=0
  Else 
   
    ballsp=1
  EndIf
  If SpritePixelCollision(#panel,panel(0)\left,panel(0)\top,#ball,ball(0)\left,ball(0)\top)
    
    ball=1:ballsp=1
  
EndIf 
  ForEach breaks1()
    If SpritePixelCollision(#ball,ball(0)\left,ball(0)\top,#first,breaks1(),100):Debug "xxx"
   DeleteElement(breaks1())
      ball=1:ballsp=0
  EndIf

Next 
ForEach breaks2()
  If SpritePixelCollision(#ball,ball(0)\left,ball(0)\top,#first,breaks2(),125):Debug "xxx"
    DeleteElement(breaks2())
    ball=1:ballsp=0
  EndIf
  
Next
ForEach breaks3()
  If SpritePixelCollision(#ball,ball(0)\left,ball(0)\top,#first,breaks3(),150):Debug "xxx"
    DeleteElement(breaks3())
    ball=1:ballsp=0
    
     

  EndIf
  
Next
  If KeyboardPushed(#PB_Key_Escape)   ; drücken Sie Esc zum Beenden
    End
  EndIf
  
ForEver


 
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Tach roherter

Wie du vllt gesehen hast habe ich ja SNOOKER und QUADRO programmiert, da habe ich "echte" Apprallwinkel.

Hier mein CODE für das Apprallen von zwei aufeinanderkommende Kugeln (gleich schwer)

Code: Alles auswählen


; K1_v = Geschwindigeit von Kugel 1 
; K2_v = Geschwindigeit von Kugel 2 
; K1_w = Bewegungswinkel von Kugel 1
; K2_w = Bewegungswinkel von Kugel 2
; das gleiche mit _NEU = Geschwindigkeit und Winkel nach dem zusammenstoß

 K1_w_treff = ATan((K1_y-K2_y)/(K1_x-K2_x))/b+180+360
 K2_w_treff = K1_w_treff + 180 
      
 K1_v_von_treff = K2_v*Cos((K2_w_treff-K2_w)*b)
 K2_v_von_treff = K1_v*Cos((K1_w_treff-K1_w)*b

 K1_v_durch_treff = K1_v*Sin((K1_w_treff-K1_w)*b)
 K2_v_durch_treff = K2_v*Sin((K2_w_treff-K2_w)*b)

 K2_w_NEU = K1_w_treff+ATan(K2_v_durch_treff/K2_v_von_treff)/b
 K1_w_NEU = K2_w_treff+ATan(K1_v_durch_treff/K1_v_von_treff)/b

 K1_v_NEU = Sqr(Pow(K1_v_von_treff,2)+Pow(K1_v_durch_treff,2))*(K1_v_von_treff/Abs(K1_v_von_treff))
 K2_v_NEU = Sqr(Pow(K2_v_von_treff,2)+Pow(K2_v_durch_treff,2))*(K2_v_von_treff/Abs(K2_v_von_treff))

 If K1_v_NEU < 0 : K1_w_NEU = K1_w_NEU + 180 : K1_v_NEU = -K1_v_NEU : EndIf
 If K2_v_NEU < 0 : K2_w_NEU = K2_w_NEU + 180 : K2_v_NEU = -K2_v_NEU : EndIf

Wenn du es nicht so ganz verstehst kannst du mich noch mal kontaktieren

EDIT : Der Code muss dann kommen wenn die beiden Kugel sich treffen !
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Ja danke so wies aussieht muss ich nochmal von vorne anfangen. :allright:
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

roherter hat geschrieben:Ja danke so wies aussieht muss ich nochmal von vorne anfangen. :allright:
Noch ein paar Hinweise :-)
- Es darf keine Geschwindigkeit 0 sein ! (wegen 0/0 und so )
- alle variablen sollten .f sein (genauer)

Ich arbeite selber gerade noch an einer Procedure die etwas einfach zu bedienen ist :-). Wenn die fertig ist stelle ich sie hier noch rein.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten