Kollissionen Labyrinth

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Xeres

Moderator

BeitragSo, Jan 09, 2011 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Case 1 : x=x+1
Case 2 : x=x-1
Case 3 : y=y+1
Case 4 : y=y-1
End Select
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)
 

jörg111

BeitragSo, Jan 09, 2011 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 09, 2011 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 09, 2011 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 09, 2011 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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 vertraut zu machen.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am So, Jan 09, 2011 22:40, insgesamt einmal bearbeitet
 

jörg111

BeitragSo, Jan 09, 2011 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Smile

mpmxyz

BeitragSo, Jan 09, 2011 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Razz
mfG
mpmxyz
PS: Du hast das Besserwisserduell verloren! Wink
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

jörg111

BeitragMo, Jan 10, 2011 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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


Xeres

Moderator

BeitragMo, Jan 10, 2011 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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
If RichtungX < 0 = True Then
RoboterX=RoboterX+5
RichtungX=0
RichtungY=-1

ElseIf RichtungX > 0 = True Then
RoboterX=RoboterX-5
RichtungX=0
RichtungY=1

ElseIf RichtungY < 0 = True Then
RoboterY=RoboterY+5
RichtungY=0
RichtungX= ;<-- was vergessen?

ElseIf RichtungY > 0 = True Then
RoboterY=RoboterY-5
RichtungY=0
RichtungX=RichtungX*-1
EndIf
EndIf


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
T
HERE 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

BeitragDi, Jan 11, 2011 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Was bedeutet das?? Smile

Befehle zur je in eine Zeile Stecken


Wie kann man hier ein Bild hochladen?

Holzchopf

Meisterpacker

BeitragDi, Jan 11, 2011 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das soll wohl einfach bedeuten, dass man der Übersichtlichkeit zuliebe alle Befehle in eine separate Zeile schreiben soll Wink

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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

jörg111

BeitragDo, Jan 13, 2011 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
AUF XERES FRAGE:

So sieht das Labyrinth aus.



user posted image

Xeres

Moderator

BeitragMo, Jan 17, 2011 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

jörg111

BeitragDi, Jan 18, 2011 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragDi, Jan 18, 2011 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

jörg111

BeitragDi, Jan 18, 2011 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Welcher Befehl ist das?

Xeres

Moderator

BeitragDi, Jan 18, 2011 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group