Maus Blockieren, wenn die Blöcke Kollidieren?
Übersicht

bruce85Betreff: Maus Blockieren, wenn die Blöcke Kollidieren? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo nochmal,
ich habe folgendes problem und zwar, habe ich 1 Type für die einzelne Blöcke erstellt und in diesem Type habe ich noch ein Array erstellt, die die Daten der einzelne Blöcke beinhaltet wie Frames etc. BlitzMax: [AUSKLAPPEN] 'Zugriff auf die Frames Somit bewege ich die Blöcke: BlitzMax: [AUSKLAPPEN] Block[z].XPos = MX-tmpMausX Es funktioniert alles ganz gut, aber wie kann ich die Maus so begrenzen, dass wenn ich einen Block bewege und die Maus in diese richtung automatisch blockiert, wenn ein Kollision mit einem anderen Block besteht die den Wert > wie 1 hat? Ich möchte einfach nicht, das man ein Block mit andere Blöcke überlappen kann. Wie mache ich ambesten die berechnung um dann auch die Maus dementsprechend in diese Richtung, wo die Kollision sich befindet, blockieren kann? Ich bedanke mich schonmal im Voraus. MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann mir darunter nichts vorstellen, aber: wenn du Blöcke nicht überlappen lassen willst, würde ich nicht den Umweg über die Maus gehen. | ||
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) |
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bin dabei ein Puzzle Spiel zu schreiben, daher muss ich das über die Maus regeln.
Ich hab jetzt mal Testweise was versucht, also wenn sich ein Block mit andere überlappt, das dieser dann gelöscht wird: BlitzMax: [AUSKLAPPEN] If MouseDown(1) Then Das Funktioniert schonmal, jetzt muss ich nur noch die Maus begrenzen, also das man die Maus dann nicht mehr in diese richtung weiter bewegen kann. Weiss einer von euch Vielleicht wie ich das ambesten hinbekomme? MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich gehe mal davon aus, dass deine Blöcke quadratisch sind.
Erstmal musst du berechnen, wo sich die Maus (relativ zum Block) befindet: BlitzMax: [AUSKLAPPEN] If MouseX() < Block.X Then 'Links vom Block Dann berechnest du den Abstand von der Maus und dem Block, also: BlitzMax: [AUSKLAPPEN] Function Abstand:Float(x1:Float, y1:Float, x2:Float, y2:Float) Wenn der Abstand kleiner ist als die Hälfte eines Blockdurchmessers, so liegt die Maus im Block. Dann musst du die Maus entsprechend "vor" den Block setzen. Da du ja weißt, wo sich die Maus relativ zum Block befindet, dürfte das kein Problem sein. Musst da einfach die Maus um ein paar Werte in die Richtung weiter verschieben. Am besten speicherst du die Position der Maus immer in einer Variable. Dann kannst du einfach die alte Position "wiederherstellen". lg, M0rgenstern |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank.
Ich glaube, ich lass des ambesten so wie es ist. Ich wollte das eigentlich nur machen, weil wenn ich z.B. Block 2 über Block 1 bewege, dann ist der Block 2 plötzlich hinter Block 1, weil es ja der Reihe nach gezeichnet wird. Gibt es Vielleicht einen einfachen befehl um z.B. Block 2 an erster stelle zu zeichnen? Ich habe das schon mit 2 Verschachtelte Schleifen versucht, aber dann Flackern die Blöcke kurz wenn die Blöcke dann wieder neu gezeichnet werden. Ich habe auch versucht die Type einträge neu zu erstellen, wenn 1 Block angeklickt und verschoben wird, dann habe ich den Block wo angeklickt wurde, als erstes erstellt. So hat das auch nicht richtig funktioniert. Danke schonmal. MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, um deinen momentan gewählten Block über allen anderen zu zeichnen, müsstest du ihn an die letzte Stelle des Arrays verschieben, da er dann als letzter bearbeitet und somit auch gezeichnet wird.
Das könntest du machen mit: BlitzMax: [AUSKLAPPEN] Function UpdateBlockArray:Int() Hoffe, dass dir das weiter hilft. Lg, M0rgenstern |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Dir.
Ich hab dein Code bei mir angepasst, das funktioniert, aber die Blöcke flackern dann kurz, wenn diese Funktion aufgerufen wird. BlitzMax: [AUSKLAPPEN] Function UpdateBlockArray:Int(MomentanerBlock:Int) Jetzt muss ich nur noch das Flackern der Blöcke beheben, wenn diese Funktion aufgerufen wird. Wie könnte man das machen? MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ich das gerade richtig sehe, ist die (zeitraubende) Schleife nicht nötig. Mit den Indizes sind die Blöcke eindeutig definiert.
BlitzMax: [AUSKLAPPEN] Function UpdateBlockArray:Int(MomentanerBlock:Int) |
||
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) |
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Dir.
Hab mich vertan, bekomme bei manchen Blöcke eine Fehlermeldung, also Array größe überschreitet das maximum etc. Wenn ich z.B. ein Block mit der Größe von 2*2 und Vielleicht danach ein Block mit der Größe von 3*3 anklicke, dann bekomme ich diesen Fehler. Naja, ich werde mal versuchen, ob ich das irgendwie beheben kann. Vielen Dank. Edit: Jetzt denke ich wieso ich eine Fehlermeldung bekomme, Grund: In der Schleife wo die Blöcke gezeichnet werden, rufe ich ja die Funktion auf, wenn die Maus auf einen der Blöcke geklickt wurde, wenn jetzt z.B. ein Block mit 2*2 ans ende verschoben wird und ein Block mit 3*3 am gemerkte stelle verschoben wird, dann denkt die Schleife irgendwie, das es immer noch die vorherige Feldgröße hat oder so und überschreitet dann die Größe vom Array. Ich habe einfach eine zusätzliche variable genommen und beim Klicken der Blöcke wird dann diese variable auf 1 gesetzt und am ende der Schleife rufe ich dann diese Funktion auf. Nun Funktioniert das ganze jetzt und ohne Flackern der Blöcke beim Klicken. Vielen Dank für die Hilfe. MfG |
||
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Xeres, hast Recht.
Ich dachte er hätte einen Zeiger auf die INstanz des momentanen Blocks. Habe nicht gesehen, dass er einfach über einen INteger drauf zugreift. Dann stimmt natürlich deine Methode. @bruce85: Du wählst ja, so wie ich das verstanden habe nur einen neuen Block aus, wenn du mit der Maus klickst. Das heißt, dass du die FUnktion zum Tauschen nur ein einziges Mal, nämlich wenn du die Maustaste drückst, aufrufen musst und nicht jedes mal wenn die Blöcke gezeichnet werden. Es ist klar, dass es dann kurz flackert. Deine Hauptschleife müsste also so aussehen: BlitzMax: [AUSKLAPPEN] Repeat So brauchst du keine zusätzliche Variable zu überprüfen etc. Lg, M0rgenstern |
||
bruce85 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hier ist mal ein Teil von meinem Code:
BlitzMax: [AUSKLAPPEN] Local Klick:Int=0 Damit funktioniert es auch, aber trotzdem vielen Dank. MfG |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group