Pygame: Skalierung eines Bildes

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

Liebe Forum-User,

Ich habe gerade erst mit Pygame angefangen und deshalb ein vermutlich viele banales Problem, aber es will einfach nicht klappen. :lol:

Ich will einfach nur ein skalierbares Fenster erstellen mit einem Hintergrundbild. Das klappt alles auch so weit. doch wenn ich das Fenster dann maximiere oder durch am Rand ziehen vergrößer, skaliert das Hintergrundbild nicht mit. Zudem bleibt das alte kleinere Fenster als Bild auf dem größeren Fenster beim Maximieren erhalten.

Ich hoffe ihr versteht was ich meine.Ich hab lange gegoogelt und hab es eigentlich nur so gefunden wie ich es habe. Ich habe keine Idee mehr was ich noch ausprobieren kann.

Ich hoffe jemand von euch kann mir helfen.

Mein Code:

Code: Alles auswählen

import pygame 

def main():

    pygame.init()
    
    Hintergrundbild = "Holz.jpg"
    size = (600,400)
    screen = pygame.display.set_mode(size, pygame.RESIZABLE|pygame.DOUBLEBUF|pygame.HWSURFACE)
    
    pygame.display.set_caption("Mensch Ärger dich nicht!") #Fenstername
    pygame.mouse.set_visible(1) #Anzeigen der Maus
    
    clock = pygame.time.Clock() #Objekt, dass hilft die Zeit zu messen (Frameraten kontrolle)
    
    Hintergrund = pygame.image.load(Hintergrundbild).convert() #Konvert kreirt eine Kopie, die schnellergeladen wird
    
    
    running = 1
    while running:  #Solange running true, läuft das Fenster
        clock.tick(30)  #Framerate wird auf maximal 30 pro sekunde begrenzt
        screen.fill((0, 0, 0))  #RGB: = 0, 0, 0 : Schwarz
        
        for event in pygame.event.get():
            
            if event.type == pygame.QUIT:
                running = False  # Spiel wird beendet wenn ein QUIT-Event gefunden wird
                
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))
        
        screen.blit(pygame.transform.scale(Hintergrund,size), (0,0)) 
        pygame.display.flip()
    
    
if __name__ == "__main__":
    main()

Grüße
Der Barbar
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na du fragst ja auch nie wieder die Größe des geänderten Bildes ab. Gleiche eingabe == gleiche Ausgabe.

screen.get_ size()

sollte helfen.
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

screen.get_size() hat mir wrklich weitergeholfen. Danke.

hab jetzt ein neues event erstellt wo er immer die neue Größe abfragt und in die Größeneinstelung vom Bild einfügt.
cupo_56
User
Beiträge: 2
Registriert: Freitag 2. Juni 2023, 20:05

ich hab eine frage folgenden Code habe ich programmiert:
import pygame
import sys
import random

# Pygame initialisieren
pygame.init()

# Fenstergröße festlegen
WINDOW_SIZE = (400, 200)

# Fenster erstellen
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption('Farbauswahl')

# Farben definieren
RED = (255, 0, 0)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# Schriftart festlegen
font = pygame.font.Font(None, 36)

# Spielfarben
spielfarben = [
(RED, "Rot", False),
(GREEN, "Grün", False),
(YELLOW, "Gelb", False),
(BLUE, "Blau", False)
]

# Farbauswahl-Funktion für Spieler
def farbauswahl(spieler_nummer):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
for i, (farbe, name, gewaehlt) in enumerate(spielfarben):
if 50 + i * 80 <= mouse_pos[0] <= 50 + (i + 1) * 80 and 80 <= mouse_pos[1] <= 160:
if not gewaehlt:
spielfarben = (farbe, name, True)
return farbe

# Hintergrund füllen
screen.fill(WHITE)

