Problem mit Schuss-Funktion

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Alex123

Betreff: Problem mit Schuss-Funktion

BeitragMi, Feb 25, 2009 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich bin gerade an dem Projekt einen Action-Shooter (2D) zu programmieren und da dieses Gebiet noch ziehmlich neu für mich ist, hänge ich schon seit Tagen an diesem Problem:

Ich erstelle eine zufällige Anzahl an Gegnern, das klappt soweit auch ganz gut, jedoch um so mehr gegner erscheinen um so schneller bewegt sich auch die Kugel die sie abfeuern, ist nur ein Gegner da, fliegt die Kugel mit der Geschwindigkeit wie ich es auch haben will.

Ich habe zwei Types erstellt, einen für die Gegner und einen für den Angriff, die sehen so aus:

Code: [AUSKLAPPEN]

Type gegner
   Field xpos
   Field ypos
   Field speed
   Field rangeMaxX
   Field rangeMinX
   Field enemyTempY#
   Field enemyJump
   Field links
   Field rechts
End Type

Global a.gegner

Type attack
   Field bulletX
   Field bulletY
   Field bulletSpeed
End Type

Global b.attack


Und dann hier noch meine Angriffs-Funktion:

Code: [AUSKLAPPEN]

Function BotAttack()
   
   If wait = Rand(1,200) Then
               
      b = New attack
   
      b\bulletX = a\xpos
      b\bulletY = a\ypos
      
      If a\xpos > player_xpos Then b\bulletSpeed = -6
      If a\xpos < player_xpos Then b\bulletSpeed = +6
         
   EndIf
   
   If a\speed = True And a\xpos > player_xpos Then
      For b = Each attack    
         b\bulletX = b\bulletX + b\bulletSpeed - 4
         DrawImage bullet, b\bulletX, b\bulletY
         
      Next
   ElseIf a\speed = True And a\xpos < player_xpos Then
      For b = Each attack    
         b\bulletX = b\bulletX + b\bulletSpeed - 4
         DrawImage bullet, b\bulletX, b\bulletY
      Next
   ElseIf a\xpos > player_xpos Then
      For b = Each attack    
         b\bulletX = b\bulletX + b\bulletSpeed
         DrawImage bullet, b\bulletX, b\bulletY
      Next   
   ElseIf a\xpos < player_xpos Then
      For b = Each attack    
         b\bulletX = b\bulletX + b\bulletSpeed
         DrawImage bullet, b\bulletX, b\bulletY
      Next
   EndIf
      
End Function


Jetzt wollte ich eben mal hier fragen, ob ich irgendwas Falsch programmiert habe und mein Code kompletter Mist ist.

Hoffe ihr könnt mir helfen.

Xeres

Moderator

BeitragMi, Feb 25, 2009 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Anstatt dieser Konstruktion...
Code: [AUSKLAPPEN]
If wait = Rand(1,200) Then

würde ich einen Timer Vorschlagen, der alle x Millisekunden angreift. Millisecs und falls du nicht drauf kommst Forensuche helfen da.
Das größte Problem das ich sehe ist, das du die Gegner nicht durchgehst -> in a ist immer die selbe Instanz eines Gegeners. Wo werden die mit for a = each gegner durchgegangen?

Dieser Block:
Code: [AUSKLAPPEN]
If a\speed = True And a\xpos > player_xpos Then
      For b = Each attack   
         b\bulletX = b\bulletX + b\bulletSpeed - 4
         DrawImage bullet, b\bulletX, b\bulletY
      Next
   ElseIf a\speed = True And a\xpos < player_xpos Then
      For b = Each attack   
         b\bulletX = b\bulletX + b\bulletSpeed - 4
         DrawImage bullet, b\bulletX, b\bulletY
      Next
   ElseIf a\xpos > player_xpos Then
      For b = Each attack   
         b\bulletX = b\bulletX + b\bulletSpeed
         DrawImage bullet, b\bulletX, b\bulletY
      Next   
   ElseIf a\xpos < player_xpos Then
      For b = Each attack   
         b\bulletX = b\bulletX + b\bulletSpeed
         DrawImage bullet, b\bulletX, b\bulletY
      Next
   EndIf

