Bildverschiebung begrenzen
Übersicht

Eyes_OnlyBetreff: Bildverschiebung begrenzen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Community,
ich habe ein Bild, welches die Bildschirmbreite ausfüllt und höher als der Bildschirm ist. Wenn ich mit rechts das Bild anklicke kann ich es (in Y-Richtung) verschieben. Dank bruZard habe ich dafür einen geeigneten Code gefunden. Ich will jedoch erreichen, dass das Bild nicht soweit geschoben werden kann, dass oben oder unten schwarze Ränder entstehen, d.h. das untere Bildende soll maximal bis Bildschirunterkannte und nicht höher geschoben werden können und das obere Bildende nicht tiefer als die Bildschirmoberkannte. Ich habe das ganze jetzt durch if-Abfragen begrenzt und wenn das obere oder untere Bildende über- oder unterhalb des Bildschirmrandes ist, wird das Bild einfach so gesetzt, dass es mit dem Rand abschließt. Wenn man jetzt jedoch das Bild verschieben möchte, entsteht so ein unschönes "Flackern", weil das Bild immer wieder zurück gesetzt wird. Jetzt meine Frage: Kann man die Bildverschiebung von vornherein so begrenzen, dass die Koordinaten nicht immer neu angepasst werden müssen, sodass das "Flackern" entfällt? Vielen Dank. Der Code ist so ausführbar: Code: [AUSKLAPPEN] Const screenwidth=1024
Const screenheight=768 Graphics screenwidth,screenheight,16,2 img_x=40 img_y=0 img_w=900 img_h=1148 img=CreateImage(img_w,img_h) SetBuffer ImageBuffer (img) Color 255,0,255 Rect img_x,img_y,img_w,img_h,1 SetBuffer BackBuffer() last_mx=0 last_my=0 Repeat Cls mx=MouseX() my=MouseY() If MouseDown(2) If mx>img_x And my>img_y And mx<img_x+img_w And my<img_y+img_h And img_y <= 0 And img_y+ImageHeight(img)>=screenheight Then img_y=img_y+(my-last_my) EndIf EndIf last_mx=mx last_my=my DrawImage img,img_x,img_y If img_y>0 Then img_y=0 If img_y+ImageHeight(img)<screenheight Then img_y = screenheight-ImageHeight(img) Flip Until KeyHit(1) End |
||
funkmaster5000 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mein Vorschlag auf den ersten Blick wäre, dass du zuerst die Koordinaten veränderst, bevor du das Bild zeichnest. Eventuell ist das schon deine Lösung:
Code: [AUSKLAPPEN] If img_y > 0 Then img_y = 0 If img_y + ImageHeight(img) < screenheight Then img_y = screenheight - ImageHeight(img) DrawImage img,img_x,img_y |
||
Eyes_Only |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oh je, das ist mir ja unangenehm... *Brett vor Kopf*
Da hätte ich auch selbst drauf kommen können/sollen... Ich danke dir jedenfalls vielmals funkmaster. Es funktioniert super! So wie es soll. ![]() |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nun noch n bissl feintuning, nämlich nicht beim zeichnen, sondern direkt nachdem du die verschiebung übertragen hast, und du bist fertig.
Einzig die abfrage solltest du selbst schreiben ![]() BlitzBasic: [AUSKLAPPEN] If img_y < 0 Then img_y = 0 ;vorher: if img_y GRÖßER 0. Ist doch der gewünschte fall, also immer wahr :X |
||
Eyes_Only |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Phillip.
Macht es für das Programm denn einen Unterschied, an welcher Stelle die Verschiebungskorrektur erfolgt, also beim Mouseevent oder vor der Zeichenroutine? Was die '<' und '>' Zeichen angeht, stimmen die schon so wie in meinem Code und wie von funkmaster wiedergegeben. ![]() Mal was anderes, dann muss ich keinen neuen Thread aufmachen. Es geht um Transparenz. Ich möchte am oberen Bildschirmrand gerne ein halbtransparentes Menü haben. Nun habe ich schon allerhand im Forum über Transparenz und Halbtransparenz gelesen, aber das war alles recht kompliziert und nicht ohne weiteres mit einfachen Mitteln realisierbar. Hat vlt. jmd. einen einfachen Lösungsweg wie ich ein halbtransparentes/durchscheinbares Menü realisieren kann oder ist das mit BB2D/B+ nicht so ohne Weiteres möglich? |
||
Eyes_Only |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich habe noch ein weiteres Problem. Wenn ich mit der rechten Maustaste den Hintergrund verschiebe, sollen sich die auf dem Hintergrund befindlichen Objekte mit verschieben. Ich habe dazu mal abstrakt einen blauen Kasten gemalt. Wenn ich jedoch die Maus nach unten ziehe und das Bild runter wandert und der Hintergrund an der oberen Grenze angekommen ist und man diese ganze Bewegung jetzt ein par mal macht, wandert der Kasten allmählich nach oben und ist irgendwann aus dem Bild verschwunden. Hat jmd. eine Idee, woran das liegen könnte? Meiner Meinung nach kann es nicht hieran Code: [AUSKLAPPEN] ;Bild(blauer Kasten) mit verschieben
liegen, da dies ja nur abfragt, ob der Hintergrund noch innerhalb der Grenzen ist.
If bg_ypos < menuhoehe And bg_ypos+bg_height > screenheight Then bildy=bildy+(my-last_my) Code einfach kopieren und ausführen: Code: [AUSKLAPPEN] Const screenwidth=1024
Const screenheight=768 Const menuhoehe=100 Graphics screenwidth,screenheight,16,2 ;Hintergrund als Bild erstellen bg_xpos=50 bg_ypos=menuhoehe bg_width=900 bg_height=1148 img=CreateImage(bg_width,bg_height) SetBuffer ImageBuffer (img) Color 255,0,255 Rect bg_xpos,0,bg_width,bg_height,1 ;blauen Kasten als Bild erstellen bildx=200 bildy=200 bildw=100 bildh=100 bild=CreateImage(bildw,bildh) SetBuffer ImageBuffer(bild) Color 0,0,255 Rect 0,0,bildw,bildh,1 SetBuffer BackBuffer() ;temporäre Mauskoordinaten last_mx=0 last_my=0 Repeat Cls ;Hintergrund malen DrawImage img,bg_xpos,bg_ypos mx=MouseX() my=MouseY() ;Rechtsklickroutine; If MouseDown(2) If mx>bg_xpos And my>bg_ypos And mx<bg_xpos+bg_width And my<bg_ypos+bg_height And bg_ypos <= menuhoehe And bg_ypos+bg_height>=screenheight Then ;Hintergrund verschieben bg_ypos=bg_ypos+(my-last_my) ;Hintergrund anpassen, wenn Koordinaten außerhalb des Bereichs If bg_ypos > menuhoehe Then bg_ypos = menuhoehe If bg_ypos + bg_height< screenheight Then bg_ypos = screenheight - bg_height ;Bild(blauer Kasten) mit verschieben If bg_ypos < menuhoehe And bg_ypos+bg_height > screenheight Then bildy=bildy+(my-last_my) EndIf EndIf last_mx=mx last_my=my ;blauer Kasten DrawImage bild,bildx,bildy ;Menü Color 255,255,255 Rect 175,0,700,100,1 Color 0,0,0 Text 275,50, "Menue" Flip Until KeyHit(1) End Danke! |
||
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auf den ersten Blick würde ich sagen, dass du einen Fehler bei den ">", "<", ">=" und "<=" Operatoren gemacht hast.
Wo genau, kann ich dir leider nicht sagen, aber ich denke das es damit zu tun hat, dass du den Hintergrund sozusagen auf eine Position "zurückspringen" lässt, wenn er außerhalb des Limits geraten sollte. Vermutlich passt dann irgendwo das "zurückspringen" des Blauen Quadrates nicht dazu - meiner Meinung nach, wenn man den Hintergrund etwas hochschiebt und wieder runter schiebt bis man an das "Menü-Limit" kommt. Entweder probierst du das irgendwie zu beheben oder du probierst mal folgende Möglichkeit: Das Position des Blauen Quadrats bekommt keine absolute (also eigene von anderen Bilder unabhängige) Variable, sondern eine relative (von einem Bezugspunkt abhängige) Variable. Soll im Klartext heißen, dass du du den Hintergrund wie ein eigenes "Fenster" behandelst, dessen Koordinaten-Ursprung an der oberen linken Ecke liegt. Nun speicherst du in der "bildx" und "bildy" Variable einfach den Abstand zu diesem, anstatt die eigene Position des Quadrats. Und schon kann es keine Fehler mehr bei der Verschiebung zwischen dem Hintergrund und dem Quadrat geben, da die Position des Quadrats ja nun abhängig von der Position des Hintergrunds ist. Ich hoffe ich konnte dir helfen ![]() Mfg - Shyiox |
||
Eyes_Only |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dank dir erstmal.
Meinst du mit relativen Werten und Abstand das hier? Code: [AUSKLAPPEN] bildx=bg_xpos+150
bildy=bg_ypos+100 Das funktioniert leider auch nicht. ![]() Was die Operatoren angeht habe ich schon diverse Möglichkeiten durchprobiert, leider ohne Erfolg. |
||
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, nicht ganz richtig erfasst.
BlitzBasic: [AUSKLAPPEN] bildx=150 Dann musst du noch folgendes entfernen: BlitzBasic: [AUSKLAPPEN] ;Bild(blauer Kasten) mit verschieben Und das hier: BlitzBasic: [AUSKLAPPEN] ;blauer Kasten In das hier ändern: BlitzBasic: [AUSKLAPPEN] ;blauer Kasten Dann müsste eigentlich alles fehlerfrei funktionieren ![]() Mfg - Shyiox |
||
Eyes_Only |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe es jetzt gelöst.
In der Rechtsklickroutine habe ich jetzt statt Code: [AUSKLAPPEN] ;Bild(blauer Kasten) mit verschieben
If bg_ypos < menuhoehe And bg_ypos+bg_height > screenheight Then bildy=bildy+(my-last_my) das hier geschrieben: Code: [AUSKLAPPEN] ;Bild(blauer Kasten) mit verschieben
bildy=bg_ypos+100 Jetzt habe ich einen relativen? Wert der immer abhängig von der Y-Pos des Hintergrundes ist. EDIT: Deine Variante ist auch gut Shyiox, vielleicht sogar noch eleganter und man spart sich ein bisschen Code. ![]() Danke nochmal Shyiox |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group