# Farbauswahl anzeigen
for i, (farbe, name, gewaehlt) in enumerate(spielfarben):
if gewaehlt:
pygame.draw.rect(screen, (200, 200, 200), pygame.Rect(50 + i * 80, 80, 60, 60))
text = font.render(str(spieler_nummer), True, BLACK)
text_rect = text.get_rect(center=(50 + i * 80 + 30, 160))
screen.blit(text, text_rect)
else:
pygame.draw.rect(screen, farbe, pygame.Rect(50 + i * 80, 80, 60, 60))
text = font.render(name, True, BLACK)
text_rect = text.get_rect(center=(50 + i * 80 + 30, 160))
screen.blit(text, text_rect)

# Anzeige aktualisieren
pygame.display.flip()

# Spielerfarben wählen
spieler_farben = []
for spieler_nummer in range(1, 5):
farbe = farbauswahl(spieler_nummer)
spieler_farben.append(farbe)
spielfarben = [(color, name, gewaehlt) for color, name, gewaehlt in spielfarben if color != farbe]

# Fenstergröße festlegen
WINDOW_SIZE = (600, 600)

# Fenster erstellen
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption('Mensch Ärger Dich Nicht')

# Breite und Höhe eines einzelnen Quadrats
SQUARE_SIZE = WINDOW_SIZE[0] // 13

# Schriftart festlegen
font = pygame.font.Font(None, 36)

# Würfelfunktion
def wuerfeln():
return random.randint(1, 6)

# Position des Würfelquadrats
dice_square_x = 6
dice_square_y = 6

# Spielfigur-Klasse
class Spielfigur:
def __init__(self, color, start_x, start_y):
self.color = color
self.x = start_x
self.y = start_y

