Python Pygame矩形移动

Python Pygame矩形移动,python,pygame,move,rect,Python,Pygame,Move,Rect,我是个新手。我设法创建了一个类来绘制一个rect 我将使用这个类创建多个形状,并尝试在单击形状时移动它。但在我创建更多形状之前,我必须确保我可以移动它。 但我甚至没有成功地移动一个形状 示例.py import pygame, sys from pygame.locals import * # Global variables whiteColor = (255, 255, 255) darkColor = (51, 51, 51) lightColor = (83, 83, 83) bla

我是个新手。我设法创建了一个类来绘制一个rect

我将使用这个类创建多个形状,并尝试在单击形状时移动它。但在我创建更多形状之前,我必须确保我可以移动它。 但我甚至没有成功地移动一个形状

示例.py

import pygame, sys
from pygame.locals import *

# Global variables

whiteColor = (255, 255, 255)
darkColor = (51, 51, 51)
lightColor = (83, 83, 83)
blackColor = (0, 0, 0)

# Classes

class obj_disk(object):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, blackColor, (0,0,234,32))

# Methods

def game_settings():
    """
    Manage all the main settings for the game.
    @Global screen: The main window
    """

    global screen

    pygame.init()
    pygame.display.set_caption("Towers of Hanoi")
    pygame.time.Clock().tick(60)
    pygame.time.wait(10)

    screen = pygame.display.set_mode([800,600])
    screen.fill(darkColor)

    create_objects()

    pygame.display.update()

def create_objects():
    """
    Creates all the objects that are required to play the game.
    """

    # Create disks
    disk_array = []
    for i in range(0,1):
        disk_array.append(obj_disk())

    disk_array[0].rect.move(40,50)

def game_start():
    """
    Starts the game and handles all the events.
    """

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ == '__main__':
    game_settings()
    game_start()

游戏开始
功能中有一个
while True
块,但循环实际上并没有绘制屏幕。实际上,循环也不会调用
game\u settings()
来更新矩形的状态

一般来说,游戏主循环需要更新对象的状态,然后绘制屏幕


你需要一些pygame.display.update的化身,我不记得这些细节了,因为我很久没有做pygame了。

你的代码有几个问题。主要有:

disk_array[0].rect.move(40,50)
请参阅以下文档:

返回按给定偏移量移动的新矩形

由于不使用调用
移动的返回值,因此此行不做任何操作。如果要实际更改
Rect
,请使用:

与Rect.move()方法相同,但操作到位

所以把那行改成

disk_array[0].rect.move_ip(40,50)
下一个问题是,在更改rect后,您不会将其绘制到屏幕上。您只需在
obj\u disk
的初始值设定项中绘制到屏幕:

def __init__(self):
    self.rect = pygame.draw.rect(screen, blackColor, (0,0,234,32))
如果你真的想使用一个类,你应该在初始化器中设置
rect
。现在,您可以决定是否要在
obj_disk
类中处理实际图形,如果需要,只需添加一个
draw
方法,该类如下所示:

class obj_disk(object):
    def __init__(self):
        self.rect = pygame.rect.Rect(0,0,234,32)
    def draw(self):
        pygame.draw.rect(screen, blackColor, self.rect)
现在,您可以使用绘制对象

for obj in disk_array:
    obj.draw()
的末尾创建\u对象


请注意,
disk\u array
create\u objects
的本地对象,因此您不能在此函数之外访问它。此函数可能会返回对象列表,以便您可以实际使用它们

有什么问题吗?什么都没发生?撞车?形状不动。没有崩溃。我不认为这是解决方案,因为我在尝试移动rect后调用了pygame.display.update。编辑:我刚试过,没用。但是你的while循环中没有调用
game\u settings
。因此,您的程序所做的就是调用
游戏设置
,创建矩形,移动它,更新显示。然后调用
game\u start
,在while循环中,也就是说,在“主游戏循环”中,除了等待退出事件,您什么也不做。尝试在调用
pygame.display.update()
之前放置一个
print(“更新显示”)
,并确保只调用一次。我知道。但正如您所说:“因此,您的程序所做的就是调用游戏设置,创建矩形,移动它,更新显示。”但不知何故,它没有移动。这是因为您在更新显示之前调用了
rect.move()
。因此,在绘制显示之前,矩形已经移动。它被画在它的新位置上,而且似乎从未移动过。此外,即使你在移动之前和之后移动了显示更新调用,你也不会看到它移动,因为当应用程序启动时,它几乎是瞬间的光点。正如我之前所说,它不会移动。形状显示在(0,0)处,而不是(40,50)