Item_Sek: Logische abfrage, was ist falsch?

Hallo liebe Web-Programmierer/Entwickler,

ähm, ich habe da so ein kleines problem mit einer logischen abfrage.
und zwar, ich möchte einen punkt in einem raum wandern lassen und sobald dieser dann die "wände" (Bildschirmrand) berührt soll er die richtung wechseln, aber in der richtigen richtung.

Der raum hat eine größe von 1024px -X/Breite- und 768 -Y/Höhe- ,
ich habe zur visuellen ünterstützung an allen vier bildschirmseiten eine "wand" mit einer dicke von 30px gezeichnet, also habe ich folgenden bereich zur verfügung:

X von 30 bis 1024-30px
Y von 30 bis 768-30px

Kommt der punkt von x y und berührt als erstes y soll er in richtung -y "abtrumpfen" aber in richtung x weiter fliegen bis x (also 1024-30px) erreicht ist.

Einfach gesagt, eine art ping-pong ball der im raum hin und her fliegt.

Aber ich bekomme nicht die abfrage und den richtungswechsel auf die reihe.

  
; ### Variablen der größe des BS und Startpunkt ###  
  
breite=30  
width=1024  
height=768  
x=1024/2  
y=768/2  
  
; ### Bewegungsrichung ###  
  
