我对pygame很新。我设法创建了一个绘制矩形的类。
我将使用此类创建多个形状,并在单击时尝试移动形状。但在我创造更多形状之前,我必须确保我可以移动它。 但是我甚至没有成功地移动一个形状。
Example.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()
答案 0 :(得分:0)
您的while True
功能中有game_start
个阻止,但循环实际上没有绘制屏幕。实际上,您的循环并不会调用game_settings()
来更新矩形的状态。
一般来说,主游戏循环需要更新对象的状态,然后绘制屏幕。
你需要pygame.display.update
的一些化身,我不记得这些具体细节,因为我很长一段时间没有做过pygame。
答案 1 :(得分:0)
您的代码有几个问题。主要是:
disk_array[0].rect.move(40,50)
查看Rect.move
的文档:
返回由给定偏移量移动的新矩形。
由于您没有使用move
调用的返回值,因此该行不执行任何操作。如果您想实际更改Rect
,请使用move_ip
:
与Rect.move()方法相同,但在适当的位置运行。
所以将该行更改为
disk_array[0].rect.move_ip(40,50)
下一个问题是您在更改后不会将矩形绘制到屏幕上。您只需在初始化程序obj_disk
中绘制到屏幕:
def __init__(self):
self.rect = pygame.draw.rect(screen, blackColor, (0,0,234,32))
如果你真的想要使用一个类,你应该在初始化器中设置rect
。现在取决于你是否想要处理obj_disk
类中的实际绘图,如果你愿意,你可以简单地添加一个draw
方法,所以这个类看起来像: p>
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()
在create_objects
的末尾。
请注意,disk_array
是create_objects
的本地,因此您无法在此功能之外访问它。此函数应该返回对象列表,以便您可以实际使用它们。