Bild verändern wenn Maus drüber fährt?!? Bitte um Hilfe!

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

powerfritz

Betreff: Bild verändern wenn Maus drüber fährt?!? Bitte um Hilfe!

BeitragSo, Jun 03, 2007 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

bin noch sehr neu (sowohl im Forum als auch BB), und ich habe gestern begonnen ein Menü für unser Spiel zu machen. Hintergrundbild und Buttons hab ich schon (Musik auch). Nun meine Frage: Wie kann ich nun machen, dass wenn die Maus über einen bestmimten Button (z.B. dem "Spiel Starten"-Bild) drüberfährt, eine andere Textur geladen wird, nud wenn man wieder wegfährt, wieder die alte erscheint? Also einfach so ein aufleuchteffekt beim drüberfahren (die anderen texturen hab ich schon)...

Dann noch eine Frage: Wie kann ich den alternativen Windows-Mauszeiger abschalten? Denn wenn ich mit so einem Code mache, dass eine bestimmte Textur die Maus verfolgt, sieht das ziemlich blöd aus, wenn sowohl Windows-Maus als auch eigene Maus da sind...

Bin für jede Hilfe dankbar!

Christoph

BeitragSo, Jun 03, 2007 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:hidepointer


zu deiner ersten Frage:

1. man muss wissen, wo das bild ist (x|y)
2. man muss wissen, wie breit|hoch das bild ist (ql:imagewidth|ql:imageheight)
3. man muss wissen, wo die maus gerade ist (ql:mousex|ql:mousey)

Dann kannst du durch eine einfache If-Then-Else Struktur deine (natürlich vorher mit ql:loadimage geladenen) Bilder dementsprechend mit ql:drawimage einzeichnen
 

powerfritz

BeitragSo, Jun 03, 2007 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, .. bild is bei 400|400, breite/höhe: 300|35, und was meinst du wo maus gerade ist?

und wie würde diese bedingung ungefähr aussehen?
Ich kann mir irgendwie nix vorstellen? etwas mit If ??? Then Delete altevar And DrawImage neuevar oder so??

pile

BeitragSo, Jun 03, 2007 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If MouseX()>=400 and MouseX()<=800 and MouseY()>300 and MouseY()<=335 [b]then[/b] Drawimage Pic2,400,300

So ungefähr, du mußt es natürlich an deinen Code anpassen.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Smily

BeitragSo, Jun 03, 2007 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
mousex() x-koordinate der maus
mousey() y-koordinate der maus

also:
- Du weist, wo dein Bild ist
- Du weist, wo die Maus ist
- Du kennst die Abmessungen des Bildes.

Du willst folgendes:
Code: [AUSKLAPPEN]
WENN [maus innerhalb des bildes] DANN
  [Anderes Bild zeichnen]
SONST
 [Bild Zeichnen]


hilft dir das weiter? Wink

Edit: Pile war schneller ^^
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

pile

BeitragSo, Jun 03, 2007 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollten andere in meinen Code auch das "then" auch mit diesem b in eckigen Klammern sehen können, das war nicht meine Absicht, das Wort sollte einfach nur fett geschrieben werden. ALso bitte den Code ohne die b in den Klammern verwenden.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%
 

powerfritz

BeitragSo, Jun 03, 2007 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
So, VIELEN DANK für die Hilfe, aber irgendwie scheint da was nicht zu funktionieren!
Ich habe folgenden Code eingefügt, trotzdem ändert sich nichts wenn ich über das Bild fahre:

Code: [AUSKLAPPEN]
If MouseX()>=400 And MouseX()<=800 And MouseY()>=300 And MouseY()<=335 Then DrawImage (pic2,400,400, 0)


Davor habe ich die anderen DrawImage Befehle der Buttons usw.
Gehört die der If Code vl. außerhalb dem Graphics Modus oder so? Jedenfalls funzts i-wie noch ned... [/code]

darth

BeitragSo, Jun 03, 2007 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
dim bild(1)
 bild(0)=loadimage("bild1.jpg")
 bild(1)=loadimage("bild2.jpg")

while not keyhit(1)
 drawpicture bild(rectsoverlap(mousex(),mousey(),1,1,x,y,imagewidth(bild(rand(0,1))),imageheight(bild(rand(0,1))))),x,y
 flip 0 : cls
wend : end

das absolut genialste Razz
Diese Signatur ist leer.
 

powerfritz

BeitragSo, Jun 03, 2007 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
nochmals thx, aber irgendwie funzt deiner ned so^^

achja und, ich habs jetzt geschafft dass das bild aufleuchtet, aber jetzt schaff ichs ned dass es wieder normal wird. ich hab zwar "Else DrawImage pic1,400,400,0 gemacht, scheint aber immer noch ned so ganz zu klapenn Sad

BladeRunner

Moderator

