Verhalten des Mauszeigers mit pygame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Zizibee
User
Beiträge: 173
Registriert: Donnerstag 12. April 2007, 08:36

Freitag 31. Mai 2019, 13:27

Hallo zusammen,

ich will unter Pygame einen eigenen Mauszeiger in Form einer Hand benutzen. Da mir ein einfacher Zeiger in schwarz / weiß reicht, wollte ich einen aus einem String ( enthällt "X", "." und " ") erstellen. Mit dem selbst erstellten String von der Größe 24x24 funktioniert das auch wie gewünscht. Eingebunden habe ich den Mauszeiger so:

Code: Alles auswählen

def set_cursor():
  '''Setzt den Mausecursor'''
  datatuple, masktuple = pygame.cursors.compile(hand_strings_24x24, black='.', white='X', xor='o')
  pygame.mouse.set_cursor((24, 24), (12, 12), datatuple, masktuple)
Allerdings ist der Mauszeiger so viel zu winzig. Daher habe ich ihn doppelt so groß "gezeichnet" und wieder eingebunden

Code: Alles auswählen

def set_cursor():
  '''Setzt den Mausecursor'''
  datatuple, masktuple = pygame.cursors.compile(hand_strings_48x48, black='.', white='X', xor='o')
  pygame.mouse.set_cursor((48, 48), (24, 24), datatuple, masktuple)
Allerdings ist der Hintergrund des Mauszeigers jetzt nicht mehr transparent sondern weiß und der Mauszeiger flackert teilweise. Da ich bis auf die Größe des Strings nichts geändert habe, weiß ich nicht so recht, wo ich mit der Fehlersuche beginnen soll...

Kann da zufällig jemand weiter helfen oder hat sonst eine Idee?

Grüße
Zizibee
Benutzeravatar
ThomasL
User
Beiträge: 764
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Freitag 31. Mai 2019, 16:10

Vergleiche mal datatuple klein gross und masktuple klein gross,
die müssten ja nur doppelt so gross sein und sich sonst nicht weiter unterscheiden
Ist das der Fall?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 6217
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 31. Mai 2019, 17:06

4-mal so groß, oder?
Zizibee
User
Beiträge: 173
Registriert: Donnerstag 12. April 2007, 08:36

Freitag 31. Mai 2019, 22:25

Die kleinen Tuple haben eine länge von 72 und die großen von 288. Also sind die großen 4-mal so lang, so wie man es erwarten würde.
Ich glaube zwar nicht, dass das viel hilft, aber das hier ist der Inhalt der Tuple. Bei den großen zeigt PyCharm gar nicht mehr alles an.

