파이 게임에서 스택 이미지 클릭 오류 [중복]
Dec 01 2020
이미지를 클릭하고 드래그하여 특정 지점에서 스택하는 코드를 만들었습니다. 처음 몇 번의 클릭으로 잘 작동했지만 같은 지점에 여러 번 쌓았을 때 갑자기 클릭 할 수 없게됩니다. 어떻게 고칠 수 있고 괜찮다면 더 작게 만들 수 있습니까?
import pygame
from pygame import *
import sys
import os
pygame.init()
s_width = 640
s_height = 480
screen = pygame.display.set_mode((s_width, s_height))
pygame.display.set_caption("TITLE")
bigfont = pygame.font.SysFont(None, 50)
smallfont = pygame.font.SysFont(None, 25)
title = bigfont.render("TITLE", True, (0,0,0))
current_path = os.path.dirname(__file__)
img_path = os.path.join(current_path, "images")
img_list = []
place_list = []
temp = []
class Img_Set:
def __init__(self, path, x_pos, y_pos):
self.image = pygame.image.load(path)
self.x_pos = x_pos
self.y_pos = y_pos
self.rect = self.image.get_rect()
self.rect.left = self.x_pos
self.rect.top = self.y_pos
img_list.append(self)
self.click = False
def offset(self):
self.offset_len_x = event.pos[0] - self.x_pos
self.offset_len_y = event.pos[1] - self.y_pos
def drag(self):
self.x_pos = event.pos[0] - self.offset_len_x
self.y_pos = event.pos[1] - self.offset_len_y
self.rect.left = self.x_pos
self.rect.top = self.y_pos
class Place_Set:
def __init__(self, path, x_pos, y_pos):
self.image = pygame.image.load(path)
self.x_pos = x_pos
self.y_pos = y_pos
self.rect = self.image.get_rect()
self.rect.left = self.x_pos
self.rect.top = self.y_pos
place_list.append(self)
self.click = False
img1 = Img_Set("images/80x80_blueball.png", s_width/3, s_height/3)
img2 = Place_Set("images/80x80_ball.png", s_width/2, s_height/3)
img3 = Place_Set("images/80x80_greenball.png", s_width/3*2, s_height/3)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
if event.button == 1:
for x in img_list:
if x.rect.collidepoint(event.pos):
temp.append(x)
if len(temp) > 0:
temp[-1].offset()
temp[-1].click = True
img_list.remove(temp[-1])
img_list.append(temp[-1])
temp = []
elif event.type == MOUSEMOTION:
for x in img_list:
if x.click:
x.drag()
elif event.type == MOUSEBUTTONUP:
for x in img_list:
for y in place_list:
if x.rect.colliderect(y.rect):
x.x_pos = y.x_pos
x.y_pos = y.y_pos
for x in img_list:
x.click = False
screen.fill((255, 255, 255))
for x in place_list:
screen.blit(x.image, (x.x_pos, x.y_pos))
for x in img_list:
screen.blit(x.image, (x.x_pos, x.y_pos))
pygame.display.update()
gif를 실행하는 코드는 아래에 있습니다.
https://i.stack.imgur.com/vAQyU.gif
답변
2 Rabbid76 Dec 01 2020 at 23:31
rect
마우스 버튼을 놓았을 때 속성 업데이트를 놓쳤습니다 . 이미지를 드래그 할 때 x
, y
및 rect
속성 사이에 오류 오프셋이 발생 합니다.
while True:
for event in pygame.event.get():
# [...]
elif event.type == MOUSEBUTTONUP:
for x in img_list:
for y in place_list:
if x.rect.colliderect(y.rect):
x.x_pos = y.x_pos
x.y_pos = y.y_pos
x.rect.left = y.x_pos # <-- ADD
x.rect.top = y.y_pos # <-- ADD

그러나 x
및 y
속성 은 전혀 필요하지 않습니다 . 대신 rect 속성에 저장된 위치를 사용하십시오.
import pygame
from pygame import *
import sys
import os
pygame.init()
s_width = 640
s_height = 480
screen = pygame.display.set_mode((s_width, s_height))
pygame.display.set_caption("TITLE")
bigfont = pygame.font.SysFont(None, 50)
smallfont = pygame.font.SysFont(None, 25)
title = bigfont.render("TITLE", True, (0,0,0))
current_path = os.path.dirname(__file__)
img_path = os.path.join(current_path, "images")
img_list = []
place_list = []
temp = []
class Img_Set:
def __init__(self, path, x_pos, y_pos):
self.image = path # pygame.image.load(path)
self.rect = self.image.get_rect()
self.rect.left = x_pos
self.rect.top = y_pos
img_list.append(self)
self.click = False
def offset(self):
self.offset_len_x = event.pos[0] - self.rect.x
self.offset_len_y = event.pos[1] - self.rect.y
def drag(self):
self.rect.x = event.pos[0] - self.offset_len_x
self.rect.y = event.pos[1] - self.offset_len_y
class Place_Set:
def __init__(self, path, x_pos, y_pos):
self.image = path # pygame.image.load(path)
self.rect = self.image.get_rect()
self.rect.left = x_pos
self.rect.top = y_pos
place_list.append(self)
self.click = False
img1 = Img_Set("images/80x80_blueball.png", s_width/3, s_height/3)
img2 = Place_Set("images/80x80_ball.png", s_width/2, s_height/3)
img3 = Place_Set("images/80x80_greenball.png", s_width/3*2, s_height/3)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
if event.button == 1:
for x in img_list:
if x.rect.collidepoint(event.pos):
temp.append(x)
if len(temp) > 0:
temp[-1].offset()
temp[-1].click = True
img_list.remove(temp[-1])
img_list.append(temp[-1])
temp = []
elif event.type == MOUSEMOTION:
for x in img_list:
if x.click:
x.drag()
elif event.type == MOUSEBUTTONUP:
for x in img_list:
for y in place_list:
if x.rect.colliderect(y.rect):
x.rect.x = y.rect.x
x.rect.y = y.rect.y
for x in img_list:
x.click = False
screen.fill((255, 255, 255))
for x in place_list:
screen.blit(x.image, x.rect)
for x in img_list:
screen.blit(x.image, x.rect)
pygame.display.update()