【问题标题】:Pygame rectangle movePygame矩形移动
【发布时间】:2014-12-02 05:31:57
【问题描述】:

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

【问题讨论】:

  • 有什么问题?什么都没发生?崩溃?
  • 形状不动。没有崩溃。

标签: python pygame move rect


【解决方案1】:

您的game_start 函数中有一个while True 块,但循环实际上并没有绘制屏幕。事实上,您的循环也不会调用 game_settings() 来更新矩形的状态。

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

你需要一些pygame.display.update的化身,具体细节我不记得了,因为我已经有一段时间没有做过pygame了。

【讨论】:

  • 我认为这不是解决方案,因为我在尝试移动矩形后确实调用了 pygame.display.update。编辑:我刚试过,没用。
  • 但是 game_settings 没有在你的 while 循环中被调用。所以你的程序所做的是调用game_settings,创建矩形,移动它,更新显示。然后你打电话给game_start,在你的while循环中,你的“主游戏循环”可以这么说,你什么都不做,只是等待一个QUIT事件。尝试在您的pygame.display.update() 调用之前放置一个print("updating display"),看看它只被调用一次。
  • 我知道。但正如你所说:'所以你的程序所做的是调用 game_settings,创建矩形,移动它,更新显示。但不知何故它不动。
  • 那是因为您在更新显示之前调用了rect.move()。所以在显示被绘制之前,矩形已经移动了。它被绘制在新的位置,并且似乎永远不会移动。此外,即使您在移动之前和之后移动了显示更新调用,您也不会看到它移动,因为它会在应用启动时几乎是瞬时的。
  • 正如我之前所说,它不动。形状出现在 (0,0) 而不是 (40,50)
【解决方案2】:

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

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 方法,因此该类如下所示:

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 的本地地址,因此您无法在此函数之外访问它。这个函数可能应该返回对象列表,这样你就可以对它们做一些实际的事情了。

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多