problem mit rectsoverlap
Übersicht

affemitwaffelBetreff: problem mit rectsoverlap |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hi,
ich hab ma wida nen problem ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde selber eine Funktion schreiben:
BlitzBasic: [AUSKLAPPEN] Function mousein%(x%,y%,w%,h%) 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Thunder danke an eine funktion habe ich noch garnciht gedacht ich werde es direkt mal ausprobieren... | ||
![]() |
BlaBlaBla |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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: ![]() 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? ![]() Ich bedanke mich schonmal im Vorraus für eure Hilfe, MfG, Bla³ |
||
Sterbendes Lüftlein |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Text entfernt | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
@BlaBlaBla:
Du hast den Function ![]() 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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, Ihr habt mir schon sehr weitergeholfen ![]() @FireballFlame Genau da lag mein Denkfehler. Jetzt wo man's so sieht erscheint's ganz logisch, aber aller Anfang ist schwer ![]() 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 ![]() |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 "~ 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() |
||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlaBlaBla: Dann musst du deine Kollisionsprüfung in eine While![]() ![]() Momentan wird nur ein einziges mal auf Kollision geprüft, weil danach der WaitKey-Befehl kommt ![]() 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 ![]() ![]() BlitzBasic: [AUSKLAPPEN] Graphics 800,600,16,2 |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Code, den ich gepostet habe, stammt aus einem Testprogramm. Im eigentlichen Programm ist das Ganze in eine Schleife eingebunden ![]() Ein kleiner Ausschnitt: BlitzBasic: [AUSKLAPPEN] ElseIf ImagesCollide(Mouse,MouseX(),MouseY(),0,Finish,600,360,0) Then |
||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() Danke,Danke,Danke ![]() MfG, Bla³ |
||
affemitwaffel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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^^ |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
affemitwaffel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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
KAnn mir einer sagen wieso das so ist???
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group