Zwischen mehreren Zuständen schalten
Übersicht

NikonoobBetreff: Zwischen mehreren Zuständen schalten |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, ich hab ein kleines Problem.
Mein Code ist eigentlich ganz einfach, ich will einfach zwischen mehreren bildern herumschalten indem ich auf das bild drücke(das ganze soll einem Tilemap-Editor dienen..) : Code: [AUSKLAPPEN] SetBuffer BackBuffer()
Graphics 640,480 WaitKey tins = LoadImage("mondtile1.png") DrawImage tins,0,0,0 taehns = LoadImage("mondtile2.png") Repeat If MouseX()>=0 And MouseX()<=32 And MouseY()>=0 And MouseY()<=32 And MouseDown(1) Then DrawImage (taehns,0,0, 0) If MouseX()>=0 And MouseX()<=32 And MouseY()>=0 And MouseY()<=32 And MouseDown(1) Then DrawImage (tins,0,0, 0) Forever WaitKey Ich will also per Mausklick zwischen bild 1 und bild 2 wechseln (später auch zwischen nochmehr bildern....) aber das Problem ist, dass ich mit zwei If-Schleifen und dem Befehl MouseDown(1) nicht weiterkomme, denn dann kann man nicht korrekt umschalten und wenn man einfach die maus auf dem bild gedrückt hält dann wechselts auch dauernd zwischen den Bildern. ich suche also eine elegantere lösung.... |
||
FBI-blitz |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Speicher die Bilder in einem Array, setz irgendwo die Anzahl fest und mach ne counter-Variable, also in etwa so:
Code: [AUSKLAPPEN] anzahl_bilder = 5; dim bilder(anzahl_bilder); bilder[0] = loadimage(...); bilder[1] = loadimage(...); bilder[2] = loadimage(...); bilder[3] = loadimage(...); bilder[4] = loadimage(...); counter_variable=0; repeat if keydown(57) then counter_variable = counter_variable + 1; if counter_variable >= anzahl_bilder then counter_variable = 0 endif drawimage bilder[counter_variable], 0, 0 until keydown(1) |
||
Computer 1: AMD Athlon64 3500+ | nVidia GF 7900GT | 1024 MB DDR-RAM | ASUS A8N-SLI Preimium | 250 GB SATA 2 || WindowsXP | Blitz3D | Blitz+
Computer 2: AMD AthlonXP 2400+ | ATI Radeon 9500 | 512 MB DDR-RAM | MSI K7N2 | 80 GB IDE | 160 GB IDE || WindowsXP | Blitz3D | Blitz+ Computer 3: Intel Pentium MMX | onBoard-Grafik | 32 MB RAM | 1 GB IDE || Windows 98 SE | Blitz+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mousehit verwenden...? | ||
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) |
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@FBI-Blitz: Sry, bin noch nicht so lange dabei und da kommt irgendne Fehlermeldung....könntest dus mir nochmal erklären?
@Xeres: Dann geht das klicken auch nicht problemlos, hab ich schon getestet....(oder liegts etwas an meiner maus?) |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
FBI-Blitz hat sich verschrieben... die eckigen Klammern müssen zu runden werden... sonst wär das ein BlitzArray, das nicht existiert ![]() EDIT: an der Maus liegt es nicht! |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Abgesehen davon könnte man auch einfach ElseIf benutzen ^^ | ||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kleine Optimierung zu FBI-Blitz' Code
Code: [AUSKLAPPEN] if keydown(57) then
counter_variable = (counter_variable + 1) mod anzahl_bilder endif |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
pile |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] If MouseX()>=0 And MouseX()<=32 And MouseY()>=0 And MouseY()<=32 And MouseDown(1) Then DrawImage (taehns,0,0, 0):Repeat:Until MouseDown(1)=0
Geht zur Not auch. |
||
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238% |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
pile, das ist unsauber -sowas sollte man erst gar nicht in Erwägung ziehen.
nikonoob: Deine Mouse ist nicht defekt. Mousehit() leert nach jedem Aufrufen den Mauspuffer, daher sollte man den Befehl nur einmal pro Schleifendurchlauf verwenden. Idealerweise speicherst du das Ergebnis in einer Variable und überprüfst anhand der, dann klappt das mit dem Mousehit, denn dann kannst Du sooft Du willst überprüfen ob die Taste gedrückt wurde. Code: [AUSKLAPPEN] repeat mh = mousehit(1) ... ... if mh and sonstwas() then ... if mh and dieserkram() then ... until keyhit(1) |
||
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 |
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß auch nicht, wie die Leute immer darauf kommen bestimmte
Abfragen mit "And MouseHit(X)" zu formulieren, gibt es irgendwo ein Tutorial das es so beschreibt? Es sind ja nun wirklich VIELE die diesen Fehler machen. Sollte es irgendwo ein Tut geben das es so zeigt sollte man das mal ändern. Wie BR es gemacht hat ists natürlich vollkommen korrekt und sollte auch so verwendet werden! IMurDOOM |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
Nikonoob |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke an alle, ich hab jetzt FBI-Blitz's Code genommen (mit runden Klammern) und es funzt. Danke nochmal... | ||
![]() |
pile |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, ich weiß nicht warum aber ich hab da auf einmal ein Problem mit MouseHit() und da ich so ausgeschimpft wurde wollte ich es mal komplett ohne Repeat:Until Mousedown probieren (dazu muss ich sagen das ich bisher eher selten Spiele gemacht habe die eine flüssige Schleife verlangt haben und daher ging das bisher eigentlich immer, außerdem habe ich mir das selber "beigebracht" das stand nirgends)
Ich möchte bei Berührung mit einem Bild und dem Betätigen der Maustaste das etwas passiert. Nehme Ich dazu MouseHit() funktioniert zwar alles, das Problem ist aber, wird die Maus einmal betätigt ohne das sich der Zeiger auf dem Bild befindet, dann passiert auch etwas wenn ich dann über das Bild fahre ohne die Maus zu drücken. Nehme ich hingegen Musedown() passiert zwar nix wenn ich die Maus nicht drücke aber, wenn ich die Maus gedrückt halte bevor und während ich auf das Bild fahre wird das Ereigniss ausgelöst, was wiederum schlecht ist denn es soll ja nur dann etwas passieren wenn die Maus auf dem Bild ist und ich dann die Taste drücke. Ich habe es schon mit FlushMouse probiert, aber das hat auch nicht so recht funktioniert, denn irgendwie hat dann gar nichts mehr Funktioniert. Wie genau stelle ich es denn nun richtig an? Danke schonmal. |
||
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238% |
![]() |
pile |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weiß denn niemand wie das geht? ![]() |
||
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238% |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code ? | ||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] For t=1 To 5 ;Berechnung If t=1 Then xa=20:xb=220:xc=xa+16:Buttontext$="Button1" If t=2 Then xa=290:xb=160:xc=xa+10:Buttontext$="Button2" If t=3 Then xa=500:xb=106:xc=xa+11:Buttontext$="Button3" If t=4 Then xa=660:xb=210:xc=xa+12:Buttontext$="Button4" If t=5 Then xa=920:xb=60:xc=xa+11:Buttontext$="Button5" ;Anzeige If MX>=xa And MX<=xa+xb And MY>=705 And MY<=745 Color 255,199,4 If MouseDown(1)=1;If MouseHit(1)=1 If t=1 Then Funktion=1 If t=2 Then Funktion=2 If t=3 Then Funktion=3 If t=4 Then Funktion=4 If t=5 Then End EndIf Else Color 81,76,231 Endif Rect xa,705,xb,40 Color 255,255,255 Rect xa+4,709,xb-8,32 SetFont Schrift1 Text xc,712,Buttontext$ Next |
||
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238% |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Antwort schrieb ich schon oben, sie steht auch in der BlitzFAQ.
Mousehit() mehrfach abfragen in einer Schleife funktioniert nicht. Frag es ausserhalb ab, weise es einer Variablen zu, schäme Dich und gut ist... |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: mehrfach abfragen in einer Schleife funktioniert nicht Ich hoffe damit du meinst nur die For-Next Schleife denn wenn du die Main meinst würde mich das ziemlich verwirren, denn wie soll ich außerhalb der Main die Maus abfragen? (immer gosub repeat is ja auch doof ^^) Aber ja, außerhalb der For-Next funktioniert es. Danke!
|
||
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238% |
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst auch 10 mal in einer schleife MouseHit abfragen nur es wird dir
nichts bringen. SCHEISS egal ob nun For-Next, While-Wend oder Repeat-Until. Auch vollkommen egal ob im gosub oder goto oder wie schäbig hier manche programmieren, vollkommen egal. Das problem ist, wenn der "Spieler" die Maustaste 1 drückt, wird dieser druck der Taste in den Buffer/Speicher/Memory (wie auch immer man es nennen mag) von MouseHit geschrieben, dieser Buffer wird abgefragt und auf Null gesetzt, sobald man MouseHit aufruft. Umd as problem besser erläutern zu können benutzen wir einfach mal einen schematischen Aufbau einer Schleife Code: [AUSKLAPPEN] While
Eingabe (Tastatur, Maus) Verarbeitung Ausgabe Wend Wenn du nun in einer Schleife sagen wir folgendes schreibst: Zeile 1: if imagescollide(bla, button 1) and mousehit (1) Zeile 2: if imagescollide(bla, button 2) and mousehit (1) So ist es theoretisch, doch praktisch nicht möglich button 2 zu drücken. Die Zeit die beim Ausführen von MouseHit aus Zeile 1 bis MouseHit aus Zeile 2 gebraucht wird ist so gering, das es eigentlich unmöglich ist, zufällig die Zeitspanne dazwischen zu treffen um den MouseHit Buffer wieder mit Informationen zu füllen. Um das zu schaffen muss folgendes passieren: Zeile 1: if imagescollide(bla, button 1) and mousehit (1) MOUSETASTEN EVENT (in wohl weniger als einer Millisekunde) Zeile 2: if imagescollide(bla, button 2) and mousehit (1) Und hier hast du pro Schleifendurchlauf eine Chance von weniger als 0,1% das Button 2 gedrückt wird. Naja, alles vermutlich nicht ganze technisch korrekt erklährt, doch fachlich sollte es richtig sein. Um dieses Problem zu verhindern wird eben vor der Verarbeitung, also am Anfang der Schleife EINMAL MouseHit abgefragt, um die Information den Rest des Schleifendurchlaufes lang zu benutzen. Mit rendern von Bildern und massiven berechnungn dauert ein Schleifendurchlauf gut mal 20 Millisekunden und in der Zeit kann es gut möglich sein, dass die Maustaste gedrückt wird, sollte sie nicht gedrückt werden ist das auch nicht schlimm, dann wird eben einfach kein Event das durch die Masutaste ausgeführt werden soll ausgelöst. Wer Fragen hat: Fragen! IMurDOOM |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
![]() |
pile |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso, jetzt verstehe ich, nicht das Betätigen der Maustaste löscht den Buffer sondern die Tatsache das der Befehl MouseHit(x) in meinem Code steht.
Ist ja gar nicht so kompliziert wie ich zu erst dachte. Aber, was ist wenn ich MouseHit(x) doch mehrmals in der Schleife habe, allerdings in etwa so: Code: [AUSKLAPPEN] If irgendwas If Irgendwas_anderes If MouseHit(x) then es_passiert_was endif endif Wenn jezt "irgendwas" oder "irgendwas_anderes" nicht zutrifft müßte mein Programm doch den MouseHit(x)-Befehl überspringen und der Mausbuffer wird nicht gelöscht oder? |
||
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238% |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das wäre ein Glücksspiel - mal wird der Puffer zu früh gelöscht, mal nicht.
DESWEGEN (zum 3.en und garantiert letzten Mal): Mach zu Beginn eine Variable und speicher dort den Wert von Mousehit hinein. das reicht für die ganze Schleife. Du brauchst es nirgends sonst. Wirklich nicht. Versprochen. Mit Sahne drauf, und Kirsche. (... denn Mousehit ist es scheissegal wo der Mousezeiger steht wenn es abgefragt wird. Es registriert nur die Tatsache DASS gedrückt wurde. Den Zusammenhang stellst Du mit deinem Code her. Und die Mouse wird sich innerhalb einer Millisekunde nicht vom Button wegbewegt haben. Eine Abfrage zu Beginn. Mehr nicht.) Ich hoffe das war nun deutlich genug. |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group