datatuple = <class 'tuple'>: (0, 0, 0, 0, 0, 0, 0, 27, 128, 1, 27, 128, 1, 157, 192, 0, 221, 216, 0, 221, 216, 0, 93, 216, 0, 255, 248, 16, 255, 240, 25, 255, 240, 25, 255, 240, 15, 255, 224, 7, 255, 224, 3, 255, 224, 1, 255, 224, 0, 255, 192, 0, 255, 192, 0, 127, 192, 0, 127, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
masktuple = <class 'tuple'>: (0, 14, 0, 0, 63, 128, 3, 191, 192, 3, 191, 200, 3, 191, 244, 1, 255, 252, 1, 255, 252, 1, 127, 252, 57, 255, 252, 61, 255, 252, 63, 255, 248, 63, 255, 248, 63, 255, 248, 31, 255, 240, 15, 255, 240, 7, 255, 240, 3, 255, 240, 1, 255, 224, 1, 255, 224, 0, 255, 224, 0, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0)

datatuple = <class 'tuple'>: (0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 121, 192, 0, 0, 0, 12, 123, 224, 0, 0, 0, 30, 249, 224, 0, 0, 0, 30, 123, 238, 0, 0, 0, 62, 249, 231, 128, 0, 0, 30, 123, 239, 128, 0, 0, 62, 249, 231, 128, 0, 0, 30, 123, 239, 128, 0, 0, 62, 249, 231, 128, 0, 0, 30, 123, 239, 128, 0, 0, 62, 249, 231, 128, 0, 0, 30, 123, 239, 128, 0, 0, 62, 249, 231, 128, 0, 0, 30, 123...
masktuple = <class 'tuple'>: (0, 0, 0, 48, 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, 0, 252, 192, 0, 0, 0, 12, 255, 240, 0, 0, 0, 63, 255, 240, 0, 0, 0, 63, 255, 254, 0, 0, 0, 127, 255, 255, 128, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255, 255, 192, 0, 0, 127, 255...
Benutzeravatar
ThomasL
User
Beiträge: 764
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Samstag 1. Juni 2019, 07:37

__deets__ hat geschrieben:
Freitag 31. Mai 2019, 17:06
4-mal so groß, oder?
natürlich, verdoppelt in Höhe und Breite == 4-mal so groß ;-)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
ThomasL
User
Beiträge: 764
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Samstag 1. Juni 2019, 08:27

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Zizibee
User
Beiträge: 173
Registriert: Donnerstag 12. April 2007, 08:36

Samstag 1. Juni 2019, 22:11

@ThomasL: Danke schon einmal für den Link.
Ich werde mir morgen noch mal in Ruhe anschauen müssen, wie ich mit Hilfe von bin() aus dem datatuple und dem masktuple den lesbaren String generiere. Irgend etwas mache ich da noch falsch. Dann verstehe ich vielleicht auch, was da zur Zeit noch falsch läuft.
Ansonsten lasse ich mir mit dem Code unter GitHub mal einen String-Cursor aus einem Bild generieren. Vielleicht funktioniert das ja besser.
Zizibee
User
Beiträge: 173
Registriert: Donnerstag 12. April 2007, 08:36

Freitag 7. Juni 2019, 10:48

Ich habe noch etwas mit dem Erstellen der Mauszeiger herumprobiert. Dabei habe ich unterschiedliche Mauszeiger aus Strings und aus Bildern generiert.
Auffällig ist dabei, dass "pygame.mouse.set_cursor()" Zeiger bis zu einer Größe von 32x32 Pixel so umsetzt wie man sich das vorstellt und ab 40x40 Pixel transparente und xor Flächen weiß bzw. schwarz anzeigt. Getestet habe ich die Größen 24x24, 32x32, 40x40 und 48x48.
Warum das so ist, habe ich (noch) nicht heraus bekommen.
__deets__
User
Beiträge: 6217
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 7. Juni 2019, 10:50

Kann das ne OS Limitierung sein?
Benutzeravatar
__blackjack__
User
Beiträge: 4048
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 7. Juni 2019, 11:33

Oder vielleicht noch spezieller eine Limitierung des Grafikkartentreibers oder gar der Hardware für welche Cursorgrössen Hardwarebeschleunigung angeboten wird, und dann vielleicht ein Bug der bei nicht unterstützten Grössen dann Mist baut statt auf etwas langsameres aber funktionierendes zurück zu fallen.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
__deets__
User
Beiträge: 6217
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 7. Juni 2019, 12:13

Wenn man das zu dem unterliegenden Systemcall verfolgt, kommt man zu https://docs.microsoft.com/en-us/window ... or#remarks - und da gibt's definitiv Limitierungen. KA ob die auch exponiert sind in pygame, aber da kann man ja auch mal mit ctypes probieren was zu machen.
Benutzeravatar
__blackjack__
User
Beiträge: 4048
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 7. Juni 2019, 12:26

@__deets__: Bei SDL gibt's diese Limitierungen nur teilweise und ich würde da halt erwarten, dass es Fallbackcode gibt, wenn das OS eine Cursorgrösse nicht unterstützt, denn Code um das selbst zu machen muss auf jeden Fall da sein, da SDL auch ganz simple Framebuffer unterstützt und dort die Cursor ja auf jeden Fall komplett selbst zeichnen muss.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
__deets__
User
Beiträge: 6217
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 7. Juni 2019, 12:41

Ich sehe da nichts im Windows Backend, das diese These stuetzen wuerde. Was in der pygame Dokumentation selbst empfohlen wird ist, den Cursor zu verstecken, und stattdessen ein normales Surface zu verwenden, und das an der Mausposition zu blitten.

Das macht der bei FBs natuerlich immer.
Antworten