Man kann erst mal "For b = Each attack ... next" außerhalb der If Konstruktion legen, da egal was ist, alle b durchgegangen werden sollen. Dann kann man die ersten beiden und zweiten beiden Blöcke zusammenfassen -> Es passiert eh das gleiche ob "> player_xpos" oder "< player_xpos ".
Aber auf die ersten beiden Blöcke kannst du auch gleich verzichten, wenn du beim erstellen 100%ig die Richtung festlegst:
Code: [AUSKLAPPEN]
If a\xpos => player_xpos Then b\bulletSpeed = -6
      If a\xpos < player_xpos Then b\bulletSpeed = +6

...oder wie du die Richtung sonst noch eindeutig festlegen kannst.

Die Type-Variablen Global zu machen ist nicht zwingend nötig, aber auch nicht falsch, ich rate dir nur, aussagekräftige Namen zu wählen. Types immer mit vorgestelltem T und bei ein-Buchstaben-Variablen so was wie g.Tgegner und a.Tattack...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Alex123

BeitragMi, Feb 25, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
So, erstmal danke für die schnelle Antwort.

An den Timer hatte ich noch gar nicht gedacht, aber der ist jez eingebaut.

die "For a = Each gegner" - Schleife befindet sich in der Hauptschleife, da ich noch andere Funktionen hab wie z.B. den Gegner zeichen und ihn laufen zu lassen:

Code: [AUSKLAPPEN]

For a = Each gegner
   BotDraw()
   BotGrav()
   BotAttack()   
   BotWalk()
Next


Die "For b = Each attack" habe ich jetzt auserhalb gelegt, aber es klappt immernoch nicht, die Geschwindigkeit mit der die Kugeln abgefeuert werden, wird immernoch höher sobald mehrere Gegner erstellt werden. -.-

Ist es vielleicht falsch, das ich einen neuen Type für die Kugeln gemacht habe?

Xeres

Moderator

BeitragMi, Feb 25, 2009 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha!
Du gehst alle Gegner durch, und bei jedem Gegner erhöhst du die Geschwindigkeit vom Geschoss.
-> Die Bewegung darf nicht innerhalb dieser doppelten Schleife durchgeführt werden.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Alex123

BeitragDo, Feb 26, 2009 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
OK das klingt logisch, aber wie soll ich das denn sonst machen? Da ja jeder Gegner eine andere X-Position hat, muss ich doch alle Gegner durch gehen, oder nicht?

Hoffe man versteht was ich meine.

Mit "Bewegung" meinst du sichererlich die Bewegung der Kugeln, oder?

Edit: Muss ich dann vielleicht mit Before/After arbeiten?

Firstdeathmaker

BeitragDo, Feb 26, 2009 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Seh die Geschosse mal unabhäniger von den Gegnern: Erst gehst du alle Gegner durch, updatest und zeichnest sie, und dann gehst du alle geschosse durch, updatest und zeichnest sie. Ich empfehle dir folgende Struktur:




Code: [AUSKLAPPEN]

;Objekt Gegner
Type TGegner
End Type

Function UpdateGegner(g.TGegner)
End Function

Function UpdateAngriff(a.TAngriff)
End Function


;Objekt: Angriff
Type TAngriff
End Type

Function DrawGegner(g.TGegner)
End Function

Function DrawAngriff(a.TAngriff)
End Function

;Logikschleife
Function Update()
   For g = EachIn TGegner
      UpdateGegner(g)
   Next
   
   For a = EachIn TAngriff
      UpdateAngriff(a)
   Next
End Function

;Zeichenfunktin
Function Draw()
   For g = EachIn TGegner
      DrawGegner(g)
   Next
   
   For a = EachIn TAngriff
      DrawAngriff(a)
   Next
End Function

;Hauptschleife
Function Main()
   Update()
   Draw()
End Function




In der Funktion UpdateAngriff(a) gehst du dann alle Gegner durch und überprüfst, ob dieses eine Geschoss a einen Gegner g trifft:

Code: [AUSKLAPPEN]
Function UpdateAngriff(a)
   For g = EachIn TGegner
      wenn Kollisionerkennung() dann lösche angriff:
      Delete a
      Return
   Next
End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Alex123

BeitragSo, März 01, 2009 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das Problem lag wohl an der doppelten Schleife, vielen Dank für eure Hilfe. Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group