Pygame Benutzereingabe als Funktion

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Henri.py
User
Beiträge: 20
Registriert: Sonntag 28. März 2021, 15:33

Hallo!
ich arbeite momentan an einem Schulprojekt und ich komme an einer Stelle einfach nicht weiter:
nämlich möchte ich über auf dem Bildschirm mehrere Texteingabefelder haben. Den Code dazu habe ich auch schon gecoded aber ich kriege es einfach nicht hin den code in eine Funktion umzuwandeln.
Hier seht ihr den code:

Code: Alles auswählen

import pygame
import sys

clock = pygame.time.Clock()
screen = pygame.display.set_mode([800,800])
base_font = pygame.font.Font(None, 32)
user_text = ''

input_rect = pygame.Rect(200,200,140,32)
color_active = pygame.Color('lightskyblue3')
color_passive = pygame.Color('gray15')
color = color_passive

active = False


while True:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			pygame.quit()
			sys.exit()
	
		if event.type == pygame.MOUSEBUTTONDOWN:
			if input_rect.collidepoint(event.pos):
				active = True
			else:
				active = False


		if event.type == pygame.KEYDOWN:
			if active == True:
				if event.key == pygame.K_BACKSPACE:
					user_text = user_text[:-1]
				else:
					user_text += event.unicode

	screen.fill((0,0,0))
	
	if active:
		color = color_passive

	pygame.draw.rect(screen,color,input_rect,2)
	
	text_surface = base_font.render(user_text,True,(255,255,255))
	screen.blit(text_surface, (input_rect.x + 5, input_rect.y + 5))
	

	input_rect.w = max(100, text_surface.get_width() + 10)
	
	pygame.display.flip()
	clock.tick(60)
Das Problem bei der Sache ist, dass den code sich in der ganzen mainschleife verteilt und ich es gerne als funktion haben kann so dass ich zB so was machen kann:
texteingabe(x,y,höhe,länge,textvariabel) oder so ähnlich
Henri.py
User
Beiträge: 20
Registriert: Sonntag 28. März 2021, 15:33

Ich würde mich sehr über eure Hilfe freuen
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: wie ich gerade sehe, hat __blackjack__ dir schon im Grunde das exakt gleiche hier geschrieben, Code inklusive: viewtopic.php?f=1&t=52253#p388603

Warum hast du dich dem nicht angenommen?

Urspruengliche Antwort:

Eine Funktion ist dafuer nicht das richtige Konstrukt. Fuer so etwas braucht man eine Klasse, weil du ja Zustand (die Eingabe des Users, Fokus) *pro* Eingabefeld hast. Und dann brauchst du einen Hautpschleife, die ueber alle deine Spielobjekte iteriert, und jedes von denen bekommt die Gelegenheit, auf die verschiedenen Ereignisse zu reagieren. Ganz grob skizziert:

Code: Alles auswählen

class InputField:

   def __init__(self, rect):
        self._rect = rect
        self._focussed = False
        ....

   def on_mouse_pressed(self, event):
        sefl._focussed = self.rect.collidepoint(event.pos)

   def on_keypress(self, event):
       if self._focussed:
             .... # tuwas mit dem event

def main():
      game_objects = []
      ... # setup alles Game-Objekte

     while True:
           for event in pygame.event.get():
                 if event is mouse press event:
                        for game_object in game_objects:
                               game_object.on_mouse_pressed(event)
....
Antworten