Kollissionen Labyrinth
Übersicht

![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, zwei Richtsungsvariablen sind möglich - theoretisch reicht aber auch eine. Je nach dem, was du erreichen möchtest (oder dir sinnvoller erscheint)...
BlitzBasic: [AUSKLAPPEN] Select Robot_Richtung |
||
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) |
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Den Teil mit den Millisecs für zeitabhängige Richtungsänderung erst mal nicht beachten,kümmer ich mich später rum
erstmal würde ich gern wissen wo Fehler ist, Danke. Mit Fehler mein ich, wie macht man es damit Figur nicht nur rechts oder links sondern auch wenn sie nach rechts geht und kollidiert nach oben oder unten weitergeht, also nicht nur hin und her geht = links ... rechts... links...rechts bzw. oben...unten...oben...unten... sondern rechts... oben...links...unten Code: [AUSKLAPPEN] ;Startposition des Roboters RoboterX=300 RoboterY=299 ;Anfangsrichtung des Roboters RichtungX=1 RichtungY=0 ;Setzen der Transparentfarbe blau (Gänge des Labyrinths sind blau, Wände sind schwarz) MaskImage Labyrinth, 11,41,255 MaskImage Held,11,41,255 MaskImage Roboter,11,41,255 ;Start der Hauptschleife (Programm läuft bis ESC gedrückt wird) While Not KeyHit(1) ;Löschen des Bildschirms Cls ;*************************************************************************************** ;If MilliSecs() > ms + 5000 Then ;RichtungX=Rnd(0,10000) ;RichtungY=Rnd(0,10000) ;ms = MilliSecs() ;EndIf ;If RichtungX => 0 And Richtung=< 5000 Then RoboterX=RoboterX*-1 ;If RichtungX => 5001 Then RoboterX=RoboterX-1 ;Zeichnen des Labyrinths und des Helden und des Roboters DrawBlock Labyrinth,0,0:DrawImage Held,x,y:DrawImage Roboter,RoboterX,RoboterY RoboterX=RoboterX+RichtungX RoboterY=RoboterY+RichtungY If ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) = True Then RichtungX=RichtungX*-1 RichtungY=RichtungY*-1 Text 100,100,"Roboter kollidiert" EndIf |
||
- Zuletzt bearbeitet von jörg111 am So, Jan 09, 2011 16:44, insgesamt einmal bearbeitet
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du bei dem ImagesCollide bleiben willst ist eine Select-Konstruktion das erste was mir dazu einfällt. Du prüfst ob RichtungX bzw. Y größer oder kleiner 0 ist (damit weißt Du ja schonmal ob er links, rechts, rauf oder runter gelaufen ist) und kannst dann entscheiden wie es weitergehen soll. Sprich, er knallt rechts gegen das Labyrinth -> Bewegung nach rechts stoppen, auf die alte x-Position zurückstellen und nach oben laufen lassen. Sinngemäß gilt das auch für alle anderen Richtungen. | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Warum funktioniert es folgendermassen?
Wenn Bedingung hinter if nicht zutrifft, aber bedingung hinter elseif zutrifft, dann wird der Befehl hinter Elseif ausgeführt. So weit so klar. Aber lasse ich das else weg und schreib nur if dann geht zuerst nach rechts prallt gegen wand und dreht dann um nach links. Aber wenn er nun gegen wand prallt passiert nichts. variable wird nicht wieder auf +1 gesetzt und roboter läuft immer weiter nach links. zwei if anweisungen hintereinander müsste doch das gleiche rauskommen wie bei elseif oder??? Code: [AUSKLAPPEN] If ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) And RichtungX < 0 = True Then RichtungX=1 ElseIf ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) And RichtungX > 0 = True Then RichtungX=-1 Endif |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier ist das Problem, dass eine der in den Bedingungen vorkommenden Variablen verändert wird.
Wenn die erste Bedingung zutrifft, gibt es eine Kollision und der Roboter bewegt sich nach links. Nun wird seine Bewegungsrichtung geändert; er bewegt sich nach rechts. Wenn du nun die andere Bedingung überprüfen lässt, wird es wieder eine Kollision geben und die Bewegungsrichtung wird auch mit der Bedingung übereinstimmen, da sie ja jetzt in die andere Richtung zeigt. Daher wird der dort liegende Code auch ausgeführt und dem entsprechend wird die Bewegungsrichtung wieder nach links gesetzt. mfG mpmxyz PS: Damit du so etwas alleine merkst, empfehle ich dir, dich mit dem Befehl Stop ![]() |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am So, Jan 09, 2011 22:40, insgesamt einmal bearbeitet
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich weiss nicht ob du michrichtig verstanden hast.
Das funktioniert so schon richtig. Die Figur geht immer hin und her. Erst geht die Figur nach rechts (hab ich am Start eingestellt = RichtungX=+1)Aber die erste Bedingung ist nach links gehen und nicht nach rechts. ??? Wenn die Bedingung zutrifft gibts eine kollission?? Du meinst wohl, wenn es eine kollission gibt, dann trifft die Bedingung zu ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe aus Versehen die Richtungen vertauscht. Der Rest bleibt aber gleich.
Zu deinem zweiten Punkt: Das ist auch ein logisch korrekter Satz. Würde dort "Immer wenn, dann" stehen, wäre die Aussage nicht richtig. ![]() mfG mpmxyz PS: Du hast das Besserwisserduell verloren! ![]() |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hoffe ich hab die zweite If Bedingung mittels Kommentar gut genug erklärt, so ähnlich stelle ich mir das vor.
Die anderen Bedingungen sind so noch nicht richtig. Ich wollte das der Roboter sich im Labyrinth selbständig zurechtfindet, nur wenn er nach rechts geht und kollidiert klappt das mit dem nach unten gehen natürlich nur, wenn es dort auch weiter nach unten geht. Falls nicht, greift die Abfrage ob er nach unten geht und kollidiert . So dass er irgendwann wenn die Gänge ungünstig liegen, immer hin und her springt also hoch... runter oder links... rechts Wie programmiert man das, wenn die Gänge nicht so günstig liegen, wenn es also nicht immer in alle 4 Richtungen weitergeht, sondern an manchen Stellen z.b. beim nach links gehen eine Sackgasse ist und es nur nach rechts weitergeht und sonst in keine Richtung weitergeht? Dann kann ich ja nicht sagen gehe weiter nach oben oder unten Code: [AUSKLAPPEN] If ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) And RichtungX < 0 = True Then RoboterX=RoboterX+5:RichtungX=0:RichtungY=-1 ;Wenn Roboter kollidiert und gleichzeitig nach rechts geht, ;dann Roboter um 5 zurücksetzen, damit er genug Abstand von der Wand hat (sonst würde er wieder kollidieren) ;und Waagerechtes X auf 0 setzen (gegen diagonale Bewegung) und senkrechtes Y auf 1 setzen (Roboter bewegt sich nach unten) ElseIf ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) And RichtungX > 0 = True Then RoboterX=RoboterX-5:RichtungX=0:RichtungY=1 ElseIf ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) And RichtungY < 0 = True Then RoboterY=RoboterY+5:RichtungY=0:RichtungX= ElseIf ImagesCollide (Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) And RichtungY > 0 = True Then RoboterY=RoboterY-5:RichtungY=0:RichtungX=RichtungX*-1 endif |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erst mal: Funktionen die in jeder Bedingung sind ausklammern, Befehle nur je in eine Zeile Stecken. Das ist schneller und übersichtlicher:
BlitzBasic: [AUSKLAPPEN] If ImagesCollide(Roboter,RoboterX,RoboterY,0,Labyrinth,0,0,0) Then Ein echtes, perfektes (d.h. eine Wand ohne Unterbrechungen) Labyrinth kann man durchqueren, indem man sich stets links (oder rechts) hält. Meinst du sowas? Edit: "zur" -> "nur" |
||
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 Di, Jan 11, 2011 22:42, insgesamt einmal bearbeitet
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was bedeutet das?? ![]() Befehle zur je in eine Zeile Stecken Wie kann man hier ein Bild hochladen? |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das soll wohl einfach bedeuten, dass man der Übersichtlichkeit zuliebe alle Befehle in eine separate Zeile schreiben soll ![]() Und Bilder kannst du hier ganz einfach ins Archiv hochladen und im Beitrag mit Code: [AUSKLAPPEN] [img]http://URL_des_Bildes[/img] einbinden.
mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
AUF XERES FRAGE:
So sieht das Labyrinth aus. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nun, das ist zumindest kein perfektes Labyrinth.
Wie ist das Level aufgebaut, benutzt du eine Tilemap oder ist das ein Bild als Level? Letzteres ist nicht zu empfehlen. Ich würde in etwa diesen Algorithmus verwenden: - gehe in eine Richtung, bis du nicht mehr weiter kommst - Wähle eine neue Richtung, wähle die Richtung aus der du kommst als letztes. |
||
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) |
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Labyrinth ist ein einziges Bild. Mit Tilemaps hab ich noch nicht gearbeitet.
Wie programmiert man deinen Vorschlag?: - gehe in eine Richtung, bis du nicht mehr weiter kommst - Wähle eine neue Richtung, wähle die Richtung aus der du kommst als letztes. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am besten machst du dich mit Tilemaps vertraut. Dann kann man die den Spieler/Gegener umgebenen Tiles direkt prüfen. | ||
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) |
jörg111 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Welcher Befehl ist das? | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt keine MacheMirEinSpiel Funktionen. Suche danach - Robs RPG Tutorial u.ä. sollten die Richtige Anlaufstelle sein, wenn du das noch nie probiert hast. | ||
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group