Verständnisprobleme mit allgemeiner Maussteuerung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

NitroXP

Betreff: Verständnisprobleme mit allgemeiner Maussteuerung

BeitragDo, Jun 25, 2009 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
HI FOLKS!

ist mein erster post, aber auch ein total verzweifelter!

bin jetzt nicht der totale blutige anfänger, aber auch nicht wirklich
so weit das ich mich selber aus dieser sackgasse raushohlen kann.

seit tagen durchsuche ich bereits das forum und habe mir alle
316 ergebnisse der suche zum thema "maus" durchgelesen.

mein problem ist volgendes:

bin dabei an einem recht simplem kartenspiel herum zu bassteln...
ich kriege nur einfach keine maussteuerung hin, die maus ist zwar da
(windows maus) kreig aber überhaubt nichts auf die reihe!
nicht mal ein einfaches menü mit einem knopp oder so.
dabei soll beim klicken auf ein kartenstapel nur die oberste karte
gezogen werden, also aufgedeckt werden.
ich habe sogar versucht die windows maus per HidePointer zu verstecken, und
eine eigene zu laden, aber das bringt micht total zum verzweifeln.
dabei habe ich das problem das mausbild an die maus zu binden,
hab es auch mit MouseX() MouseY() versucht aber
anscheinen bin ich grad zu fest gefahren...

online hillfen und alle beispiele bringen mich nicht weiter,
hab zwar gedacht das die ansätze die ich gefunden habe, mich irgend
wie weiter bringen, aber das ist nicht der fall, ist nur noch verwirrender.

würde mich tierisch freuen wenn mich
einer überhaubt versteht, und erst recht wens ne lösung gibt
(gib et, weiß ich, es nur ich sehe es nicht!)

ThX

Mr.Hyde

Newsposter

BeitragDo, Jun 25, 2009 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Grundsätzlich hast du dir schon die richtigen Gedanken gemacht. Um mit der Maus zu arbeiten brauchst du die Koordinaten, die du ja mit MouseX und MouseY ausliest. Am besten machst du das einmal pro Schleifendurchlauf und speicherst sie dabei in Variablen ab, damit du sie mehrmals ohne weiteres Auslesen verwenden kannst. Das sollte dann ungefähr so aussehen:
BlitzBasic: [AUSKLAPPEN]

Local MousePosition_X
Local MousePosition_Y
;weitere Deklarationen Programmaufbau etc.

Repeat ;Beginn der Hauptschleife
Cls
MousePosition_X = MouseX()
MousePosition_Y = MouseY()
;weitere Befehle in der Hauptschleife


Flip
Until Programmende ;Ende der Hauptschleife

End




Nun kannst du im Hauptprogramm jederzeit auf die Mauskoordinaten zugreifen. Wenn du nun eine eigene Mausgrafik möchtest, lädst du dein Bild einmal

BlitzBasic: [AUSKLAPPEN]

Local IMGMouse_std$ = LoadImage("Pfad/Bild.png")

und lässt es in der Hauptschleife mit
BlitzBasic: [AUSKLAPPEN]

DrawImage(IMGMouse_std, MousePosition_X, MousePosition_Y)

anzeigen.