def draw(self):
pygame.draw.circle(screen, self.color, ((self.x + 0.5) * SQUARE_SIZE, (self.y + 0.5) * SQUARE_SIZE),
SQUARE_SIZE // 4)
pygame.draw.circle(screen, BLACK, ((self.x + 0.5) * SQUARE_SIZE, (self.y + 0.5) * SQUARE_SIZE),
SQUARE_SIZE // 4, 2)


# Erstellen der Spielfiguren
spielfiguren = []
for i, farbe in enumerate(spieler_farben):
if farbe == RED:
spielfiguren.extend([
Spielfigur(RED, 1, 1),
Spielfigur(RED, 1, 2),
Spielfigur(RED, 2, 1),
Spielfigur(RED, 2, 2)
])
elif farbe == GREEN:
spielfiguren.extend([
Spielfigur(GREEN, 10, 10),
Spielfigur(GREEN, 10, 11),
Spielfigur(GREEN, 11, 10),
Spielfigur(GREEN, 11, 11)
])
elif farbe == YELLOW:
spielfiguren.extend([
Spielfigur(YELLOW, 1, 10),
Spielfigur(YELLOW, 1, 11),
Spielfigur(YELLOW, 2, 10),
Spielfigur(YELLOW, 2, 11)
])
elif farbe == BLUE:
spielfiguren.extend([
Spielfigur(BLUE, 10, 1),
Spielfigur(BLUE, 10, 2),
Spielfigur(BLUE, 11, 1),
Spielfigur(BLUE, 11, 2)
])

# Spielhauptschleife
aktueller_spieler = -1
wurf_count = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
click_x = mouse_pos[0] // SQUARE_SIZE
click_y = mouse_pos[1] // SQUARE_SIZE
if click_x == dice_square_x and click_y == dice_square_y:
dice_value = wuerfeln()
if dice_value == 6:
# Setze Spielfigur des Spielers in das Startfeld
if spieler_farben[aktueller_spieler] == RED:
spielfiguren[aktueller_spieler * 4].x = 1
spielfiguren[aktueller_spieler * 4].y = 5
elif spieler_farben[aktueller_spieler] == GREEN:
spielfiguren[aktueller_spieler * 4].x = 11
spielfiguren[aktueller_spieler * 4].y = 7
elif spieler_farben[aktueller_spieler] == YELLOW:
spielfiguren[aktueller_spieler * 4].x = 5
spielfiguren[aktueller_spieler * 4].y = 11
elif spieler_farben[aktueller_spieler] == BLUE:
spielfiguren[aktueller_spieler * 4].x = 7
spielfiguren[aktueller_spieler * 4].y = 1
else:
if spielfiguren[aktueller_spieler * 4].x != -1 or dice_value == 6:
# Vorwärtsbewegung um die gewürfelte Zahl
if spielfiguren[aktueller_spieler * 4].x != -1:
new_x = spielfiguren[aktueller_spieler * 4].x + dice_value
new_y = spielfiguren[aktueller_spieler * 4].y

if new_x > 12:
steps_to_goal = new_x - 12
if new_y == 6 and steps_to_goal <= 4:
new_x = 6 + steps_to_goal
new_y = aktueller_spieler * 3 + 7
else:
new_x = spielfiguren[aktueller_spieler * 4].x
new_y = spielfiguren[aktueller_spieler * 4].y
else:
if new_x == 6 and new_y >= aktueller_spieler * 3 + 7 and new_y <= aktueller_spieler * 3 + 10:
new_x = spielfiguren[aktueller_spieler * 4].x
new_y = spielfiguren[aktueller_spieler * 4].y

spielfiguren[aktueller_spieler * 4].x = new_x
spielfiguren[aktueller_spieler * 4].y = new_y

if wurf_count >= 3 or (spielfiguren[aktueller_spieler * 4].x == -1 and dice_value != 6):
aktueller_spieler += 1
if aktueller_spieler >= len(spieler_farben):
aktueller_spieler = 0
wurf_count = 0

# Hintergrund füllen
screen.fill(WHITE)

# Gitter zeichnen
for x in range(13):
for y in range(13):
color = (255, 255, 255)

# Team-Bereiche farbig machen
if 1 <= x < 3 and 1 <= y < 3:
color = RED
elif 10 <= x < 12 and 1 <= y < 3:
color = BLUE
elif 1 <= x < 3 and 10 <= y < 12:
color = YELLOW
elif 10 <= x < 12 and 10 <= y < 12:
color = GREEN

# Zielfelder farbig machen
if 2 <= x < 6 and y == 6:
color = RED
elif x == 6 and 7 <= y < 11:
color = YELLOW
elif x == 6 and 2 <= y < 6:
color = BLUE
if 7 <= x < 11 and y == 6:
color = GREEN

# Startfelder
if 1 <= x < 2 and y == 5:
color = RED
elif x == 5 and 11 <= y < 12:
color = YELLOW
elif x == 7 and 1 <= y < 2:
color = BLUE
if 11 <= x < 12 and y == 7:
color = GREEN

pygame.draw.rect(screen, color, pygame.Rect(x * SQUARE_SIZE, y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE))
pygame.draw.rect(screen, BLACK, pygame.Rect(x * SQUARE_SIZE, y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE), 1)

# Feld, in dem das Würfelergebnis angezeigt wird
pygame.draw.rect(screen, (200, 200, 200),
pygame.Rect(dice_square_x * SQUARE_SIZE, dice_square_y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE))

# Würfelrand in Spielerfarbe zeichnen
pygame.draw.rect(screen, spieler_farben[aktueller_spieler],
pygame.Rect(dice_square_x * SQUARE_SIZE, dice_square_y * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE), 4)

# Würfelergebnis anzeigen, wenn vorhanden
if 'dice_value' in locals():
text = font.render(str(dice_value), True, BLACK)
text_rect = text.get_rect(center=((dice_square_x + 0.5) * SQUARE_SIZE, (dice_square_y + 0.5) * SQUARE_SIZE))
screen.blit(text, text_rect)

# Spielfiguren zeichnen
for spielfigur in spielfiguren:
spielfigur.draw()

# Anzeige aktualisieren
pygame.display.flip()


ich moechte die unnoetigen felder ausblenen und das spielfeld kreuzfoermig darstellen wie das originale mensch aeger dihc nicht allerding weiss ich nicht wie.
hat jemand eine ahnung
Antworten