Logische abfrage, was ist falsch?
Item_Sek
- programmiertechnik
0 Matze
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
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
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.
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©
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
Hi Vinc,
mhh, habe ich jetzt recht oder nicht?
Verstehe nix mehr..... und bringt mich auch nicht wirklich weiter :(
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
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...........
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
EndIfsoll 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.
... 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
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