4 Stimmen

Erstellen eines Rechteckgitters in Pygame

Ich muss ein klickbares 8 x 8 Raster in Pygame erstellen. Im Moment habe ich etwas wie dieses:

#!/usr/bin/python2
#-------------------------------------------------------------------------------
# Imports & Inits
import pygame, sys
from pygame.locals import *
pygame.init()
#-------------------------------------------------------------------------------
# Settings
WIDTH = 105
HEIGHT = 105
FPS = 60
#-------------------------------------------------------------------------------
# Screen Setup
WINDOW = pygame.display.set_mode([WIDTH,HEIGHT])
CAPTION = pygame.display.set_caption('Test')
SCREEN = pygame.display.get_surface()
TRANSPARENT = pygame.Surface([WIDTH,HEIGHT])
TRANSPARENT.set_alpha(255)
TRANSPARENT.fill((255,255,255))
#-------------------------------------------------------------------------------
# Misc stuff
rect1 = pygame.draw.rect(SCREEN, (255, 255, 255), (0,0, 50, 50))
rect2 = pygame.draw.rect(SCREEN, (255, 255, 255), (0,55, 50, 50))
rect3 = pygame.draw.rect(SCREEN, (255, 255, 255), (55,0, 50, 50))
rect4 = pygame.draw.rect(SCREEN, (255, 255, 255), (55,55, 50, 50))

...

#-------------------------------------------------------------------------------
# Refresh Display
pygame.display.flip()
#-------------------------------------------------------------------------------
# Main Loop
while True: 
    pos = pygame.mouse.get_pos()
    mouse = pygame.draw.circle(TRANSPARENT, (0, 0, 0), pos , 0)
    # Event Detection---------------
    for event in pygame.event.get(): 
        if event.type == QUIT: 
            sys.exit() 
        elif event.type == MOUSEBUTTONDOWN:
            if rect1.contains(mouse):
                rect1 = pygame.draw.rect(SCREEN, (155, 155, 155), (0,0, 50, 50))
                pygame.display.flip()

In meinem ursprünglichen Code habe ich viel mehr Rechtecke, und ich brauche eine Möglichkeit, so etwas zu tun:

for i in rectangles:
    if i hasbeenclickedon:
          change color

Offensichtlich ist meine Lösung viel zu statisch. Wie könnte ich das also bewerkstelligen?

4voto

Johannes Charra Punkte 28183

Obwohl Ihre Lösung in der Tat ein wenig umständlich ist, würde ich zunächst sagen

rectangles = (rect1, rect2, ...)

dann können Sie wie vorgesehen über sie iterieren.

Versuchen Sie etwas wie

pos = pygame.mouse.get_pos()
for rect in rectangles:
    if rect.collidepoint(pos):
        changecolor(rect)

Sie müssen die changecolor Methode, versteht sich.

Im Allgemeinen würde ich empfehlen, eine Klasse für Ihre klickbaren Felder zu erstellen, die eine Methode definiert changecolor .

0voto

ninMonkey Punkte 6910

Einfache "menschliche" Farben:

Color("red")
Color(255,255,255)
Color("#fefefe")

Verwendung:

import pygame
# This makes event handling, rect, and colors simpler.
# Now you can refer to `Sprite` or `Rect()` vs `pygame.sprite.Sprite` or `pygame.Rect()`
from pygame.locals import *
from pygame import Color, Rect, Surface

pygame.draw.rect(screen, Color("blue"), Rect(10,10,200,200), width=0)
pygame.draw.rect(screen, Color("darkred"), Rect(210,210,400,400), width=0)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X