BeitragSo, Jun 03, 2007 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Poste doch bitte mal Deinen gesamten Code den Du bislang dafür hast.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

powerfritz

BeitragSo, Jun 03, 2007 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ok.. möchte aber noch anmerken, dass ich das mim leuchten irgendwie mit einer repeat schleief und der if bedingung hinbekommen habe^^ naja egal..

Code: [AUSKLAPPEN]
;Variablen

Global cursor
Global feldleer1
Global feldleer1_2
Global feldleer2
Global feldleer2_2
Global feldleer3
Global feldleer3_2
Global XFiles

hintergrundmusik = LoadSound("X-Files Theme.mp3") ;Hintergrundmusik
channel = PlaySound(hintergrundmusik)


Graphics 1024, 768

feldleer1 = LoadImage("feldleer1.png") ;diese komischen feldleers sind die menübuttons
feldleer1_2 = LoadImage("feldleer1_2.png")
feldleer2 = LoadImage("feldleer2.png")
feldleer2_2 = LoadImage("feldleer2_2.png")
feldleer3 = LoadImage("feldleer3.png")
feldleer3_2 = LoadImage("feldleer3_2.png")


;Mauszeigercode in Kommentare gesetzt, da er irgendwie ned ganz funzt
;SetBuffer BackBuffer()
;fuellercursor=LoadImage("cursor.png")
;While Not KeyHit(1)
;Cls
;DrawImage cursor,MouseX(),MouseY()
;Flip
;Wend


hintergrundbild = LoadImage("world1.png") ;Hintergrundbild
TileImage hintergrundbild, 0, 0

XFiles = LoadFont("X-Files", 10, 1, 0, 0) ;Schriftart
SetFont XFiles

Locate 885, 730
Print "made by ..."

DrawImage (feldleer1, 400, 400, 0) ;Die Menübuttons
DrawImage (feldleer2, 400, 450, 0)
DrawImage (feldleer3, 400, 500, 0)

Repeat DrawImage feldleer1,400,400,0 Until MouseX()>=400 And MouseX()<=800 And MouseY()>=400 And MouseY()<=435 ;der seltsame code ders irgendwie zum leuchten bringt^^
If MouseX()>=400 And MouseX()<=800 And MouseY()>=400 And MouseY()<=435 Then DrawImage feldleer1_2,400,400,0  Else DrawImage (feldleer1,400,400,0)

Repeat DrawImage feldleer2,400,450,0 Until MouseX()>=400 And MouseX()<=800 And MouseY()>=450 And MouseY()<=485
If MouseX()>=400 And MouseX()<=800 And MouseY()>=450 And MouseY()<=485 Then DrawImage feldleer2_2,400,450,0  Else DrawImage (feldleer2,400,450,0)

Repeat DrawImage feldleer3,400,500,0 Until MouseX()>=400 And MouseX()<=800 And MouseY()>=500 And MouseY()<=535
If MouseX()>=400 And MouseX()<=800 And MouseY()>=500 And MouseY()<=535 Then DrawImage feldleer3_2,400,500,0  Else DrawImage (feldleer3,400,500,0)



WaitKey
End



Hoffe ihr verstehts ihn?

edit: mit den repeat schleifen gehts zwar, aber dafür muss zuerst das erste bild mal aufgeblinkt sein, bis das 2. aufblinken kann... ich sollte die schleifen wohl rausgeben^^

BladeRunner

Moderator

BeitragSo, Jun 03, 2007 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code kann so nicht funktionieren. Versuch Dir selbst vor Augen zu führen was er macht: Du malst einmal die drei buttons. Dann wiederholt das Programm solange den Zeichnen-Befehl des ersten Buttons bis du drüber bist.
DANACH wiederholt des solange den Zeichnen-Befehl für den zweiten button etc.

Zu Beginn deines Programmes hast Du eigentlich die Lösung stehen, nur leider auskommentiert. Da gibt es die Hauptschleife, in der der cursor gezeichnet wird. In dieser Hauptschleife muss ALLES an Zeichenlogik stehen, und zwar in der Zeihenfolge wie es gezeichnet werden soll. (Spich: der Mauszeiger zuletzt, da er ja zuoberst sein soll.)
In dieser Hauptschleife musst du auch mittels if-then prüfen ob ein Bild zu zeichnen ist oder nicht. Es bedarf keiner weiteren Schleife darin. Dadurch dass die Hauptschleife zig mal in der Sekunde läuft wird das Bild schon korrekt gezeichnet.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

pile

BeitragSo, Jun 03, 2007 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
DrawImage (pic2,400,400, 0)

wußte gar nicht das man das auch so schreiben kann, ist das nicht umständlicher weil man da immer die Klammern setzen muss?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

The_Nici

BeitragSo, Jun 03, 2007 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht wäre es hilfreich, die Abfrage in eine Schleife zu packen.
 

Lador

BeitragSo, Jun 03, 2007 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich habs immer so gemacht (hat man dir schon fast alles so gesagt):

Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()

;Bilder laden etc.

Repeat
 Cls
 ;Bilder zeichnen
 mx = MouseX()
 my = MouseY()
 If mx > 400 And mx < 600 And my > 100 And my < 150 Then
  DrawImage bild2, 400,100
 Else
  DrawImage bild1, 400,100
 Endif
 ;Dann machste desselbe mit den andren 2 Buttons
 Flip
Until KeyDown(KEY_ESCAPE)
End


Man könnte auch ne Function machen, dann müssen mx und my aber global sein! zb so:

Code: [AUSKLAPPEN]
Function button_zeichnen (bild1, bild2, x, y, breite, hoehe)
 mx = MouseX()
 my = MouseY()
 If mx > x And mx < x+breite And my > y And my < y+hoehe Then
  DrawImage bild2, x, y
 Else
  DrawImage bild1, x, y
 EndIf
End Function


Verwendung, zb:

Code: [AUSKLAPPEN]
...
button_zeichnen (button1, button2, 400, 100, 300, 150)



Ich hoffe mal des funzelt und alle Fragen sind beantwortet^^.
 

powerfritz

BeitragSo, Jun 03, 2007 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank Lador,

dein 1. Code funktioniert zwar, aber 1. irgendwie überfordert er das system und 2.) wie kann man das bei mehreren bildern machen? sponst würdens ja nach wie vor mehrerer repeat schleifen sein... edit: ok hab ich doch hingekriegt, fehlt nur noch die funktion^^

deine funktion funzt irgendwie ned, also ich weiß ned obs funzt, aber er meldet immer das etwas fehlt (also Endif, dann mach ich ein Endif und er will ein if etc.)

BladeRunner

Moderator

BeitragMo, Jun 04, 2007 6:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ladors Code funzt einwandfrei, wenn man 2 Dinge weiss:
er benutzt KEY_ESCAPE. Das ist ein Schlüsselwort aus BMax welches so bei BB nicht existiert. Daher kannst Du das Programm nicht wirklich gut abbrechen.
Ersetze das mit KEY_ESCAPE durch 1 - dann funktioniert das.

zum anderen, und hier wiederhole ich mich: Alle Zeichenbefehle müssen in die selbe Schleife. Selbst Lador schreibt das mit einem Kommentar in dem Code den er dir gab.
Eine 2e Repeat ist nicht nötig, denn alle Grafik wird zeitgleich dargestellt, nicht nacheinander. Denk nochmal darüber nach. Was im Code in einzelnen Schleifen getrennt ist wird es auch beim Laufen sein. Was spricht gegen eine zweite if-then in der selben Schleife ? - Eigentlich doch nichts, oder ? Und wenn Du es so machst wird es auch funzen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mas93

BeitragMo, Jun 04, 2007 8:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Ich mach wahrscheinlich immer die unschoenste weise, dafuer aber einfache^^

-Nimm als maus einfach ein bild und mal das an mousex() und mousey()
-Die kollision wuede ich dann mit imagescollide machen also:

Code: [AUSKLAPPEN]

If images collide(mausbild,mousex(),mousey(),0,button,buttonx,buttony,0)then drawimage overlay,buttonx,buttony (DIE TEXTUR DIE BEI KOLLISION ANGEZEIGT WERDEN SOLL)


mfg
Marius
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]
 

Lador

BeitragMo, Jun 04, 2007 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, also mit den Kollisionsbefehlen würde ich das nicht machen, da sie langsamer sind als wenn man es über MouseX() und MouseY() berechnet. Und sorry wegen KEY_ESCAPE, bin seit paar Wochen auf BMax umgestiegen^^.

MFG Lador

Rongo Matane

BeitragMo, Jun 04, 2007 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
mas93 hat Folgendes geschrieben:
Also Ich mach wahrscheinlich immer die unschoenste weise, dafuer aber einfache^^

-Nimm als maus einfach ein bild und mal das an mousex() und mousey()
-Die kollision wuede ich dann mit imagescollide machen also:

Code: [AUSKLAPPEN]

If images collide(mausbild,mousex(),mousey(),0,button,buttonx,buttony,0)then drawimage overlay,buttonx,buttony (DIE TEXTUR DIE BEI KOLLISION ANGEZEIGT WERDEN SOLL)


mfg
Marius


das is aber keine tolle Lösung, finde ich zumindest. Da gibts auch Kollisionen wenn der Mauszeiger garnicht richtig drauf ist, sprich zB mit der unteren Rechten Kante, die andere Lösung mit dem mousex(),mousey,1,1 und rectsoverlap is da genauer. Und schneller, denk ich^^

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group