Ergebnis 1 bis 15 von 15

Thema: Freebasic - Shooter Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Freebasic - Shooter Problem

    Jo...
    Ich habn Problem:
    Ich habe angefangen einen 2D Shooter mit Freebasic zu basteln. Wenn man nun schießt (Leertaste) hat man einen Dauerfeuer \o/ Nun hab ich die maximal Anzahl an Schüssen auf 100 gesetzt. Wenn man nun 100 Schüsse geschossen hat passiert was blödes: Da nun die Schuus anzahl wieder auf 0 gesetzt wird, verschwinden alle Schüsse. Ist ja eigentlich klar. Nun, Jens hat mir geholfen und gesagt, dass ich jeden Schuss, der den Bildschirm verlässt, wieder freigebe. Ich hab mir gedacht, dass ich dann einfach von den Schüssen einen abziehe. Tja! Falsch gedacht! Statt dass der Schuss, der den Bildschirm verlässt, gelöscht wird, wird der letzte, den ich schieße gelöscht.

    Ich hab die Zeile ausreichend mit Kommentaren geschmückt, damit man die Problemstelle erkennt. Das ' in Zeile 80 könnt ihr übrigens mal rausnehmen, um zu sehen, wie die Schüsse gelöscht werden.

    Link:
    http://www.file-upload.net/download-...ooter.rar.html

    Btw: Ich hab für die Schüsse Arrays genommen (maximal Anzahl Schüsse,2) 0= Schuss Nr. 1=X-Koordinate, 2=Y-K.
    Und ja, ich weiß selbst, dass mein Programmierstil grottig ist! xD

    €dit: Die Zahlen oben sie übrigens die X-und Y-Koordinaten und die Anzahl Schüsse. Sind nur zu Testzwecken da.

    Geändert von Teflo (04.04.2008 um 20:28 Uhr)

  2. #2
    Ich hab mir den Code noch nicht angesehen, aber ich nehme einfach mal an, dass du immer das letzte Element des Arrays löscht, welches wahrscheinlich das jüngste Element ist. Versuch mal, den Array irgendwie zu shiften, kA ob es sowas in FreeBasic gibt. Irgendwie muss halt das erste Element gelöcht werden und der Rest um eins nach vorne verschoben werden.

    Edit: Den Code kann ich mir nicht ansehen, weil das Archiv leer ist. o.o

  3. #3
    HA!
    Problem wurde von unserem allgeliebten jensma behoben! Danke nochmal!

    Der Schuss, der den Bildschirm verlässt, wird einfach wieder zurück"geschoben". Also wenn der SchussX >1000 ist, dann wird er irgendwo <1000, wo man ihn nicht sehen kann, teleportiert (in diesem Fall hinter dem Raumschiff)! Oki, trotzdem danke an die hier so da so, ne?

  4. #4
    Ist zwar nciht die beste methode, aber was solls...

    Ich würde mir an deiner Stelle die FreeBasic Extended Library ziehen, da sind u.a. Array-Shift-Funktionen dabei.

    PS: jensma kann FB? oO

    mfG Cherry

  5. #5
    Zitat Zitat von Cherry1 Beitrag anzeigen
    PS: jensma kann FB? oO

    mfG Cherry
    Ich vermute mal, dass allgemeine Programmierkenntnisse (egal welcher Sprache) im Prinzip ausreichen, um Algorithmen und Fehler in ihnen zu verstehen. Und wenn man dazu noch Basic beherrscht, ist der Umgang mit anderen Basic-Dialekten kein großes Thema mehr.

  6. #6
    Achso, stimmt. So gehts mir mit C++

    Ich hab mich nur gewundert, weil FB ja doch eher unbekannt und -beliebt ist.

  7. #7
    Meinst du?
    Also ds würde mich wundern, wenn ich da an C++ denke @.@''
    Freebasic ist doch da viel besser geeignet XD
    Gut ich verstehe jetzt sicher nich soviel wei du davon, aber da ich ja schon ne Menge Sprachen probiert hab, fand ich FB bisher am besten^^

  8. #8
    Ich muss mich mal wieder melden. Es geht zwar nicht um den Shooter, aber auch um FB. Also:
    Ich möchte kontrollieren, ob ein Punkt auf einer Geraden liegt. ich kenne Start- und Endpunkt dieser Geraden. Im Chat sagte mir Manni, dass man das so abfragen kann:
    (x1-x2)/(y1-y2)=(x1-x3)/(y1-y3)
    Wenn das eintrifft, liegt der Punkt (x3|y3) auf der Geraden zwischen (x1|y1)-(x2|y2)
    Soweit so gut. Ich hab das nun in ein Code gepackt:
    Code:
    For i = 0 to Linie
                For a = 0 to MaxPunkte
                    Vy(a)+=Grav
                    PunktY(a)+=Vy(a)
                    PunktX(a)+=Vx(a)
                    If (LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i))=(LinieX1(i)-PunktX(a))/(LinieY2(i)-PunktY(a)) Then
         'Kollision
                    Endif
                Next a
            Next i
    Aber komischerweise trifft das immer zu, also er führt den Kollosionscode immer aus. =/

  9. #9
    Hast du auch bedacht, das Geraden UNENDLICH lang sind ?
    Der Code von Manni testet nur, ob die Linearfunktion der geraden P1P2 den gleichen Anstieg hat, wie die Gerade P1P3. Und das funktioniert auch nur in 2D (was hinreichend sein sollte). Da Geraden unendlich lang sind, hat Manni mit seiner Methode recht.

    Mir scheint es aber vielmehr, das du testen willst, ob sich ein Punkt auf der STRECKE P1-P2 befindet, also auf einem endlichen Teilabschnitt der Geraden P1P2. Hierzu muss ausser der obigen Bedingung zusaetzlich noch erfuellt sein, dass X1<=X3<=X2 oder X2<=X3<=X1 ist. Erst dann liegt der Punkt auf der Geraden und befindet sich auf der X-Achse zwischen X1 und X2.

  10. #10
    Okay, meine Abfrage sieht jetzt so aus:
    Code:
    If (LinieX1(i)-LinieX2(i))/(LinieY1(i)-LinieY2(i))=(LinieX1(i)-PunktX(a))/(LinieY2(i)-PunktY(a)) And( LinieX1(i)<=PunktX(a)<=LinieX2(i) Or LinieX2(i)<=PunktX(a)<=LinieX1(i) )And( LinieY1(i)<=PunktY(a)<=LinieY2(i) Or LinieY2(i)<=PunktY(a)<=LinieY1(i)) Then
    'Kollision
    Endif
    Jedoch geht's immer noch nicht! :/ Wieder das Problem, dass er meint, es träfe immer zu...

  11. #11
    Ich kenn mich mit FB nicht aus, aber DAS sieht nicht richtig aus ...

    LinieX1(i)<=PunktX(a)<=LinieX2(i)

    Das sieht aus, als ob da TRUE oder FALSE auf 0 bzw 1 gecastet wird und dann erst verglichen wird.

    Ich wuerde es als ((LinieX1(i)<=PunktX(a)) AND (PunktX(a)<=LinieX2(i))) formulieren.

    Den Vergleich mit den Y Werten kannst du dir sparen, es sei denn, du hast auch senkrechte Linien.

  12. #12
    Die Lösung für Delphi sähe folgendermaßen aus:
    Code:
    if (Liniex1 = Liniex2) and (Punktx = Liniex1) then
    if (((liniey1 <= liniey2) and ((liniey1 <= punkty) and (punkty <= liniey2))) or ((liniey1 >= liniey2) and ((liniey2 <= punkty) and (punkty <= liniey1)))) then
    result := true
    else
    result := false
    else
    if (Punkty = Liniey1 + ((Punktx - Liniex1) * (Liniey2 - Liniey1) / (Liniex2 - Liniex1)))
    and (((liniex1 <= liniex2) and ((liniex1 <= punktx) and (punktx <= liniex2))) or ((liniex1 >= liniex2) and ((liniex2 <= punktx) and (punktx <= liniex1))))
    and (((liniey1 <= liniey2) and ((liniey1 <= punkty) and (punkty <= liniey2))) or ((liniey1 >= liniey2) and ((liniey2 <= punkty) and (punkty <= liniey1)))) then
    result := true
    else
    result := false;
    Sicher ist das jetzt viel zu umständlich gedacht, und du musst es auch noch in die Sprache deiner Wahl umschreiben, aber immerhin - es funktioniert. ^^ (Hat zumindest bei zwanzig Tests funktioniert, natürlich kann ich für nichts garantieren...)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •