Funktion Funktioniert nicht...

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

mrtpcag

Betreff: Funktion Funktioniert nicht...

BeitragSa, Feb 13, 2010 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum funktioniert die Click-Abfrage mithilfe dieser funktion nur beim Firefox??:

BlitzBasic: [AUSKLAPPEN]

Graphics3D 800,600,0,2

While Not KeyHit(1)
;[...]
If CheckMouse(60,460,150,550,1) Then
ExecFile(FirefoxExe$)
EndIf

If CheckMouse(260,460,350,550,1) Then
ExecFile(MSInternetexplExe$)
EndIf
;[...]
Rect 55,455,100,100,0
Rect 155,455,100,100,0
Rect 255,455,100,100,0
Flip
Wend

Function CheckMouse(XStart%,YStart%,XEnd%,YEnd%,MouseButton%)
If MouseButton% = 0 Or MouseHit(MouseButton%) And MouseX()>=XStart% And MouseY()>=YStart% And MouseX()<=XEnd% And MouseY()<=YEnd% Then
Return True
Else
Return False
EndIf
End Function

Holzchopf

Meisterpacker

BeitragSa, Feb 13, 2010 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil MouseHit nur die Anzahl Anschläge seit dem letzten Aufruf ebendieser Funktion zurückgibt. Speichere Anfangs der Hauptschleife die benötigten *Hit-Funktionsrückgabewerte in globalen Variablen und führe danach sämtliche Überprüfungen mit diesen Variablen durch.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

mrtpcag

Betreff: @Holzchopf ...Und wo soll da der unterschied liegen...?

BeitragSa, Feb 13, 2010 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist doch egal, ob ich BlitzBasic: [AUSKLAPPEN]
MouseHit(1)
oder eine Variable abfrage...

...Außerdem funktioniert es doch bei der ersten if-Abrage...

ComNik

BeitragSa, Feb 13, 2010 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist schon egal.
Aber nicht bei MouseHit().

MouseHit() arbeitet mit einem Puffer, der bei jedem Aufruf der Funktion geleert wird. Wenn du also immer am Anfang die Funktion aufrufst und in eine Variable speicherst, kriegst du richtige Ergebnisse. Probiers aus, es klappt Wink

lg
ComNik
WIP: Vorx.Engine

faeX

BeitragSa, Feb 13, 2010 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber du müsstest genau zufällig die Maus klicken, wenn deine erste Abfrage schon gelaufen ist, die zweite aber noch nicht. Und dafür ist der PC viel zu schnell, das schafft man so gut wie gar nicht. Jedesmal wenn MouseHit aufgerufen wird, wird der Mausklickzähler wieder auf 0 gesetzt. Wenn du also MouseHit direkt 2 mal hintereinander aufrufst, wird beim ersten Mal die tatsächliche Anzahl der Klicks zurückgegeben und bei dem zweiten Aufruf immer 0, da der Zähler ja zurückgesetzt wurde.

Holzchopf

Meisterpacker

BeitragSa, Feb 13, 2010 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Damen und Herren, werden sie Augenzeugen eines einmaligen Spektakels! Denn bis hier war es noch egal, wo sich dieser Thread befindet, aber durch des Erstellers Nachtrag kommt es zum ersten Mal in der Gesch- ach, was soll's Rolling Eyes mrtpcag, mit deiner Frage zwingst du mich fast zu folgendem:

~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

Der Unterschied liegt eben genau darin, dass MouseHit die Anzahl Maustastendrücke seit dem letzten Aufruf von MouseHit zurückgibt und den internen Zähler wieder nullt. Fragst du also zwei Mal kurz hintereinander diese Anzahl ab, ist es ziemlich wahrscheinlich, dass der Tastendruck nur beim ersten Aufruf registriert wird und folgedessen durch die Nullung beim zweiten Mal nicht mehr.

mfG

Edit
Mist, da waren gleich zwei schneller =(
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

mrtpcag

Betreff: Wie löse ich das Problem jetzt??

BeitragSa, Feb 13, 2010 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
...das mit dem internen Counter von Mousehit wusste ich...

Wenn ich jetzt allerdings am Anfang der Schleife
BlitzBasic: [AUSKLAPPEN]
Mousegedrückt = MouseHit(1)

hinzufüge, wie es mir empfohlen wurde, funktioniert das ganze trotzdem nicht, da meine Schleife sehr schnell läuft und "Mousegedrückt" immer wieder auf Null gesetzt wird... Sad

PS: Die Verschiebung der Frage in "Beginners corner" war meiner Meinung nach nicht berechtigt...

Holzchopf

Meisterpacker

BeitragSa, Feb 13, 2010 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird aber dann nicht innerhalb der Schleife wieder genullt, sondern frühstens erst wieder beim nächsten Schleifendurchgang. Du hast auch garantiert die anderen Vorkommen von MouseHit durch Mousegedrückt ersetzt?

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Nicdel

BeitragSa, Feb 13, 2010 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Variablennamen dürfen keine Umlaute beinhalten Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

mrtpcag

Betreff: Es geht immer noch nicht (mit Variable)

BeitragSa, Feb 13, 2010 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider tritt immernoch ein Problem auf...

...Ich habe alle Mousehit's ersetzt (es war nur einer)

PS: die umlaute hab ich natürlich nicht benutzt.


...Dummes Beispiel mit dem Variablennamen...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 13, 2010 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
mrtpcag, in allen Ehren, aber die Verschiebung ist berechtigt. Ist ja auch keine persönliche Diskriminierung dir gegenüber, sondern soll lediglich die Bereiche abgrenzen.

1.) Vermeide Umlaute in Variablennamen ''Mousegedrückt = MouseHit(1)''

