Zwischen mehreren Zuständen schalten

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Nikonoob

Betreff: Zwischen mehreren Zuständen schalten

BeitragSo, Jun 03, 2007 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 03, 2007 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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+

Xeres

Moderator

BeitragSo, Jun 03, 2007 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Nikonoob

BeitragSo, Jun 03, 2007 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSo, Jun 03, 2007 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
FBI-Blitz hat sich verschrieben... die eckigen Klammern müssen zu runden werden... sonst wär das ein BlitzArray, das nicht existiert Wink

EDIT: an der Maus liegt es nicht!
Twitter
Download Jewel Snake!
Windows|Android

StepTiger

BeitragSo, Jun 03, 2007 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

SpionAtom

BeitragMo, Jun 04, 2007 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jun 04, 2007 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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%

BladeRunner

Moderator

BeitragMo, Jun 04, 2007 6:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jun 04, 2007 10:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jun 04, 2007 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke an alle, ich hab jetzt FBI-Blitz's Code genommen (mit runden Klammern) und es funzt. Danke nochmal...

pile

BeitragMi, Jun 13, 2007 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 14, 2007 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiß denn niemand wie das geht? Embarassed
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

BladeRunner

Moderator

BeitragDo, Jun 14, 2007 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 14, 2007 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

[/code]
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

BladeRunner

Moderator

BeitragDo, Jun 14, 2007 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jun 15, 2007 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jun 16, 2007 2:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 17, 2007 7:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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%

BladeRunner

Moderator

BeitragSo, Jun 17, 2007 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group