Pygame矩形移动

时间:2014-10-07 17:41:38

标签: python pygame move rect

我对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()

2 个答案:

答案 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_arraycreate_objects的本地,因此您无法在此功能之外访问它。此函数应该返回对象列表,以便您可以实际使用它们。