Für deine Kartenauswahl brauchst du noch Kollision. Da du es ja anscheinend mit rechteckigen Objekten zu tun hast, bietet sich die schnellste Kollisionsabfrage RectsOverlap an. Wobei du hier als Rechteck Nummer 1 deine Mausspitze nimmst. Du nimmst einfach die Mauskoordinaten MousePosition_X, MousePosition_Y und gibst als Länge jeweils 1 an. Als zweites Rechteck wählst du die Spielkarte aus. Dafür benötigst du die Position der Spielkarte, (die gleiche, die du auch zum anzeigen benutzt und zusätzlich die Breite und die Länge, die du ebenfalls angeben musst. Wenn diese Bedingungen erfüllt sind, dann kannst du bei einem Mausklick MouseHit die Karte auswählen.
Ich hoffe das hilft dir ein wenig.
MfG, Hyde
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen
  • Zuletzt bearbeitet von Mr.Hyde am Do, Jun 25, 2009 12:54, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragDo, Jun 25, 2009 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm... Also verstehen tu ich dich leider nicht =/
Aber ich hab eine Frage an dich (damit wir wissen, womit wir's genau zu tun haben):

Verstehst du diesen Code hier und weisst du auch, was wieso, warum und weshalb geschieht?
Code: [AUSKLAPPEN]
Graphics 400,300,0,2
SetBuffer BackBuffer()
Global TIMER = CreateTimer(60)

; Mausposition und -tastenabfragen speichern wir global...
Global mx, my, mh
While Not KeyDown(1)
   ; ... und fragen diese anfangs Hauptschleife ab
   mx = MouseX()
   my = MouseY()
   mh = MouseHit(1)
   
   ; Schaltflächen zeichnen
   If Button( 100, 90, "Ich ändere die Farbe" )
      Color Rand(128,255), Rand(255), Rand(255)
   EndIf
   If Button( 100, 190, "Ich beende das Programm" )
      End
   EndIf
   
   Flip 0
   WaitTimer( TIMER )
Wend

Function Button( pX, pY, pTxt$ )
   Rect pX, pY, 200, 20, False
   Text pX +100, pY +10, pTxt$, True, True
   
   ; Mausposition abfragen (innerhalb der Schaltfläche?)
   If mx => pX And mx < pX+200 And my => pY And my < pY+20
      ; Und Maustaste gedrückt?
      If mh
         ; Dann gibt die Funktion True zurück
         Return True
      EndIf
   EndIf
End Function


Oder happerts da schon?
Wenn nicht, beschreibe doch dein Problem bitte genauer.

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
 

NitroXP

BeitragDo, Jun 25, 2009 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow ihr seid Götter, find das super das jemand sich dem Wirwar angenommen hat...


Local MousePosition_X
Local MousePosition_Y

hat schon mal für mich ein Wunder bewirkt. Maus ist da, hinterlässt aber eine Spur,
stört mich jetzt aber erst mal nicht, bin überhaubt froh so weit zu sein..
Nun verstehe ich nicht wirklich wie ich das Beispiel von RectsOverlap aus der Hilfe umsetzen soll
in mein Fall einarbeiten kann...

Code: [AUSKLAPPEN]

;-----------MainMenu-----------------------------
         
         Graphics 1024,768, 16, 2



Include "grafikbox.bb"     ;<-Sollte alles richtig sein...
         
         SetBuffer BackBuffer()


Local MousePosition_X
Local MousePosition_Y

Local Mouse$ = LoadImage("gfx/maus.png")
      MaskImage Mouse$, 255,0,255

       HidePointer
      
      

         DrawImage Menu,          0 , 0
         DrawImage BtnNSpiel,   370 , 370







      Repeat ;Beginn der Hauptschleife
      
MousePosition_X = MouseX()
MousePosition_Y = MouseY()


    DrawImage (Mouse, MousePosition_X, MousePosition_Y)

   If RectsOverlap (MousePosition_X, MousePosition_Y, BtnNSpiel 370, BtnNSpiel 370) ;<-Hier Problem

   Then   ;[Alles Löschen & Neues Fenster Laden, etc.]

Flip
Until Programmende

End


in der hilfe wurden ja die rechtecke ja generiert und mit fersten werten oder zufalswerten versehen


Code: [AUSKLAPPEN]
 
   rect1X = Rnd(50, 610)
   rect1Y = Rnd(50, 430)
   rect1W = 50
   rect1H = 50
   rect2X = Rnd(50, 610)
   rect2Y = Rnd(50, 430)
   rect2W = 50
   rect2H = 50


Die größe der Knöpfschen Grafik ist 50x300 pixels groß
das würde "rect2W und rect2H" in diesem Beispiel sein
dann die Position auf dem Bildschrim 370,370

aber wie ich der Maus noch die werte 1 zuweise,
übersteigt meine vorstellung momentan


@Holzchopf
Verstehen tu ich das ganze, ja, aber ist mir zu cryptisch
würd niemals mx,my,mh nehmen... bzw überhaubt variable so kurz
halten. Das es Maus und Button aktionen und If Then Else schleifen sind
(hof ist richtig) bin ich auch hintergestiegen, aber was genau passiert
könnte ich nicht sagen...[/code]

Progger93

BeitragDo, Jun 25, 2009 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
In die Hauptschleife muss noch ein
Code: [AUSKLAPPEN]

Cls

rein dann gibts keine Mausspur.

Und achte mal auf ein besseres einrücken, dann wird der Code auch übersichtlicher.

EDIT: http://de.wikibooks.org/wiki/B...y-Tutorial

Schau dir mal dieses Tutorial an. Hier wird dir BlitzBasic von Anfang an beschrieben und alle wichtigen sachen werden erklärt. Dies sollte die meisten Fragen beseitigen. (Aber arbeite es bitte durch und les es nicht nur oder kopiere Code-Teile...das hilft nämlich nichts Wink )
  • Zuletzt bearbeitet von Progger93 am Do, Jun 25, 2009 14:37, insgesamt einmal bearbeitet

Mr.Hyde

Newsposter

BeitragDo, Jun 25, 2009 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal sind If/Else - Then KEINE Schleifen, sondern Verzweigungen. Als Schleifen bezeichnet man Codefragmente, die sich wiederholen (können) In BB sind Schleifen For - Next // While - Wend und Repeat - Until bzw Forever. Eine If-Abfrage ist wie eine Weggabelung, wobei vorher (nämlich in den Bedingungen) festgelegt ist, wann man welchen Weg nehmen muss.

Dein Problem ist, dass du RectsOverlap mit falschen Parametern fütterst. Schau es dir noch mal in der Hilfe an.
BlitzBasic: [AUSKLAPPEN]

If RectsOverlap(X Position Rechteck A, Y Position Rechteck A, Breite Rechteck A, Höhe Rechteck A, X Position Rechteck B, Y Position Rechteck B, Breite Rechteck B, Höhe Rechteck B) Then
;Dieser Code wird nur aufgerufen, wenn die Rechtecke übereinander liegen
EndIf
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen
 

NitroXP

BeitragDo, Jun 25, 2009 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Joah, das es Schleifen sind wusste ich, hab eines gedacht etwas anderes geschreiben...
If und Else sind Entscheidungen, shame on me...

If I have brain
Than I'm happy...

hab Cls beim abtippen vergessen, PEINLIIIICH Danke Very Happy

- - -

X Position Rechteck B währ ja 370, <--Ist ja der Button auf den ich klicke...?
Y Position Rechteck B ist dan auch 370,
Bereite und Höhe geht ja von der grafik größe aus (denke ich)
ABER
X Position Rechteck A kann ich nur auf "MousePosition_X = MouseX()" zurückführen
oder? Y Position Rechteck A ist das gleiche Problem,
Breite Rechteck A, Höhe Rechteck A, Habe ich aus der png alo 24x24
ist aber ja über MaskImage aus X? verkleinert worden...

ich glaub ich bin gerade zu Verbissen und sehe nicht was ich falsch mache...

Danke für Eure Geduld
 

TerrorMachine

BeitragDo, Jun 25, 2009 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
MaskImage verändet die Größe des Bildes nicht. Damit änderst du die transparente Farbe des Bildes.
Die Höhe und Breite eines Bildes kannst du mit ImagesWidth(*bild*) und ImagesHeight(*bild*) auslesen.
Ich würde das so lösen:

cursor = LoadImage("cursor.jpg")
karte = LoadImage("Karte.jpg")
Repeat
Cls
If KeyHit(1) then End
If ImagesOverlap(200,200,ImagesWidth(karte),ImagesWidth(karte),MouseX(),MouseY(),1,1) then
;-- Hier neue Karte anzeigen --
EndIf
DrawImage(karte,200,200)
DrawImage(cursor,MouseX(),MouseY())
Forever

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group