Kreisrunde Menüs - Maussteuerung

Anfängerfragen zum Programmieren mit PureBasic.
MoonWolf
Beiträge: 17
Registriert: 31.07.2009 15:03

Kreisrunde Menüs - Maussteuerung

Beitrag 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!!!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
MoonWolf
Beiträge: 17
Registriert: 31.07.2009 15:03

Re: Kreisrunde Menüs - Maussteuerung

Beitrag von MoonWolf »

@nick
achso klaar
sorry, bin nicht drauf gekommen /:->
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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.
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
MoonWolf
Beiträge: 17
Registriert: 31.07.2009 15:03

Re: Kreisrunde Menüs - Maussteuerung

Beitrag von MoonWolf »

danke!!
Benutzeravatar
Schlumpf
Beiträge: 19
Registriert: 21.03.2010 00:52
Wohnort: Der Puff von Schlumpfhausen

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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()
PB 4.41 - Win XP pro
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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-
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Kreisrunde Menüs - Maussteuerung

Beitrag 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.
pb 4.51
Antworten