Как нарисовать новый прямоугольник на каждом клике, не удаляя другие? - PullRequest
1 голос
/ 26 февраля 2020

Я новичок в Pygame, и я пытаюсь заставить игру рисовать новый прямоугольник при каждом щелчке мыши (без удаления предыдущих), и я просто не могу понять, как это сделать ...: \

Я однажды делал игру Ti c -ta c -папка с pygame, и у меня не было этой проблемы, и кажется, что я делал все почти одинаково ...

Так что любая помощь и / или объяснение будет высоко оценено.

import pygame, sys, random
from settings import *
from buttonClass import *

class App:

    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode((WIDTH, HEIGHT))
        self.running = True
        self.grid = testboard
        self.selected = None
        self.mousePos = None
        self.state = "playing"
        self.playingButtons = []
        self.endButtons = []
        self.loadButtons()

    def run(self):
        while self.running:
            if self.state == "playing":
                self.playing_events()
                self.playing_update()
                self.playing_draw()
        pygame.quit()
        sys.exit()

#### PLAYING STATE ####

    def playing_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                selected = self.mouseOnGrid()
                if selected:
                    self.selected = selected
                else:
                    print("not on board")
                    self.selected = None

    def playing_update(self):
        self.mousePos = pygame.mouse.get_pos()

    def playing_draw(self):
        self.window.fill(WHITE)
        if self.selected:
            self.drawSelection(self.window, self.selected)
            #pygame.display.update()
        self.drawGrid(self.window)
        pygame.display.update()


#### HELPER FUNCTIONS #####

    def drawSelection(self, window, pos):
        pygame.draw.rect(window, RED, ((pos[0]*cellSize)+gridPos[0], (pos[1]*cellSize)+gridPos[1], cellSize, cellSize))

    def drawGrid(self, window):
        pygame.draw.rect(window, BLACK, (gridPos[0], gridPos[1], WIDTH-150, HEIGHT-150), 2)
        for x in range(5):
            pygame.draw.line(window, BLACK, (gridPos[0] + (x * cellSize), gridPos[1]), (gridPos[0] + (x * cellSize), gridPos[1] + 450))
            pygame.draw.line(window, BLACK, (gridPos[0], gridPos[1]+ (x * cellSize)), (gridPos[0] + 450, gridPos[1] + (x * cellSize)))

    def mouseOnGrid(self):
        if self.mousePos[0] < gridPos[0] or self.mousePos[1] < gridPos[1]:
            return False
        if self.mousePos[0] > gridPos[0] + gridSize or self.mousePos[1] > gridPos[1] + gridSize:
            return False
        return ((self.mousePos[0]-gridPos[0])//cellSize, (self.mousePos[1]-gridPos[1])//cellSize)

    def loadButtons(self):
        pass 

- вот файл settings.py, если вы хотите его протестировать.

WIDTH = 600
HEIGHT = 600

# Colors
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)

# boards
testboard = [
        ["", "", "", "", ""],
        ["", "", "", "", ""],
        ["", "", "", "", ""],
        ["", "", "", "", ""],
        ["", "", "", "", ""]
    ]

# posiotons and sizes
gridPos = (75,100)
cellSize = 90
gridSize = cellSize*5

1 Ответ

1 голос
/ 26 февраля 2020

В Playing_draw, когда вы заполняете окно белым цветом, вы удаляете все предыдущие прямоугольники. Затем вы рисуете только тот прямоугольник, который вы выбрали в последний раз.

Чтобы нарисовать все прямоугольники, которые вы выбрали ранее, вам необходимо отслеживать их все.

Инициализировать self.selected для набора. Список также будет достаточным, но в конечном итоге он может содержать дубликаты.

    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode((WIDTH, HEIGHT))
        self.running = True
        self.grid = testboard
        self.selected = set()
        self.mousePos = None
        self.state = "playing"
        self.playingButtons = []
        self.endButtons = []
        self.loadButtons()

Затем, при каждом щелчке, добавьте выбор к self.selected

    def playing_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                selected = self.mouseOnGrid()
                if selected:
                    self.selected.add(selected)
                else:
                    print("not on board")
                    self.selected = None

Наконец, используйте al oop чтобы нарисовать все выделенные прямоугольники в playing_draw.

    def playing_draw(self):
        self.window.fill(WHITE)
        for selected in self.selected:
            self.drawSelection(self.window, selected)
        self.drawGrid(self.window)
        pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...