problem mit rectsoverlap

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

affemitwaffel

Betreff: problem mit rectsoverlap

BeitragSa, Okt 23, 2010 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,
ich hab ma wida nen problem Wink
also ich möchte mit rectsoverlap prüfen ob die maus ein symbol berührt und dann gedrückt wird. das programm soll sich dann schließen. Mein code sieht so aus: Code: [AUSKLAPPEN]
   If RectsOverlap(mx,my,32,32, xs,ys,32,32) And MouseHit(1) Then
      End
   ElseIf RectsOverlap(mx,my,32,32, xl,yl,32,32) And MouseHit(1) Then
      End
   ElseIf RectsOverlap(mx,my,32,32, xr,yr,32,32) And MouseHit(1) Then
      End
   EndIf

Beim ersten if funktioniert es bei den beiden elseif funktioniert es nicht. Ich habe schon die variablen geprüft aber die passen alle.

Thunder

BeitragSa, Okt 23, 2010 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Speichere MouseHit(1) in der Hauptschleife in einer globalen Variable und prüfe statt MouseHit(1) die globale Variable ab.

mfg Thunder

PS: Ich würde für sowas nicht RectsOverlap verwenden.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

affemitwaffel

BeitragSa, Okt 23, 2010 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
thunder
was würdest du denn für ein befehl dafür benutzen?
edit: Thunder das funktioniert aber jetzt auch nicht wenn ich eine globale variable für mousehit nehme

Thunder

BeitragSa, Okt 23, 2010 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde selber eine Funktion schreiben:
BlitzBasic: [AUSKLAPPEN]
Function mousein%(x%,y%,w%,h%)
Return MouseX()>=x And MouseY()>=y And MouseX()<=x+w And MouseY()<=y+h
End Function


und dann mit dieser Funktion überprüfen ob die Maus in einem bestimmten bereich ist. Ich weiß ja nicht, wie effizient RectsOverlap programmiert ist, aber ich verwende immer die eigengebaute Funktion.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

affemitwaffel

BeitragSa, Okt 23, 2010 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Thunder danke an eine funktion habe ich noch garnciht gedacht ich werde es direkt mal ausprobieren...

BlaBlaBla

BeitragSo, Okt 24, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich habe ein ähnliches Problem wie affemitwaffel und habe versucht es mit Thunder's Vorschlag zu lösen, was allerdings nicht geklappt hat. Dies wird wohl darin liegen, dass ich erst vor wenigen Tagen mit Programmieren angefangen habe und ich mich deshalb noch nicht so gut auskenne. Also seit ein wenig nachsichtig wenn ihr meinen (wahrscheinlich) "guseligen" und falschen Code lest Wink Hier ist er:

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

Quadrat = LoadImage ("gfx/Quadrat.png")

DrawImage Quadrat,20,20   

Global x%=20
Global y%=20
Global w%=70
Global h%=70

Function mousein%(x%,y%,w%,h%)
   Return MouseX()>=x And MouseY()>=y And MouseX()<=x+w And MouseY()<=y+h
End Function

Text 80,80,mousein

WaitKey
End


Zur Veranschulichung füge ich noch ein kleines Bild ein:

user posted image

Dies ist nur ein kleiner Bildausschnitt des "Programms". Mein Ziel war es, eine "1" anstelle der Null anzeigen zu lassen, sobald man mit der Maus über das Quadrat kommt. Wo liegt mein Fehler? Oder habe ich sogar alles total falsch gemacht? Shocked

Ich bedanke mich schonmal im Vorraus für eure Hilfe,
MfG,
Bla³
 

Sterbendes Lüftlein

BeitragSo, Okt 24, 2010 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

Xeres

Moderator

BeitragSo, Okt 24, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Globale Variablen mit gleichem Namen wie Funktionsparameter sind quatsch.
Entweder verwendest du Globale, oder du übergibst der Funktion Parameter (wäre sinnvoll). Hierbei werden die Globalen aus der Funktion ausgeschlossen, da sie beim Start der Funktion als Lokale Variablen mit 0 initialisiert werden...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

FireballFlame

BeitragSo, Okt 24, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@BlaBlaBla:
Du hast den Function-Befehl nicht ganz richtig verstanden.
Die Parameter einer Funktion, x%,y%,w%,h% in deinem Fall, sind dazu da, globale Variablen zu vermeiden. Diese Parametervariablen existieren nur in der Funktion und deshalb musst du sie derselben übergeben, indem du sie hinter den Aufruf schreibst. Damit kannst du dir die Globals sparen.

Richtig wäre also: BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Quadrat = LoadImage ("gfx/Quadrat.png")

DrawImage Quadrat,20,20

Function mousein%(x%,y%,w%,h%)
Return MouseX()>=x And MouseY()>=y And MouseX()<=x+w And MouseY()<=y+h
End Function

Text 80,80,mousein(20,20,70,70)

WaitKey
End


Und @Thunder: RectsOverlap geht auch prima. BlitzBasic: [AUSKLAPPEN]
RectsOverlap(MouseX(),MouseY(),1,1,x,y,w,h)
macht genau dasselbe wie deine eigene Funktion.

BlaBlaBla

BeitragSo, Okt 24, 2010 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, Ihr habt mir schon sehr weitergeholfen Wink

@FireballFlame
Genau da lag mein Denkfehler. Jetzt wo man's so sieht erscheint's ganz logisch, aber aller Anfang ist schwer Very Happy
Allerdings gibt das Programm trotz einer Kollision immernoch eine 0 aus, welche in meinem Fall für "keine Kollision" steht. Sobald man die Maus über das Quadrat hält, sollte eine 1 erscheinen... Irgendwas mache ich immernoch falsch Embarassed Ich tüftle noch ein wenig weiter, aber falls noch einer einen Tipp hat: Immer her damit!

ToeB

BeitragSo, Okt 24, 2010 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Außerdem ist Rectsoverlap um das doppelte Schneller als deine Funktion :
Code: [AUSKLAPPEN]
Const Zahl = 10000

ms1 = MilliSecs()
For i = 1 To Zahl
   x = mousein( 100, 200, 300, 400 )
Next
time1 = MilliSecs() - ms1
time_1# = Float( time1 ) / Float( Zahl )

ms2 = MilliSecs()
For i = 1 To Zahl
   x = RectsOverlap(MouseX(), MouseY(), 1, 1, 100, 200, 300, 400 )
Next
time2 = MilliSecs() - ms2
time_2# = Float( time2 ) / Float( Zahl )


Print "MouseIn * "+Zahl+" : "+time1+"ms"
Print "Pro Funktion : "+time_1+"ms"
Print "Rectsoverlap * "+Zahl+" : "+time2+"ms"
Print "Pro Funktion : "+time_2+"ms"
Print
Print "~ Taste zum Beenden drücken ~"
FlushKeys() : WaitKey( )  : End


Function mousein%(x%,y%,w%,h%)
   Return MouseX()>=x And MouseY()>=y And MouseX()<=x+w And MouseY()<=y+h
End Function


Bei 10000 habe ich
Code: [AUSKLAPPEN]
MouseIn : 4ms
Rectsoverlap : 2ms


Nimm also lieber Rectsoverlap Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

affemitwaffel

BeitragSo, Okt 24, 2010 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@ blablabla
versuch mal Code: [AUSKLAPPEN]
kollision = RectsOverlap(MouseX(),MouseY(),1,1,x,y,w,h)
und dann Code: [AUSKLAPPEN]
Print kollision
,weil rectsoverlap gibt die werte 0 und 1 zurück 0 = keine kollision 1 = kollision

BlaBlaBla

BeitragSo, Okt 24, 2010 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@affemitwaffel Mit "ImagesCollide" oder "ImagesOverlap" geht das bei einem Button (oder ähnlichem) natürlich wunderbar. Das Problem dabei war jedoch, wie auch bei dir, dass es bei mehreren Buttons nicht mehr geht. "RectsOverlap" ging bei mir jetzt gar nicht. Leider weiß ich nicht woran's liegt, da ich wie gesagt gerade erst angefangen habe Embarassed

FireballFlame

BeitragSo, Okt 24, 2010 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
BlaBlaBla: Dann musst du deine Kollisionsprüfung in eine While- oder Repeat-Schleife stecken.
Momentan wird nur ein einziges mal auf Kollision geprüft, weil danach der WaitKey-Befehl kommt Wink
Wenn du immer wieder prüfen willst, ob Kollision stattfindet, muss dein Text-Befehl also in eine Schleife. Da du dann allerdings in der Schleife andauernd 1 oder 0 ausgibst, wird es unleserlich. Deshalb brauchst du in der Schleife auch noch Cls (um den Text wieder zu löschen), deinen DrawImage-Befehl (weil das Bild von Cls mitgelöscht wird) und Flip (damit es nicht flimmert).

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Quadrat = LoadImage("gfx/Quadrat.png")


While GetKey()=0
Cls
DrawImage Quadrat,20,20
Text 80,80,mousein(20,20,70,70)
Flip
Wend


End




Function mousein%(x%,y%,w%,h%)
Return MouseX()>=x And MouseY()>=y And MouseX()<=x+w And MouseY()<=y+h
End Function
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
  • Zuletzt bearbeitet von FireballFlame am So, Okt 24, 2010 22:41, insgesamt einmal bearbeitet

BlaBlaBla

BeitragSo, Okt 24, 2010 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code, den ich gepostet habe, stammt aus einem Testprogramm. Im eigentlichen Programm ist das Ganze in eine Schleife eingebunden Wink

Ein kleiner Ausschnitt:

BlitzBasic: [AUSKLAPPEN]
ElseIf ImagesCollide(Mouse,MouseX(),MouseY(),0,Finish,600,360,0) Then  

Repeat
Cls
DrawImage Background,0,0
DrawImage Mouse,MouseX(),MouseY()
DrawImage ButtonNext,475,250
DrawImage ButtonMenu,300,250
Text 400,300,"Gewonnen!"
Flip ;Die Schleife soll nun beendet werden, wenn der eine oder der andere Button geklickt wird. Mit einem klappts wunderbar, bei zwei Buttons reagiert nur einer.
Until ImagesCollide(Mouse,MouseX(),MouseY(),0,ButtonMenu,300,250,0) And MouseHit (1) Or ImagesCollide(Mouse,MouseX(),MouseY(),0,ButtonNext,475,250,0) And MouseHit (1)

EndIf

Flip
Until KeyHit(1)

FreeFont Font
WaitKey

End

FireballFlame

BeitragSo, Okt 24, 2010 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ImagesCollide für Mausabfragen ist eine schlechte Idee. Ein normaler Mauszeiger hat nur einen Punkt, mit dem man klickt, keine ganze Fläche. Nimm stattdessen entweder die mousein-Funktion oder RectsOverlap wie unten in meinem vorletzen Post.

Zu deinem eigentlichen Problem: Mehrfaches MouseHit in einer Schleife ist ebenfalls eine schlechte Idee Wink
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

BlaBlaBla

BeitragSo, Okt 24, 2010 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@FireballFlame
Ich werd's Morgen dann mal testen. Ich geb Bescheid, wenns geklappt hat (Ich denke aber schon, da der verlinkte Thread sehr vielversprechend aussah.) Danke für deine Hilfe und natürlich auch Danke an die anderen Wink

Danke,Danke,Danke Exclamation

MfG,
Bla³
 

affemitwaffel

BeitragMo, Okt 25, 2010 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetzt hab ich wida ein probelm Code: [AUSKLAPPEN]


Repeat

   xr = 768
   yr = 568
   
   xl = 32
   yl = 568
   
   xs = 768
   ys = 0

     mh = MouseHit(1)
      mx = MouseX()
   my = MouseY()

   DrawImage pfeilrechts, xr,yr
   DrawImage pfeillinks, xl,yl
   DrawImage schliessen, xs,ys
      DrawImage cursor, mx,my

   If mh And RectsOverlap (mx,my,1,1, xs,ys,32,32) Then
      End
   EndIf
      
   If mh And RectsOverlap (mx,my,1,1, xl,yl,32,32) Then
      End
   EndIf
   
   If mh And RectsOverlap (mx,my,1,1, xr,yr,32,32) Then
      End   
   EndIf
   
      Flip
      Cls
Until KeyHit(1)

so die erste und die letzte rectsoverlap abfrage funktioniert nur die mittlere nciht. Kann mir bitte einer helfen^^

Xeres

Moderator

BeitragMo, Okt 25, 2010 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Wozu die Variablen? Warum machst du nicht eine Funktion, der du Bild und x,y Koordinaten übergibst? Wenn du das Bilderzeichnen und die Abfrage auch noch so räumlich trennst und in einer anderen Abfolge verarbeitest, sieht man kaum noch durch...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

affemitwaffel

BeitragMo, Okt 25, 2010 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetz nochmal der code mit weniger varibablen^^
Code: [AUSKLAPPEN]
Repeat

     mh = MouseHit(1)
      mx = MouseX()
   my = MouseY()
        DrawImage pfeilrechts, 758,568
   DrawImage pfeillinks, 32,568
   DrawImage schliessen, 768,0
      DrawImage cursor, mx,my

   If mh And RectsOverlap (mx,my,1,1, 768,0,32,32) Then
      End
   EndIf
   
   If mh And RectsOverlap (mx,my,1,1, 32,568,32,32) Then
      End
   EndIf   

   If mh And RectsOverlap (mx,my,1,1, 758,568,32,32) Then
      End   
   EndIf
   
      Flip
      Cls
Until KeyHit(1)


edit: i wie sieht der code komisch aus in wirklichkeit sind die absätze nicht so komisch formatiert
edit2: mir ist grade aufgefallen,dass wenn ich die width und hight von der maus auf 32 stelle alles funktionier Code: [AUSKLAPPEN]
   If mh And RectsOverlap (mx,my,32,32, 768,0,32,32) Then
      End
   EndIf
   
   If mh And RectsOverlap (mx,my,32,32, 32,568,32,32) Then
      End
   EndIf   

   If mh And RectsOverlap (mx,my,32,32, 758,568,32,32) Then
      End   
   EndIf
KAnn mir einer sagen wieso das so ist???

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group