bx=-1  
by=-1  
Repeat  
 ExamineKeyboard()  
 ExamineMouse()  
 StartDrawing(ScreenOutput())  
 FrontColor(RGB(255,255,180))  
 BackColor(RGB(100,100,100))  
 DrawingMode(#PB_2DDrawing_Transparent)  
  x=x+bx  
  y=y+by  
  
  ; ### Zeichne die Wände (30px dick am Bildschrimrand) ###  
  
  Box(0,0,w,b)  
  Box(0,h-30,w,b)  
  Box(0,0,b,h)  
  Box(w-30,0,b,h)  
  
  ; ### Abfrage ###  
  
  
  If y<=30  
   by=1  
   Else  
   by=-1  
  EndIf  
  
  If y>=768-30  
   by=-1  
   Else  
   by=1  
  EndIf  
  
  If x<=30  
   bx=1  
   Else  
   bx=-1  
  EndIf  
  
  If x>=1024-30  
   bx=-1  
   Else  
   bx=1  
  EndIf  
  
  ; ### Lasse mir die aktuellen x y werte anzeigen  
  
  DrawText(0,0,"x y:"+Str(x)+" "+Str(y),RGB(0,0,0))  
  
  ; ### Zeichne den Ball  
  
 Circle(x,y,10)  
 StopDrawing()  
 FlipBuffers()  
 ClearScreen(0)  

Wenn z.B y seinen max wert hat, soll er wieder runtergehen/zählen, dass passiert mit by, entweder by=1 oder by=-1 dieser wert wird dann der wirklichen y variable übergeben y=y+by, dass gleich mit x.

Der Ball geht zwar nicht durch die wand, trumpft aber auch nicht ab.... und ich begreife nicht warum......

Ich hoffe das mit jemand von euch einen kleinen tritt in die richtige richtung geben kann, thx.!

Item_Sek

  1. Hallo,

    mal zum besseren Verständniss:
    du willst einen Punkt nicht durch einen Raum bewegen, sondern über eine Fläche!
    Das ist ein himmelweiter Unterschied.

    Grüße, Matze

    1. Hallo,

      mal zum besseren Verständniss:
      du willst einen Punkt nicht durch einen Raum bewegen, sondern über eine Fläche!
      Das ist ein himmelweiter Unterschied.

      Grüße, Matze

      Jein, ist ja ein raum, ein 2D Raum da es ja x und y gibt.

      1. Moin Item_Sek,

        du willst einen Punkt nicht durch einen Raum bewegen, sondern über eine Fläche!
        Das ist ein himmelweiter Unterschied.

        Jein, ist ja ein raum, ein 2D Raum da es ja x und y gibt.

        Nope. Raum

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. Hallo

          Jein, ist ja ein raum, ein 2D Raum da es ja x und y gibt.

          Richtige Begründung! Siehe Euklidischer Raum, dieser Spezialfall
          wird bereits im ersten Abschnitt genannt.

          Nope.

          Nope :-)

          Freundliche Grüße

          Vinzenz

          1. Hi Vinc,

            mhh, habe ich jetzt recht oder nicht?
            Verstehe nix mehr..... und bringt mich auch nicht wirklich weiter :(

            1. Hallo

              mhh, habe ich jetzt recht oder nicht?

              Deine Begründung war richtig, Räume können auch zwei Dimensionen haben ...

              Verstehe nix mehr..... und bringt mich auch nicht wirklich weiter :(

              Dein Beispiel sieht nach einem Basic-Dialekt aus, könntest Du Deine
              Programmiersprache exakt angeben?

              Was passiert genau, wenn Dein Ball eine Wand erreicht?

              Freundliche Grüße

              Vinzenz

              1. Hallo,

                ja genau, es handelt sich um PreBasic, ein mix aus C und Basic.
                Wenn du Interesse hast meinen Quellcode mal auszuprobieren, kann man sich PureBasic hier auf der hersteller Seite die voll funktionsfähige Demo herunterladen.
                Der nachteil der Demo, kein API zugriff und es sind nur 800 zeilen die kompiliert werden dürfen, deshalb musste ich mir die Vollversion besorgen... naja, ich gleite mal wieder voll ab.
                So, der Ball erreicht einen rand, und rutscht in die nächste ecke, da bleibt er dann stehen. Total komisches verhalten, da ich ja mit z.B

                If y<=30
                   by=1
                   Else
                   by=-1
                EndIf

                sage, dass wenn y kleiner als 30 ist, die variable by=1 gestellt wird damit diese dann wieder zugewiesen werden kann: y=y+by
                Erreicht y den unteren rand, in meinem fall 768-30px:
                If y>=768-30
                   by=-1
                   Else
                   by=1
                EndIf

                soll die variable by auf -1 gestellt werden, dass wird wieder y zugewiesen: y=y+by, hier würde y dann wieder herunter gezählt und der Ball/Punkt wandert zurück...

                Aber irgendwie klappt das nicht...........

                1. Yerf!

                  sage, dass wenn y kleiner als 30 ist, die variable by=1 gestellt wird damit diese dann wieder zugewiesen werden kann: y=y+by
                  Erreicht y den unteren rand, in meinem fall 768-30px:
                  If y>=768-30
                     by=-1
                     Else
                     by=1
                  EndIf

                  soll die variable by auf -1 gestellt werden, dass wird wieder y zugewiesen: y=y+by, hier würde y dann wieder herunter gezählt und der Ball/Punkt wandert zurück...

                  Aber irgendwie klappt das nicht...........

                  Eigentlich klar, wenn man sich den folgenden Durchlauf anschaut:

                  1. by=1 dadurch wird y=738 deine Abfrage macht by=-1
                  2. by=-1 dadurch wird y=737 deine Abfrage macht by=1
                  3. siehe 1

                  Du suchst wohl eher ein

                  If y>=768-30
                     by=-1*by
                  EndIf

                  Damnit wird bei Wandberührung einmalig das Vorzeichen getauscht.

                  Gruß,

                  Harlequin

                  PS: weils mir grad noch vorm Abschicken einfällt: in deiner Variante einfach die Else-Zweige weglassen führt wohl zum gleichen Ergebnis.

                  1. Hallo,

                    ähmmmm... peinlich, stimmt und klappt! Danke dir!

          2. ... und hier etwas für die Freunde der nicht-euklidischen Geometrie: Rollt ein Ball um die Ecke und fällt um .... ha ha ha ha

            sorry, den konnte ich mir einfach nicht verkneifen ;)

            ciao, schönen abend zusammen!

            Frank

          3. Hallo,

            Richtige Begründung! Siehe Euklidischer Raum, dieser Spezialfall
            wird bereits im ersten Abschnitt genannt.

            Gut, was Unterscheidet dann eine Fläche von einem Euklidisches Raum?
            Oder ist eine Fläche automatisch auch ein Euklidischer Raum?
            Und umgedreht?

            Grüße, Matze