ImagesCollide fehlerhaft bei Types
Übersicht

![]() |
Dice of DarknessBetreff: ImagesCollide fehlerhaft bei Types |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() MfG, Dice of Darkness |
||
Gratis Spiele, Musik, Tools |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kein Bug - so arbeitet BB nunmal ![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Dice of Darkness |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group