Как нарисовать квадрат, где бы вы ни щелкнули в окне Pygame - PullRequest
0 голосов
/ 05 сентября 2018

Вы, наверное, знаете, что я хочу сделать из названия, но вот простой пример:

#User clicks somewhere in the pygame window
pos = cursorPosition()
#Function/Class that creates a square where the user clicked.

Я пробовал это:

import pygame
import sys

running = True
pygame.init()
screen = pygame.display.set_mode((800, 500))
pos = pygame.mouse.get_pos()

class Create():
    cx, cy = pygame.mouse.get_pos()
    square = pygame.Rect(cx, cy, 50, 50)
    def cube(self):
        self.square = pygame.Rect(self.cx, self.cy, 50, 50)
        pygame.draw.rect(screen, (255, 0, 0), self.square)
        pygame.display.flip()
create = Create()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            create.cube()
        screen.fill((0, 255, 0))
        pygame.display.flip()


pygame.quit()
sys.exit()

Но он просто дает мне синий экран, и когда я щелкаю в любом месте, он ничего не делает, поэтому, если вы можете мне помочь, это будет очень цениться. Спасибо!

РЕДАКТИРОВАТЬ: Мне удалось это сделать, но теперь я столкнулся с другой проблемой: Квадрат появится, только если я удержу кнопку мыши. Это код

import pygame
import sys

running = True
pygame.init()
screen = pygame.display.set_mode((800, 500))
pos = pygame.mouse.get_pos()

class Create():
    cx, cy = pygame.mouse.get_pos()
    square = pygame.Rect(cx, cy, 50, 50)
    def cube(self):
        self.cx, self.cy = pygame.mouse.get_pos()
        self.square = pygame.Rect(self.cx, self.cy, 50, 50)
        pygame.draw.rect(screen, (255, 0, 0), self.square)
        pygame.display.flip()
create = Create()

while running:
    screen.fill((0, 255, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            create.cube()
        pygame.display.flip()


pygame.quit()
sys.exit()

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я также сталкивался с этой проблемой, и после долгих раздумий и разочарований я обнаружил следующее:

import sys
import pygame
import time

pygame.init()

white = (255, 255, 255)
red = (255, 0, 0)
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("OwO")
mouse_cords = []
clicked = False

def draw(cord_list, zero):
    ''' This is what will draw on the screen when the mouse clicks using recursion'''
    pygame.draw.circle(screen, red, cord_list[zero], 100, 1)
    zero += 1
    if len(cord_list) > zero:
        draw(cord_list, zero)

done = False

clock = pygame.time.Clock()


while not done:

    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            done = True 
    screen.fill(white)
    if pygame.mouse.get_pressed()[0]:
        mouse_cords.append(pygame.mouse.get_pos())
        clicked = True

    if clicked == True:
        draw(mouse_cords, 0)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Как вы можете сказать, я использовал рекурсию для решения этой проблемы. Извините, это круги, а не прямоугольники, но я уверен, что вы сможете понять, как это изменить.

0 голосов
/ 05 сентября 2018

Приятно видеть, что вы прилагаете большие усилия, чтобы решить эту проблему самостоятельно, и что вы редактируете вопрос с работой, которую вы проделали до сих пор!

То, что я добавил в код, в основном позволяет пользователю менять место рисования куба. Если вы хотите нарисовать несколько кубов, их позиции основаны на щелчках мышью пользователя, отредактируйте свой вопрос, чтобы добавить эти детали, и оставьте комментарий ниже.

Сначала я написал новый класс под названием Cube, который по сути имеет тот же код, что и Create. Я не буду вдаваться в подробности, но обычно в объектно-ориентированном программировании объекты - это существительные , а их методы - actions . Ваш класс противоположен, но это не то, как обычно пишется объектно-ориентированный код.

Я добавил метод update(), который просто обновляет некоторые из полей объекта *1014* в соответствии с положением мыши. Ваш исходный код определял поля класса или статические переменные . Я не буду вдаваться в подробности, но если бы мы создали 100 экземпляров куба, мы бы хотели иметь позиции для всех кубов , верно? В подобных случаях вы работаете с объектами , , а не с классом .

Затем, есть одна переменная, которая становится равной true после первого щелчка мыши, и в результате куб начинает рисоваться на экране.

Вот фиксированный код:

import pygame

running = True
pygame.init()
screen = pygame.display.set_mode((800, 500))

class Cube:
    def update(self):
        self.cx, self.cy = pygame.mouse.get_pos()
        self.square = pygame.Rect(self.cx, self.cy, 50, 50)

    def draw(self): 
        pygame.draw.rect(screen, (255, 0, 0), self.square)

cube = Cube()
drawing_cube = False

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            cube.update()
            drawing_cube = True     

    screen.fill((0, 255, 0))
    if drawing_cube:
        cube.draw()
    pygame.display.flip()


pygame.quit()
quit()

Я надеюсь, что этот ответ помог вам, и если у вас есть дополнительные вопросы, пожалуйста, оставьте комментарий ниже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...