2.) Wenn du eine loakel Variable aus der Hauptschleife in einer Funktion benötigst, dann sollte diese zu einer globalen gemacht werden.

3.) Tipp: Lokale Variablen innerhalb einer Funktion gelangen so nicht nach Außen, womit sauber abgetrennt werden kann.

- - -

P.S.

In den meisten Fällen kann man sich auf die Tipps anderer verlassen. Gerade bei so einfachen Dingen muß man nicht erst ewig ''rummosern'' bis man das vorgeschlagene in die Tat umsetzt. Vor allem wenn drei unterschiedliche Leute das gleiche schreiben. Wink
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

mrtpcag

BeitragSa, Feb 13, 2010 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das vorgeschlagene in die Tat umgesetzt, aber es funktioniert immer noch nicht...

...Wenn ich wüsste warum...

__________________________________________________________________
Bei mir sieht es jetzt so aus:

BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,0,2
;[...]
Global Mousetouches
;[...]

While Not KeyHit(1)

Mousetouches = MouseHit(1)

Rect 55,455,100,100,0
Rect 155,455,100,100,0
Rect 255,455,100,100,0

If CheckMouse(60,460,150,550,1) Then
ExecFile(FirefoxExe$)
EndIf

If CheckMouse(160,460,250,550,1) Then
ExecFile(FirefoxExe$)
End
EndIf

If CheckMouse(260,460,350,550,1) Then
ExecFile(SEVENzipExe$)
End
EndIf
;---------------------------------------------------------------------------------------------------
Flip
Wend

Function CheckMouse(XStart%,YStart%,XEnd%,YEnd%,MouseButton%)
If MouseButton% = 0 Or Mousetouches<0 And MouseX()>=XStart% And MouseY()>=YStart% And MouseX()<=XEnd% And MouseY()<=YEnd% Then
Return True
Else
Return False
EndIf
FlushMouse()
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 13, 2010 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Probier Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2


While Not KeyHit(1)
   
   If MouseHit(1) Then
      
      If CheckMouse(60,460,150,550) Then
         ExecFile(FirefoxExe$)
      EndIf
      
      If CheckMouse(260,460,350,550) Then
         ExecFile(MSInternetexplExe$)
      EndIf
      
   End If
   
   Rect 55,455,100,100,0
   Rect 155,455,100,100,0
   Rect 255,455,100,100,0
   Flip
Wend


Function CheckMouse(XStart%,YStart%,XEnd%,YEnd%)
   If MouseX()>=XStart% And MouseX()<=XEnd% And MouseY()>=YStart% And MouseY()<=YEnd% Then
      Return True
   Else
      Return False
   EndIf
End Function


Edit1:

Wenn du generell in die Funktion MouseButton eine 1 rein schickst, aber in der Funktion selbst auf If MouseButton% = 0 ... prüfst, dann kannst du dir selbst aussuchen, was für ein Ergebnis bei raus kommt.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

mrtpcag

BeitragSa, Feb 13, 2010 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Problem an dem Probiercode: Ich will auch (an einer anderen Stelle im Prog) nur mit mouseover arbeiten...

-> da lass ich "if Mousehit(1).." dann einfach weg.

-> Sehr guter Ansatz/Idee, aber man muss Glück haben, dass man zur richtigen Zeit drückt... -> Warum? Ich habe nirgendwo anders "Mousehit(1)" in Code...
  • Zuletzt bearbeitet von mrtpcag am Sa, Feb 13, 2010 19:42, insgesamt 2-mal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 13, 2010 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie bereits von anderen gesagt, dann speicherst du den MouseHit eben in eine Variable zwischen. Diese kannst du dann innerhalb eines Loops auch mehrfach abfragen. Innerhalb von Funktionen kannst du dann den Wert als Paramater übergeben, oder eben auch die Variabel als gloabel deffinieren.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

mrtpcag

