Button klicken funktioniert nach dem 3 mal nicht

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

White-air

Betreff: Button klicken funktioniert nach dem 3 mal nicht

BeitragMi, Jan 10, 2007 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab so ein kleenes Programm versucht(XD) zu coden bis ich dann net mehr
den späteren Button net anklicken kann.Wo ist hier der Fehler oder wo sollte ich was verbessern:

;;;;Startbildschirm;;;;
DrawImage Narutoanfang, 0,0
DrawImage kleinesQuiz,490,150
DrawImage Zitate,450,250
Flip


;;;;QUIZ;;;;

;start;
maus=CreateImage(1,1)
SetBuffer ImageBuffer(maus)
Rect 0,0,1,1
SetBuffer BackBuffer()



Repeat
mx=MouseX()
my=MouseY()


If ImagesCollide(maus,mx,my,0,kleinesQuiz,490,150,0) And MouseHit(1) Then
Delay 500
Cls
DrawImage Naruto1,0,0
SetFont Schrift1
Text 400,30,"Naruto-Quiz"
Text 235,400,"Das Quiz besteht aus 10 schwierigen Fragen"
Text 235,425,"(Sollten schwer sein Wink)"
SetFont Schrift3
Text 235,500,"Falls du bereit bist klicke auf 'Ich bin bereit'"
DrawImage Ichbinbereit,350,600
DrawImage Naruto,660,580
DrawImage Sprechblase,700,500
Color 0,255,0
SetFont Schrift4
Text 810,525,"Viel"
Text 795,575,"Glück!"
Ende1 = True
EndIf
Flip
Until Ende1 = True


;;1.Frage;;
Repeat
mx=MouseX()
my=MouseY()

;Nach ich bin bereit;
If ImagesCollide(maus,mx,my,0,Ichbinbereit,350,600,0) And MouseHit(1) Then
Cls
DrawImage Naruto1,0,0
Color 255,255,255
SetFont Schrift1
Text 400,30,"Naruto-Quiz"
SetFont Schrift5
Text 200,300,"Welche Aussage würde zu Shikamaru passen?"
DrawImage Naruto,500,600
DrawImage Aussage1,700,400
Frage11 = True
EndIf
Flip
Until Frage11 = True

;Antworten;

Repeat
If ImagesCollide(maus,mx,my,0,Aussage1,700,400,0) And MouseHit(1) Then
DrawImage Sprechblase,540,500
SetFont Schrift4
Text 600,500,"RICHTIG!"
Cls

EndIf

Flip
Until KeyHit(1)

WaitKey

garret

BeitragMi, Jan 10, 2007 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest deinen Code dringend neu strukturieren. Es genügt beispielsweise eine Hauptschleife:

Code: [AUSKLAPPEN]

Graphics 640,480
Setbuffer BackBuffer()
; Grafiken laden
; Schriftarten laden (und erst wenn gebraucht setzen)
; es sei denn, du brauchst nur eine Schriftart. Dann hier schon SetFont schreiben, da die Anweisung nur [i]einmal[/i] ausgeführt werden muss und daher nichts in der Hauptschleife zu suchen hat.


Repeat : Cls

; benötigte Bilder zeichnen
; [eigentlicher Code]

Flip : Until KeyHit(1) : End



In diese Schleife machst du einmal die Abfrage nach der Maus und fragst die Bilder einzeln ab. In deinem Fall brauchst du nicht mal ImagesCollide zu nehmen, da auch das schnellere (da einfachere) RectsOverlap reicht. Du willst ja nur überprüfen, ob sich Maus und Bild überlagern und nicht ob sie "richtig" kollidieren.

Also in der Hauptschleife:

Code: [AUSKLAPPEN]

If MouseHit(1)
  If RectsOverlap(MouseX(),MouseY(),1,1, BildX, BildY, BildBreite, BildHoehe) Then [Anweisung]
EndIf


Ansonsten solltest du auf Delay verzichten. Es verzögert dein Programm nur unnötig.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
 

Dreamora

BeitragMi, Jan 10, 2007 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
MouseHit / KeyHit sollte nie so verwendet werden.
Der Grund ist das die Hit funktionen zurück geben, wie häufig die entsprechende Taste seit dem letzten Aufruf der Funktion gedrückt wurden.
Innerhalb eines hauptschleifen durchlaufs wird das zu üblen problemen führen.

Wenn du also Hit anstatt Down verwenden willst, weise es am einfang der Hauptschleife einer Variable zu, die du später in IFs zum vergleichen nutzen kannst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

garret

BeitragDo, Jan 11, 2007 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Darüber gelesen habe ich schon. Im Eifer des Gefechts habe ich halt diese Variante gewählt.
Kannst du das mit den "üblen" Problemen etwas näher erläutern? Wenn man nur eine If MouseHit()-Abfrage im ganzen Code hat, sollte das doch keine Probleme geben, oder?

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
 

Dreamora

BeitragDo, Jan 11, 2007 8:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein wenn du nur eine hast, dann nicht.
Aber der Mensch hat den Hang zur Vergesslichkeit, so das schnell Mal ein zweites rein kommt und man dann Probleme bekommt weil dieser Bug eigentlich schwer via Debugger zu finden ist
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ToeB

BeitragDo, Jan 11, 2007 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Setzt deine Quellcodes hier mal so rein:

