Problem mit Schuss-Funktion
Übersicht

Alex123Betreff: Problem mit Schuss-Funktion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Anstatt dieser Konstruktion...
Code: [AUSKLAPPEN] If wait = Rand(1,200) Then
würde ich einen Timer Vorschlagen, der alle x Millisekunden angreift. Millisecs ![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Alex123 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Alex123 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also das Problem lag wohl an der doppelten Schleife, vielen Dank für eure Hilfe. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group