【问题标题】:How to update the positional coordinates of my rect?如何更新我的矩形的位置坐标?
【发布时间】:2020-11-07 21:00:54
【问题描述】:

我正在创建一个记忆卡游戏,但在更新每个盒子的矩形起始位置时遇到了困难。第一个 for 循环加载每个图像,第二个获取每个图像的起始位置。当我进行碰撞测试时,它只回答 因为我的矩形位置没有更新。我该如何更新?

import pygame, sys
from pygame.locals import *

screen_height = 800
screen_width = 800
card_x_size = 125
card_y_size = 175
marginx = 45
marginy = 25

class Box():
    def __init__(self,image):
        self.image = image
        self.rect = image.get_rect()

    def draw(self,screen):
        screen.blit(self.image, self.rect)

def play_game():
    pygame.init()
    screen = pygame.display.set_mode((screen_width, screen_height))

    back_images = ['back.jpg']*16
    back_image_list = []
    for back_image in back_images:
        back_pic = pygame.image.load(back_image)
        back_pic = pygame.transform.scale(back_pic, (card_x_size,card_y_size))
        back_image_list.append(back_pic)
        rect = back_pic.get_rect()

    boxes = [Box(img) for img in back_image_list]


    for j, box in enumerate(boxes):
        pos_x = marginx + j % 4 * available_spacex
        pos_y = marginy + j // 4 * available_spacey
        box.rect.topleft = (pos_x, pos_y)
        print(pos_x,pos_y)


    while True:
        mouse_clicked = False
        clicked_card = False
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEMOTION:
                mousex, mousey = event.pos
            elif event.type == MOUSEBUTTONUP:
                mouse_clicked = True
                print(mousex, mousey)
                if rect.collidepoint(mousex,mousey):
                    clicked_card = True
                    print("hit")

        for b in boxes:
            b.draw(screen)

        pygame.display.update()

play_game()

【问题讨论】:

  • 猜猜我的问题是如何将它放在我的第一个循环中?第一个循环遍历我的字符串列表元素,第二个遍历整数以获得位置
  • 我想我只需要更新矩形位置,这样当我调用碰撞测试时,它就会按照我想要的方式运行。只是不确定我如何从box.rect.topleft获取职位以更新到矩形
  • 请提供minimal reproducible example。您当前的代码包含许多未定义的变量,并且不包含您在问题文本中提到的print(rect) 语句。
  • 嘿@Rabbid76 是的,我已经尝试过了,它现在正在更新矩形位置(谢谢!)但现在不能正确地在屏幕上绘图,碰撞测试也不能正常工作。但谢谢你回答了我的主要问题

标签: python pygame rect


【解决方案1】:

您必须评估鼠标点击是否在box 对象之一上:

for box in boxes:
    if box.rect.collidepoint(mousex, mousey):
        clicked_card = True
        print("hit")

函数play_game:

def play_game():
    # [...]

    while True:
        mouse_clicked = False
        clicked_card = False
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEMOTION:
                mousex, mousey = event.pos
            elif event.type == MOUSEBUTTONUP:
                mousex, mousey = event.pos
                mouse_clicked = True
                print(mousex, mousey)
                for box in boxes:
                    if box.rect.collidepoint(mousex, mousey):
                        clicked_card = True
                        print("hit")

        for b in boxes:
            b.draw(screen)

        pygame.display.update()

【讨论】:

  • @doulikepeaches 所以你做错了。当然,您必须先设置位置。您必须在第二个循环之后执行此代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2023-04-07
  • 2020-02-17
相关资源
最近更新 更多