Python Pygame矩形移动
我是个新手。我设法创建了一个类来绘制一个rect 我将使用这个类创建多个形状,并尝试在单击形状时移动它。但在我创建更多形状之前,我必须确保我可以移动它。 但我甚至没有成功地移动一个形状 示例.pyPython 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
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)