ImagesCollide fehlerhaft bei Types

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Dice of Darkness

Betreff: ImagesCollide fehlerhaft bei Types

BeitragMo, Sep 20, 2010 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich schreibe im Moment ein kleines RPG-Spielchen, das ich im Rahmen eines Uni-Proseminars vorstellen werde. Dabei geht es in erster Linie darum, verschiedene Eigenschaften von BlitzBasic anhand des Spiels zu erklären: Es gibt eine einfache Tilemap mit Feuer, Wasser, Erde, Gras und Sand, die mit einem Editor erstellt wurde (welcher dann eine Textdatei mit Koordinaten und Art des Tiles anlegt). Außerdem gibt es ein paar kleine Objekte, die der Spieler aufsammeln und dann im Inventar betrachten kann.

An dieser Stelle hab ich das Problem festgestellt: Ich hab für die verschiedenen Objekte, die man einsammeln kann, einen Type erstellt. Darin sind die Felder "kind" (also was ist es), "posx" und "posy" (also Koordinaten) enthalten. Die Objekte werden beim Start des Programms anhand von gespeicherten Daten aus einer *.ini-Datei erzeugt und an den entsprechenden Stellen auf der Tilemap abgebildet. Wenn ich mit dem Spieler ein Objekt berühre (ImagesCollide), dann erstellt das Programm ein neues Objekt derselben Sorte am unteren Bildschirmrand (also quasi die Inventarleiste) und löscht das berührte Objekt auf der Map.

Ich habe jetzt allerdings festgestellt, dass der Befehl ImagesCollide offensichtlich gar nicht wirklich prüft, ob das richtige Bild an der Stelle angezeigt wird, sondern ob überhaupt ein Bild an der Stelle existiert:

Code: [AUSKLAPPEN]
For o.obj = Each obj
       
        If ImagesCollide(sword,o\posx,o\posy,0,player,plx,ply,0) Then
            Select o\kind
                Case 1
                    inv.obj = New obj
                    inv\kind = 1
                    inv\posx = xinv
                    inv\posy = (height-40)
                    xinv = xinv + 40
                    ;swordnum = swordnum + 1    ;wird nur noch gebraucht, falls die Inventar-Objekte (doppelte) mit Nummer versehen werden sollen
                Case 2
                    inv.obj = New obj
                    inv\kind = 2
                    inv\posx = xinv
                    inv\posy = (height-40)
                    xinv = xinv + 40
                    ;booknum = booknum + 1
                Case 3
                    inv.obj = New obj
                    inv\kind = 3
                    inv\posx = xinv
                    inv\posy = (height-40)
                    xinv = xinv + 40
                    ;mednum = mednum + 1
                Case 4
                    inv.obj = New obj
                    inv\kind = 4
                    inv\posx = xinv
                    inv\posy = (height-40)
                    xinv = xinv + 40
                    ;keynum = keynum + 1
            End Select
            Delete o.obj
        EndIf
       
    Next


Interessant ist eigentlich die zweite Zeile: Das ImagesCollide überprüft bloß, ob der Spieler ein Objekt der Sorte "Schwert" berührt. Also ob das Bild "sword" an der Stelle gemalt wird. Die anderen Objekte haben ja alle ein anderes Bild. Aber es war egal, ob der Spieler jetzt ein Schwert oder was anderes (z.B. ein Buch) berührt hat: Der Bedingungsteil wurde immer ausgeführt!

Die einzelnen Case's überprüfen letztlich, welches Objekt der Spieler denn nun wirklich berührt hat. Ok, auf der einen Seite hat dieser Bug(?) einen Vorteil: Ich muss nicht ImagesCollide auf jedes einzelne Objekt-Bild anwenden, mit dem der Spieler theoretisch kollidieren könnte. Aber trotzdem verstehe ich nicht so recht, wie der Befehl "ImagesCollide" eigentlich funktioniert. Denn normalerweise müsste ja, wenn ich z.B. ein Buch berühre, ImagesCollide erkennen, dass Schwert und Spieler sich nicht berühren bzw. dass das Objekt(-Bild) an der angegebenen Position kein Schwert ist, und der If-Teil dürfte nicht ausgeführt werden.

Hat irgendjemand eine Idee, woran das liegen kann, bzw. gab es vielleicht schonmal so ein Thema? Ich hab mit der Forensuche nachgeschlagen, aber nichts dergleichen gefunden...

Vielen Dank schonmal für (hoffentlich) erklärende Antworten Wink!


MfG, Dice of Darkness
Gratis Spiele, Musik, Tools

Xeres

Moderator

BeitragMo, Sep 20, 2010 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Bug - so arbeitet BB nunmal Wink
ImagesCollide hat durch die Bilder intern Breite & Höhe (und handle-Positionen) und kann ausrechnen, ob sich die Bilder überschneiden. Das hat nichts damit zu tun, ob sie wirklich an der Stelle gezeichnet werden oder nicht.
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)

Dice of Darkness

BeitragMo, Sep 20, 2010 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber dann frage ich mich, wieso man überhaupt ein Handle für das Bild eingeben muss (also hier "sword"). Denn eigentlich könnte ich mir diesen Parameter dann ja komplett schenken ?!
Gratis Spiele, Musik, Tools

Xeres

Moderator

BeitragMo, Sep 20, 2010 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic muss wissen, welche Bilder betrachtet werden sollen, und wo sie sich befinden.
Mit den Bildhandles kann BB auf die Höhe/Breite/Maskierung beider Bilder zugreifen... Dann ist Mathematisch klar ob Kollision oder nicht.
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)
 

feider

ehemals "Decelion"

BeitragDi, Sep 21, 2010 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Befehl ImagesCollide überprüft ja nicht, ob an dieser Stelle tatsächlich ein bestimmtes Bild gemalt ist.
Der Befehl überprüft, ob ein bestimmtes bild, wenn es sich an dieser stelle befände mit einem anderen bild, das sich an einer anderen stelle befände, kollidiert.
Ob auf dem Bildschirm die Bilder wirklich dargestellt werden, ist dabei egal.
Ich hoffe, ich habe die Frage richtig verstanden Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group