Code: [AUSKLAPPEN]

;Hier dein Code...


...
Ist übersichtlicher
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!
 

White-air

BeitragFr, Jan 12, 2007 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok.ich sollte das jetzt eigen. so verbessert haben wie ihr es gesagt habt.
Aber das mit der Variable mit Mousehit(1) klappt net so wirklich bei mir. Sad
Was sollte ich eigentlich statt Until Keyhit(1) benutzen weil der würde ja erst weiter machen wenn ich escape drücke. Question
Hier mal der Code:
Graphics 1024,768
SetBuffer BackBuffer()

;;;;LADEN;;;;

;;Variablen;;
MH = MouseHit(1)
;;Bilder;;
Narutoanfang = LoadImage("Bilder\narutoanfang.jpg")
kleinesQuiz = LoadImage("Buttons\ButtonQuiz.png")
Zitate = LoadImage("Buttons\ButtonZitate.png")
Naruto1 = LoadImage("Bilder\Naruto2.jpg")
Ichbinbereit = LoadImage("Buttons\Ichbinbereit.jpg")
Naruto = LoadImage("Bilder\naruto4.bmp")
Sprechblase = LoadImage("Bilder\Sprechblase3.bmp")
Aussage1 = LoadImage("Buttons\Aussage1.bmp")

;;Schriften;;
Schrift1 = LoadFont("Arial",30,1,0,1)
Schrift2 = LoadFont("Arial",24,1,0,0)
Schrift3 = LoadFont("Arial",18,0,0,0)
Schrift4 = LoadFont("Arial",35,1,0,0)
Schrift5 = LoadFont("Arial",35,1,0,0)

;;Mask;;
MaskImage Naruto,0,255,0
MaskImage Sprechblase,0,0,0


While Not KeyDown(1)


;;;;Startbildschirm;;;;
DrawImage Narutoanfang, 0,0
DrawImage kleinesQuiz,490,150
DrawImage Zitate,450,250
Flip


;;;;QUIZ;;;;

;start;
maus=CreateImage(1,1)
SetBuffer ImageBuffer(maus)
Rect 0,0,1,1
SetBuffer BackBuffer()


Repeat
mx=MouseX()
my=MouseY()

If MH
If ImagesOverlap(maus,mx,my,kleinesQuiz,490,150) Then
Delay 500
Cls
DrawImage Naruto1,0,0
SetFont Schrift1
Text 400,30,"Naruto-Quiz"
Text 235,400,"Das Quiz besteht aus 10 schwierigen Fragen"
Text 235,425,"(Sollten schwer sein Wink)"
SetFont Schrift3
Text 235,500,"Falls du bereit bist klicke auf 'Ich bin bereit'"
DrawImage Ichbinbereit,350,600
DrawImage Naruto,660,580
DrawImage Sprechblase,700,500
Color 0,255,0
SetFont Schrift4
Text 810,525,"Viel"
Text 795,575,"Glück!"
EndIf
EndIf
Flip
Until KeyHit(1)


;;1.Frage;;

mx=MouseX()
my=MouseY()

;Nach ich bin bereit;
Repeat
If MH
If ImagesOverlap(maus,mx,my,Ichbinbereit,350,600) Then
Cls
DrawImage Naruto1,0,0
Color 255,255,255
SetFont Schrift1
Text 400,30,"Naruto-Quiz"
SetFont Schrift5
Text 200,300,"Welche Aussage würde zu Shikamaru passen?"
DrawImage Naruto,700,600
DrawImage Aussage1,700,400
EndIf
EndIf
Flip
Until KeyHit(1)
;Antworten;
Repeat
If MH
If ImagesCollide(maus,mx,my,0,Aussage1,700,400,0) Then
DrawImage Sprechblase,750,500
SetFont Schrift4
Color 0,255,0
Text 825,557,"RICHTIG!"
EndIf
EndIf
Flip
Until KeyHit(1)



;;;;ENDE;;;;

Wend
End

Was hab ich falsch gemacht?

garret

BeitragSa, Jan 13, 2007 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Zur Repeat-Until-Schleife: Er wiederholt die Schleife, bis du die Taste gedrückt hast, nicht wenn du sie drückst. While Not KeyDown(1) ist genau das Gleiche, nur dass die Abfrage am Anfang der Schleife steht, also eine Eingangsbedingung ist.

Umklammere deinen Quellcode mit den [ code]-Tags, dann kann man ihn besser lesen.

Edit: Du hast immer noch mehrere Repeat-Schleifen da drin. Füge das Ganze in eine Hauptschleife ein, so wie ich es dir oben beschrieben habe.


MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

skey-z

BeitragSa, Jan 13, 2007 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ich sehe zwar in deinem Code die Abfrage "IF MH", aber wo ist die zuweisung der variablen, ein "MH = MouseHit(1)" finde ich da nirgends, es muss genauso wie "mx = mouseX()" in der Schleife stehen, nur da fand ich beim überfliegen keins
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

garret

BeitragSa, Jan 13, 2007 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin's noch mal. Du musst die Abfrage MH = MouseHit(1) in die Hauptschleife setzen, da du ja immer wieder prüfen willst, ob eine Taste gedrückt wurde, und nicht nur am Anfang. Du hast diese Abfrage zwar drin, da sie aber nicht in der Schleife steht wird sie nur einmal ausgeführt.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group