проблема с областью события щелчка Python в Pygame - PullRequest
1 голос
/ 18 февраля 2011

Я создал класс GameObject, используя библиотеку python pygame, которая рисует прямоугольник на экране. Я хотел бы интегрировать обработчик событий, который позволил бы мне нарисовать прямоугольник вокруг, однако события щелчка для GameObject не регистрируются. Вот пара фрагментов кода из класса:

def on_event(self, event):

    if event.type == pygame.MOUSEBUTTONDOWN:
        print "I'm a mousedown event!"
        self.down = True
        self.prev_x=pygame.mouse.get_pos(0)
        self.prev_y=pygame.mouse.get_pos(1)

    elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
        self.down = False

def on_draw(self, surface):

    #paints the rectangle the particular color of the square
    pygame.draw.rect(surface, pygame.Color(self.red, self.green, self.blue), self.geom)`

Нужно ли превращать прямоугольник в изображение для регистрации событий мыши, или есть какой-то другой способ, которым я могу перетащить это поле?

1 Ответ

1 голос
/ 21 апреля 2011

Нужно ли превратить прямоугольник в изображение для регистрации событий мыши, или есть какой-то другой способ, которым я могу перетащить это поле?

Изображение не требуется. Решение:

Примечание:

  1. Вы уже используете событие, чтобы получить MOUSEMOTION, поэтому используйте данные события: .pos и .button из события.

  2. использовать Color класс для хранения в виде одной переменной:

    self.color_bg = Color ("синий") self.color_fg = Color (20,20,20) печать self.color_bg.r, self.color_bg.g, self.color_bg.b

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

# it uses
x,y = event.pos
if b.rect.collidepoint( (x,y) ):
# you could do (the same thing)
if b.rect.collidepoint( event.pos* ):

Решение:

import pygame
from pygame.locals import *
from random import randint

class Box(object):
    """simple box, draws rect and Color"""
    def __init__(self, rect, color):
        self.rect = rect
        self.color = color
    def draw(self, surface):
        pygame.draw.rect(surface, self.color, self.rect)

    class Game(object):
    def __init__(self):
        # random loc and size boxes
        # target = box to move
        self.target = None

        for i in range(5):
            x,y = randint(0, self.width), randint(0, self.height)
            size = randint(20, 200)

            r = Rect(0,0,0,0)
            # used 0 because: will be using propery, but have to create it first
            r.size = (size, size)
            r.center = (x, y)
            self.boxes.append( Box(r, Color("red") ))

    def draw(self):
        for b in self.boxes: b.draw()

    def on_event(self, event):
        # see: http://www.pygame.org/docs/ref/event.html

        if event.type == MOUSEBUTTONDOWN and event.button = 1:
            # LMB down = target if collide
            x,y = event.pos
            for b in self.boxes:
                if b.rect.collidepoint( (x,y) ): self.target = b

        elif event.type == MOUSEBUTTONUP and event.button = 1:
            # LMB up : untarget
            self.target = None

        elif event.type == MOUSEMOTION:
            x,y = event.pos
            # is a valid Box selected?
            if self.target is not None:
                self.target.rect.center = (x,y)
...