Gegner nicht wieder an die selbe Stelle setzen?
Übersicht

![]() |
M0rgensternBetreff: Gegner nicht wieder an die selbe Stelle setzen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo an alle.
Ich hab ein schon ein wenig rumprobiert und auch dabei schon meinen Pc abgeschossen. Vom Prinzip her ist mir die Lösung des Problems klar, aber an der Umsetzung scheitere ich ein wenig. Es sieht folgendermaßen aus: Es wird alle 40 Sekunden eine Gegnerwelle erstellt. Das heißt es werden 6 Gegner an einer zufälligen X Position erstellt die dann von oben nach unten über den Bildschirm bewegt werden. Mein Problem ist jetzt, dass manche gegner sich überlappen. die X Werte also gleich, bzw ähnlich groß sind. Mir ist bewusst, dass ich eine Abfrage einbauen muss, die den neuen und alten X Wert vergleicht und gegebenenfalls einen anderen X Wert erstellt, aber WIE ich das genau bewerkstelligen soll, da ist mir leider noch kein Geistesblitz gekommen. Code: [AUSKLAPPEN] Function GegnerCreate()
If (Wavetimer+NextWave) < MilliSecs() Then For i = 1 To 6 Gegner.TGegner = New TGegner Gegner\Gx# = Rand(20,1260) Gegner\Gy# = -2 Gegner\Speed# = 3 Gegner\Typ = 1 Gegner\Bild = Gegner1 Gegner\tot = 0 Next Wavetimer = MilliSecs() EndIf End Function Ich hoffe, ihr könnt mir einen Lösungsansatz oder ähnliches geben. danke schonmal im voraus. lg, M0rgenstern |
||
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na das einfachste ist, wenn der Gegner z.B. 10 Pixel breit ist, Du einfach z.B. Rand(0*10,10*10) nimmst. Gibt schönere Lösungen aber die Funktioniert ![]() |
||
Play Satyr! |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Öhm, wenn ich das nur mit anderen Zahlenwerten übernehme, dann Hab ich im Endeffekt das gleiche Problem.
Oder hast du vllt gemeint, dass ich immer den alten Wert übernehmen muss? Sowas hab ich mir auch gedacht, aber dann habe ich folgendes Problem: Angenommen der Gegner wird bei 1200 erstellt. Dann wird der nächste ja nur noch weiter Links erstellt... und der nächste und übernächste. Außerdem ist mir grade noch was eingefallen: Ist ja schön und gut, wenn immer der nachfolgende Gegner überprüft wird. Aber was ist mit dem Gegner DANACH? Der könnte ja dann wieder an der selben Stelle sein wie der allererste, weil für den keine Überprüfung stattfindet.... Ich müsste das eigentlich in zwei for Schleifen verpacken, die zweite halt mit for each... Aber ich finde die Lösung unschön. lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieso unschön? Du musst halt alle Einträge mit diesem neuen vergleichen, die Distanz messen und bei bedarf die Koordinaten noch mal neu auswürfeln. Eine andere Möglichkeit sehe ich da nicht.
Vielleicht kannst du auch den Y- Bereich etwas variabler machen, das gibt mehr Spielraum. |
||
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) |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mach halt Objekte die die Gegner erstellen. Wenn ein Gegner erstellt wurde, kann dieses Objekt dann 5 Sekunden kein Gegner mehr erstellen und nach diesen 5 Sekunden gibst Du ihm eine Random Zeit in dem er wieder ein Gegner erstellt. Diese Objekte die die Gegner erstellen setzt Du so, dass sich die erstellten Gegner nicht überlappen können. | ||
Play Satyr! |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm... Ich glaub ich hab nen riesen Denkfehler drin, weil so wie ich das machen will kann es gar net funktionieren.
Wenn ich mit ner For each Schleife alle aufrufe, dann kann ich ja nicht mehr so richtig auf das eigentlich neu erstellte zugreifen. Ich habs mit Last versucht, aber das mag BB nicht so ganz....(Expexcting end-of line) Code: [AUSKLAPPEN] Function GegnerCreate()
If (Wavetimer+NextWave) < MilliSecs() Then For i = 1 To 6 Gegner.TGegner = New TGegner Gegner\Gx# = Rand(20,1260) For Gegner.TGegner = Each TGegner If Last Gegner\Gx# <= Gegner\Gx# + 27 And Last Gegner\Gx# >= Gegner\Gx# - 27 Then Gegner\Gx# = Rand(20, 1260) EndIf Next Gegner\Gy# = Rand(-30, -2) Gegner\Speed# = 3 Gegner\Typ = 1 Gegner\Bild = Gegner1 Gegner\tot = 0 Next Wavetimer = MilliSecs() EndIf End Function Wenn ich das Last rausnehme, dann gibts nen MAV. Hoffentlich kann mir jemand helfen, komm echt net so richtig drauf. @ DerHase Wie meinst du das mit den Objekten? Die gegner werden ja mit Types gemacht, ich weiß wirklich absolut nicht was du genau meinst. Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum benutzt du bei der inneren For...Each schleife nochmal "gegener" als Zugriffsvariable? Benutz da einfach eine andere. | ||
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) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Öhm???
Ich muss doch irgednwie auf die alten zugreifen können, oder kann ich da die Variable jederzeit beliebig ändern? lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Neue Typeeintrag liegt auf "gegner" und für die Schleife benutzt du irgendwas anderes... hier hab ich neulich schon mal was dazu getippt. | ||
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) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
ACHSOOO
Das wusste ich ja noch gar nicht. Danke dir, jetzt wird mir einiges die ganze Sache klar^^ Ich werde es direkt versuchen. Lg, M0rgenstern Edit: Also, vom Prinzip her funktioneirt die ganze Sache recht gut, die Gegner überlappen sich viel seltener, aber ich habe immernoch das Problem, dass es nur einmal überprüft wird und wenn es DANACH wieder auf einem Gegner liegt, dann wird das nicht mehr überprüft. Ich habe es in eine Schleife eingebaut: Code: [AUSKLAPPEN] Repeat
For info.TGegner = Each TGegner If Gegner\Gx# <= info\Gx# + 27 And Gegner\Gx# >= info\Gx# - 27 Then Da = 1 Gegner\Gx# = Rand(20, 1260) EndIf If Not Gegner\Gx# <= info\Gx# + 27 And Gegner\Gx# >= info\Gx# - 27 Then Da = 0 EndIf If KeyDown(1) Then End Next Until da = 0 Aber das funktioniert nicht, also es durchläuft die Schleife unendlich lange, was ich nicht so ganz verstehe, denn wenn die zweite if abfrage zutrifft, dann müsste Da ja 0 werden. Weiß vllt jemand wo ich meinen Denkfehler habe? lg, M0rgenstern |
||
Kaddy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn die gegner bilder sind dann überprüf doch einfach ob eine kollision zwischen 2 bildern ensteht, wenn ja soll das bild um eine bild länge nach rechts oder links gesezt werden? | ||
Bin Aktuell auf der Suche nach einen Programmierer Team, ob Hobby Team oder Firma ist egal. Einfach eine PM an mich schreiben.
Bezahlung verlange ich NATÜRLICH keine ![]() Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht ![]() ![]() |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, das würde ja erst funktionieren, wenn die gegner schon aufm schirm zu sehen sind... und dann würde man sehen wie das bild verschoben wird.
Außerdem werden sie außerhalb vom Schirm erstellt. Die Idee kam mir auch schon.. Lg, m0rgenstern |
||
Kaddy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
imagecollide wirkt nur auf den sichtbaren bild???
wäre mir neu , naja habs auch noch ned ausprobiert |
||
Bin Aktuell auf der Suche nach einen Programmierer Team, ob Hobby Team oder Firma ist egal. Einfach eine PM an mich schreiben.
Bezahlung verlange ich NATÜRLICH keine ![]() Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht ![]() ![]() |
![]() |
blackgecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, das stimmt nicht. ImagesCollide![]() |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Abstand Messen mit Pythagoras und die Bedingung zu einem Block zusammenfassen (Endweder-Oder gilt hier ja).
BlitzBasic: [AUSKLAPPEN] Local ZuNah, versuche Edit: Diverse Verbesserungen am Code... |
||
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) |
- Zuletzt bearbeitet von Xeres am Mo, Aug 17, 2009 0:23, insgesamt 2-mal bearbeitet
Kaddy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah gut für mich ist gerade eine welt zusammengebrochen xDD
wäre also n kleine lösungsvorschlag |
||
Bin Aktuell auf der Suche nach einen Programmierer Team, ob Hobby Team oder Firma ist egal. Einfach eine PM an mich schreiben.
Bezahlung verlange ich NATÜRLICH keine ![]() Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht ![]() ![]() |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
oh, tut mir leid. Ich dachte das funktioniert nur mit schon geflippten Bildern.
Naja, das erklärt zumindest, warum Imagescollide manchmal (sehr selten) schon ein wenig früher reagiert als es auf dem Bildschrim angezegit wird. Ist trotzdem keine Lösung für dieses Problem, denn es werden ja auf einen Schlag 5 Gegner erstellt und es geht ja nur darum, dass die sich nicht berühren. Das passiert aber alles bevor irgendwas gezeichnet wird. Xers, du bist mein Retter. Vielen dank, ich werde es gleich ausprobieren und ins Spiel einbauen. Aber auch danke an alle anderen. Antworten die nciht funktionieren helfen ja auch. Dann weiß man, was nicht geht^^ (ich hoff mal, ihr versteht was ich meien, nicht, dass das jetzt falsch rüber kommt) Lg, M0rgenstern Edit: Nachdem du deinen Code optimiert hast versteh ich eine Sache ehrlich gesagt nicht mehr: Wenn du Jedesmal zuNah + 1 rechnest, wenn die Distanz zu klein ist, dann kann zuNah ja nicht mehr false werden, da es immer <> 0 ist. Dann müsste ja jetzt ne zweite Abfrage rein, die Zunah auf False setzt, wenn die Distanz groß genug ist. Ist mir nur grade aufegallen, lg, M0rgenstern Edit 2: Ich packs nicht. Ich habs zuerst so gemacht wie grade beschrieben, mit der zweiten Abfrage. Da lagen die blöden Teile immernoch verdammt oft übereinander. Dann hab ichs auskommentiert und so gemacht wie Xeres geschrieben hat (ZuNah +1) und jetzt funktionierts perfekt. Ich frage mich wirklich warum. Kann mir das bitte jemand erklären? Hier der Code: BlitzBasic: [AUSKLAPPEN] Repeat Man sieht ja was ich ausgeklammert habe. Ich habe nur eine Verbesserung hinzugefügt: Es werden nur die type Einträge überprüft, die auch in der selben Höhe liegen (die Abfrage if info\Gy# < 7). Damit werden alle anderen Einträge, die schon weiter unten im Bildschirm sidn ausgeschlossen. Somit ist die Wahrscheinlichkeit geringer, dass eine X koordinate vergeben wird die schon vergeben ist. Also, um das schnell zu erklären, wie ich es meine: Angenommen, alle Einträge würden überprüft werden. Einer der neuen Einträge liegt auf einem anderen neuen. Jetzt soll er einen neuen X Wert bekommen. Es werden aber ALLE Einträge überprüft. Also darf er ja auch nicht auf einem der anderen liegen. So hab ich mir das gedacht. Aber wenn ich das hier so schreibe, merke ich eigentlich, dass das SChwachsinn ist, weil das durch den Pythagoras ja schon begrenzt wird. Okay, werds rausnehmen, tut mir leid^^ Aber mal im Ernst, warum funktioniert das mit den zwei Abfragen nciht so gut, aber Xeres' +1 Lösugn perfekt? lg, m0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group