Seite 1 von 2

Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:19
von MoonWolf
Hallo
Ich habe folgendes Problem:
Ich versuche ein Spiel zu Programmieren (wird ein 2D JumpnRun Game) und habe dafür ein Menü in Gimp gemalt.
Die einzelnen Menüpunkte sind Kreise. Wie kann ich jetzt herausfinden ob mein Mauszeiger sich beim Klick grade in einem Kreis befindet?
DANKE!!!

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:37
von NicTheQuick
Eigentlich sollte selbst für einen Anfänger dieses Problem mit einfacher Schulmathematik lösbar sein.

Ich gebe dir trotzdem einen Anhaltspunkt.
Berechne den Abstand zwischen Maus und Kreismittelpunkt und schau, ob er kleiner ist als der Radius.

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:38
von RSBasic

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()

If OpenScreen(1024,768,32,"Screen")
  
  CreateSprite(1,100,20,0)
  CreateSprite(2,2,2,0)
  
  StartDrawing(SpriteOutput(1))
    Box(0,0,100,20,RGB(100,100,255))
  StopDrawing()
  
  StartDrawing(SpriteOutput(2))
    Box(0,0,2,2,RGB(100,255,100))
  StopDrawing()
  
  Repeat
    FlipBuffers()
    ClearScreen(RGB(0,0,0))
    
    DisplaySprite(1,100,100)
    
    ExamineMouse()
    
    DisplaySprite(2,MouseX()-SpriteWidth(2)+1,MouseY()-SpriteHeight(2)+1)
    
    If MouseX()>=100 And MouseX()<=200 And MouseY()>=100 And MouseY()<=120
      StartDrawing(ScreenOutput())
        If MouseButton(1)=1
          DrawText(10,10,"Wird gedrückt...",RGB(255,255,100))
        Else
          DrawText(10,10,"Maus ist auf Button",RGB(255,100,100))
        EndIf
      StopDrawing()
    EndIf
    
    ExamineKeyboard()
    
  Until KeyboardReleased(#PB_Key_Escape)
EndIf
Etwa so? Ist zwar nur ein Beispiel über ein Rechteck und deren Abfrage, ob Mauscursor sich auf der Buttongrafik befindet und ob gedrückt wird, aber müsste kein Problem mit den Kreisen darstellen.

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:39
von STARGÅTE
Die Kreismittelpunkte wirst du sicher kennen, und die Mausposition auch.
Mit dem Radius dazu kannst du ermitteln ob der Mauszeiger innen oder außen ist:

Code: Alles auswählen

; Berechnet den Abstand zwischen zwei Punkte
Macro Distance(x1, y1, x2, y2)
  Sqr( Pow((x1)-(x2),2) + Pow((y1)-(y2),2) )
EndMacro
Eingesetzt:

Code: Alles auswählen

If Distance(Menu1_x, Menu1_y, Mouse_x, Mouse_y) < MenuRadius
 ; Drin
EndIf

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:39
von MoonWolf
@nick
achso klaar
sorry, bin nicht drauf gekommen /:->

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:40
von WPö
Tja, berechneste DeltaX und DeltaY zum Menüpunktzentrum, dann sqrt(DeltaX²+DeltaY²) und wenn das Ergebnis kleiner oder gleich Dein Menüpunktradius ist, ist der Menüpunkt angeklickt.

Gruß - WPö

PS: Nic, Ray und Stargate waren schneller.

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 18:40
von MoonWolf
danke!!

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 29.03.2010 22:04
von Schlumpf
du kannst dir die Wurzel auch sparen, indem du beide Seiten quadrierst...

Code: Alles auswählen

If r*r < dx * dx + dy * dy ; Kollision
das ist zeitsparender, als Pov() und Sqr()

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 03.07.2010 13:17
von Codusa
Sry, dass ich das Thema wieder ausgrabe aber ich habe da nch eine Frage zu:
wie finde in so einem Menü raus in welchem Abschnitt sich die Maus befindet?
Bild

Ob sich die Maus innerhalb der grauen Fläche befindet weiss ich schon, dank STARGÅTEs code.

-Codusa-

Re: Kreisrunde Menüs - Maussteuerung

Verfasst: 03.07.2010 14:10
von gnasen
Seit atan2() in PB vorhanden ist, brauchst du nur noch atan2 aufrufen um den Winkel zwischen Maus und Kreismittelpunkt zu bestimmen. Der Winkel liegt immer in einem der Sektoren und damit kannst du bestimmen, wodrüber sich die Maus befindet.