Pygame屏幕赢了

时间:2016-03-04 18:53:37

标签: python pygame blit

我有一个类似于Agar.io的测试游戏,其中方形玩家触及" bit" s并且增长。问题是比特生成。该位每秒生成并具有自己的表面。但是,该程序不会将一点点(没有双关语)进入初始表面。

以下是代码:

import pygame
import random
pygame.init()
clock = pygame.time.Clock()
display = pygame.display
screen = display.set_mode([640,480])
rect_x = 295
rect_y = 215
display.set_caption("Agar")
d = False
bits = []
size = 50
steps = 0
class Bit:
    cscreen = display.set_mode([640,480])
    circ = pygame.draw.circle(cscreen, (65, 76, 150), (random.randrange(40, 600), random.randrange(40, 440)), 5)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            d = True
    if d == True:
        break

    # Fill background
    screen.fill((5, 58, 0))

    # Create player object
    player = pygame.draw.rect(screen, (250, 197, 255), [rect_x, rect_y, size, size])

    # Moving
    if pygame.key.get_pressed()[pygame.K_UP]:
        rect_y -= 2
    if pygame.key.get_pressed()[pygame.K_DOWN]:
        rect_y += 2
    if pygame.key.get_pressed()[pygame.K_RIGHT]:
        rect_x += 2
    if pygame.key.get_pressed()[pygame.K_LEFT]:
        rect_x -= 2

    # Bit generation
    if steps == 60:
        new_bit = Bit()
        bits.append(new_bit.circ)
        screen.blit(new_bit.cscreen, (0,0))
        steps = 0
    steps += 1

    # Collision detection
    collision = player.collidelist(bits)
    if collision != -1:
        bits[collision].cscreen.fill((0,0,0,0))
        # Make player larger
        size += 10

    # FPS limit
    clock.tick(60)

    # Refresh
    display.flip()

P.S。没有错误消息。

提前致谢。

1 个答案:

答案 0 :(得分:3)

要让每个Bit对象具有不同的位置和实例变量,您需要在您的位类中使用__init__方法。通过添加__init__并将self.添加到变量中,blitting可以正常工作。

但是一句警告。当您为每个对象单独cscreen,然后将cscreen blit到您的实际屏幕时,您将摆脱所有其他cscreen已被blitted,只有1 {{1}一次可见。即使您Bit之外的cscreen,您现在也会遇到一个问题,因此我建议您采用不同的方法。

我的建议是找到一张点的小图片,并在__init__的{​​{1}}方法中写下这些行。

Bit

创建位后,将其添加到__init__。这些组具有非常方便的内置方法。其中一个是self.image = pygame.image.load("reddot.png") self.rect = self.image.get_rect() 。它将通过您的pygame.sprite.Group()小组,并使用每个.draw()Bits每次都在正确的位置绘制它们,而不必担心它。当吃self.image时,您可以从群组中删除self.rect,现在它已被删除。

随机附注:我建议您将事件循环更改为仅在Bit时中断。这样,Python不需要在每个帧上检查Bit语句,同时使代码更具可读性。如果它只是跳出for循环(对我来说它退出正常),你可以在导入event.type == pygame.QUIT后使用if d == True