Python Pygame用OOP绘制矩形

Python Pygame用OOP绘制矩形,python,pygame,Python,Pygame,我正在尝试用pygame学习OOP并制作一个简单的游戏,我大致遵循了一个教程,但试图修改它以适应我自己的需要,现在它不起作用了。我试图在黑色窗口上绘制一个白色矩形,教程在黑色窗口上绘制一个蓝色圆圈,当我将圆圈替换为矩形时,它不起作用。 我的代码被分成两个不同的文件,第一个文件是: import pygame import LanderHandler black = (0, 0, 0) white = (255, 255, 255) green = (0, 255, 0) red = (255,

我正在尝试用pygame学习OOP并制作一个简单的游戏,我大致遵循了一个教程,但试图修改它以适应我自己的需要,现在它不起作用了。我试图在黑色窗口上绘制一个白色矩形,教程在黑色窗口上绘制一个蓝色圆圈,当我将圆圈替换为矩形时,它不起作用。 我的代码被分成两个不同的文件,第一个文件是:

import pygame
import LanderHandler

black = (0, 0, 0)
white = (255, 255, 255)
green = (0, 255, 0)
red = (255, 0, 0)


class MainLoop(object):
    def __init__(self, width=640, height=400):

        pygame.init()
        pygame.display.set_caption("Lander Game")
        self.width = width
        self.height = height
        self.screen = pygame.display.set_mode((self.width, self.height), pygame.DOUBLEBUF)
        self.background = pygame.Surface(self.screen.get_size()).convert()

    def paint(self):
        lander = LanderHandler.Lander()
        lander.blit(self.background)

    def run(self):

        self.paint()
        running = True

        while running:

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        running = False

            pygame.display.flip()

        pygame.quit()


if __name__ == '__main__':
    # call with width of window and fps
    MainLoop().run()
还有我的第二个文件:

import pygame

black = (0, 0, 0)
white = (255, 255, 255)
green = (0, 255, 0)
red = (255, 0, 0)


class Lander(object):
    def __init__(self, height=10, width=10, color=white, x=320, y=240):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.surface = pygame.Surface((2 * self.height, 2 * self.width))
        self.color = color

        pygame.draw.rect(self.surface, white, (self.height, self.height, self.width, self.width))

    def blit(self, background):
        """blit the Ball on the background"""
        background.blit(self.surface, (self.x, self.y))

    def move(self, change_x, change_y):
        self.change_x = change_x
        self.change_y = change_y

        self.x += self.change_x
        self.y += self.change_y

        if self.x > 300 or self.x < 0:
            self.change_x = -self.change_x
        if self.y > 300 or self.y < 0:
            self.change_y = -self.change_y
导入pygame
黑色=(0,0,0)
白色=(255,255,255)
绿色=(0,255,0)
红色=(255,0,0)
类着陆器(对象):
def u u init u uuu(自,高度=10,宽度=10,颜色=白色,x=320,y=240):
self.x=x
self.y=y
自我高度=高度
self.width=宽度
self.surface=pygame.surface((2*self.height,2*self.width))
self.color=颜色
pygame.draw.rect(self.surface,白色,(self.height,self.height,self.width,self.width))
def blit(自身、背景):
“”“将球放在背景上”“”
blit背景(self.surface,(self.x,self.y))
def移动(自我、更改x、更改y):
self.change\u x=change\u x
self.change\u y=change\u y
self.x+=self.change\u x
self.y+=self.change\u y
如果self.x>300或self.x<0:
self.change\u x=-self.change\u x
如果self.y>300或self.y<0:
self.change\u y=-self.change\u y
任何帮助或给我指出正确的方向都将是令人惊讶的,谢谢。
另外,我没有遇到运行错误,会弹出一个黑色窗口,但没有白色矩形。

您不应该创建名为blit的函数,因为它可能会妨碍实际的blit函数。在第二个代码中也有:

pygame.draw.rect(self.surface, white, (self.height, self.height, self.width, self.width))

您应该使用surface

问题是因为您在surface
self.background

lander.blit(self.background)
但您永远不会在
self.screen
上闪烁
self.background
,它是主缓冲区,当您这样做时,它会在监视器上发送

pygame.display.flip()
因此,您可以直接在
self.screen

lander.blit(self.screen)
lander.blit(self.background)

self.screen.blit(self.background, (0,0))
或者您必须在
self.screen

lander.blit(self.screen)
lander.blit(self.background)

self.screen.blit(self.background, (0,0))

我不明白。。。运行时使用surface?
是什么意思:
是代码的主要部分,在此循环中不绘制任何内容,所以屏幕上没有任何内容。