Bildverschiebung begrenzen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Eyes_Only

Betreff: Bildverschiebung begrenzen

BeitragDo, Dez 06, 2012 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 06, 2012 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 06, 2012 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
 

PhillipK

BeitragDo, Dez 06, 2012 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz funkmaster5000 hat beim ersten das ">" verwendet, wobei "<" korrekt wäre:

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
If img_y + ImageHeight(img) > screenheight Then img_y = screenheight - ImageHeight(img) ;auch hier verdreht: Vorher: wen img_y + bildhöhe KLEINER fenstergröße, dann .. <- auch der gewünschte fall, ergo wiederrum immer wahr.

;DrawImage img,img_x,img_y
;Du kannst es so machen, schöner wäre es aber, wenn du in der Bildverschiebung das ganze änderst. Der verschiebungsfall tritt nicht so häufig auf, und dort wäre es korrekt aufgehoben. Heißt im klartext: DrawImage bleibt in deiner Zeichenroutine, die abfrage kommt NACH der verschiebe routine, aber immernoch im RECHTS WURDE GEDRÜCKT - fall =)
 

Eyes_Only

BeitragDo, Dez 06, 2012 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

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

BeitragFr, Dez 07, 2012 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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
         If bg_ypos < menuhoehe And bg_ypos+bg_height > screenheight Then bildy=bildy+(my-last_my)
liegen, da dies ja nur abfragt, ob der Hintergrund noch innerhalb der Grenzen ist.

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

BeitragFr, Dez 07, 2012 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Mfg - Shyiox
 

Eyes_Only

BeitragFr, Dez 07, 2012 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Sad

Was die Operatoren angeht habe ich schon diverse Möglichkeiten durchprobiert, leider ohne Erfolg.
 

Shyiox

BeitragFr, Dez 07, 2012 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, nicht ganz richtig erfasst.

BlitzBasic: [AUSKLAPPEN]
bildx=150
bildy=100

Dann musst du noch folgendes entfernen:

BlitzBasic: [AUSKLAPPEN]
;Bild(blauer Kasten) mit verschieben 
If bg_ypos < menuhoehe And bg_ypos+bg_height > screenheight Then bildy=bildy+(my-last_my)

Und das hier:

BlitzBasic: [AUSKLAPPEN]
;blauer Kasten
DrawImage bild,bildx,bildy

In das hier ändern:

BlitzBasic: [AUSKLAPPEN]
;blauer Kasten
DrawImage bild,bg_xpos+bildx,bg_ypos+bildy

Dann müsste eigentlich alles fehlerfrei funktionieren Smile

Mfg - Shyiox
 

Eyes_Only

BeitragFr, Dez 07, 2012 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
Danke nochmal Shyiox

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group