BeitragSa, Feb 13, 2010 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
...Ich habe die Variable jetzt global deffiniert und Mousehit(1) durch sie ersetzt...

So geht's: Smile

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
;=======================================================================================Hauptprogramm
Global Mousetouches

While Not KeyHit(1)

Mousetouches = MouseHit(1)
Delay 200
 ;------------------------------------------------------------------------------------------Umrandung
  Rect 55,455,100,100,0
  Rect 155,455,100,100,0
  Rect 255,455,100,100,0
 ;-----------------------------------------------------------------------
 If MouseHit(1) Then
  If CheckMouse(60,460,150,550) Then
   ExecFile("cmd.exe 1")
  EndIf

  If CheckMouse(160,460,250,550) Then
   ExecFile(DesktopsExe$)
   End
  EndIf

  If CheckMouse(260,460,350,550) Then
   ExecFile(SEVENzipExe$)
   End
  EndIf
 EndIf
 ;---------------------------------------------------------------------------------------------------
 Flip
Wend

Function CheckMouse(XStart%,YStart%,XEnd%,YEnd%)
 If MouseX()>=XStart% And MouseY()>=YStart% And MouseX()<=XEnd% And MouseY()<=YEnd% Then
  Return True
 Else
  Return False
 EndIf
End Function




...aber nur mit "delay" Sad

faeX

BeitragSa, Feb 13, 2010 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Delay! Ich kotze gleich auf meine Tastatur! Nimm lieber CreateTimer und WaitTimer! Wink
Und außerdem hast du nicht alle MouseHits ersetzt.

Aus BlitzBasic: [AUSKLAPPEN]
 If MouseHit(1) Then 
machst du BlitzBasic: [AUSKLAPPEN]
 If mousetouches Then 
!
So sollte es gehen. Und nimm dieses Delay raus, sonst schmorst du in der Programmierhölle Freundchen! Very Happy

EDIT: Und im übrigen: Du hast zwar Flip 1 in deinem Code und deswegen wartet er ja an der Stelle auch so lange, dass ca. 75/60 oder das multipliziert mit einer 2er Potenz mit negativem Exponenten Schleifendurchläufe stattfinden.

(Hä? Was willst du von mir??)

Also: Das hier sollte helfen, um zu verstehen was Flip 1 macht. Allerdings klappt das meinen Erfahrung nach nicht immer... Also würde ich dir empfehlen lieber 'nen Timer zu nehmen. Smile
  • Zuletzt bearbeitet von faeX am Sa, Feb 13, 2010 20:04, insgesamt einmal bearbeitet

mpmxyz

BeitragSa, Feb 13, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst "Mousetouches" auch nutzen.
Hier hast du nämlich wieder das Problem, dass du zwei mal direkt hintereinander MouseHit nutzt.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

mrtpcag

BeitragSa, Feb 13, 2010 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Mousetouches hab ich eingebaut (falsch Gepostet) und das hässliche Evil or Very Mad "Delay" Evil or Very Mad hab ich nur mal als Test verwendet.

-> geht trotzdem nicht

-> Doch! jetzt geht's. Ich hatte statt
BlitzBasic: [AUSKLAPPEN]
If Mousetouches Then

BlitzBasic: [AUSKLAPPEN]
If Mousetouches<0 Then

verwendet...

_____________________________________________________________________________________

Auf jeden Fall mal ein rießiges Dankeschön an alle, die mir geholfen haben!!!

_____________________________________________________________________________________

Hier nochmal der Endgültige Code:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,0,2
;[...]
Global Mousetouches=0

While Not KeyHit(1)
Mousetouches = MouseHit(1)

Rect 55,455,100,100,0
Rect 155,455,100,100,0
Rect 255,455,100,100,0
;-----------------------------------------------------------------------
If Mousetouches Then
If CheckMouse(60,460,150,550) Then
ExecFile(FirefoxExe$)
End
EndIf

If CheckMouse(160,460,250,550) Then
ExecFile(DesktopsExe$)
End
EndIf

If CheckMouse(260,460,350,550) Then
ExecFile(SEVENzipExe$)
End
EndIf
EndIf
;---------------------------------------------------------------------------------------------------
Flip
Wend

Function CheckMouse(XStart%,YStart%,XEnd%,YEnd%)
If MouseX()>=XStart% And MouseY()>=YStart% And MouseX()<=XEnd% And MouseY()<=YEnd% Then
Return True
Else
Return False
EndIf
End Function
  • Zuletzt bearbeitet von mrtpcag am Sa, Feb 13, 2010 20:13, insgesamt 3-mal bearbeitet

mpmxyz

BeitragSa, Feb 13, 2010 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann zeige am Besten mal den neuen Code.
Der gezeigte scheint es ja nicht zu sein und die Änderungen können wir nicht hellsehen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group