2016-03-04 54 views
1

我有一个类似Agar.io的测试游戏,其中方块玩家触摸“位”并且增长。问题是位代。该位每秒产生一次并具有自己的表面。但是,该程序不会将该位(不是双关语)放在初始表面上。Pygame屏幕不会blit

下面是代码:

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.没有错误消息。

在此先感谢。

+0

你是否在任何地方调用display.update()? –

+0

我打电话给display.flip(),那够了吗?或者我必须这样做? –

回答

3

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

但是一个警告的话。当您为每个对象单独制作cscreen,然后将cscreen转移到您的实际屏幕上时,您将摆脱其他所有cscreen已被blitting,一次只能看到1 Bit。即使您在__init__之外有cscreen,您现在也会有一个问题会擦除较旧的问题,所以我建议您采取不同的方法。

我的建议是找到一个点的小图片,并将这些行写在Bit__init__方法中。

self.image = pygame.image.load("reddot.png") 
self.rect = self.image.get_rect() 

一旦你创建你的位,将它添加到pygame.sprite.Group()。这些团队有非常方便的内置方法。其中之一是.draw()。它将通过您的Bits组,并使用每个组的self.imageself.rect在每次正确的位置绘制它们,而不必担心它。当吃了Bit时,您可以从组中删除Bit,现在它已被删除。

一个随机旁注:我建议你改变你的事件循环,以便当它打破event.type == pygame.QUIT。这样,Python不需要检查每个帧上的if d == True语句,同时使代码更具可读性。如果它只是跳出for循环(对我来说它退出很好),你可以在导入后使用sys.exit()sys

+0

谢谢,这有很大的帮助。 –

+0

呃,它仍然不起作用。我已经制作了精灵和小组。这里是代码:[gist](https://gist.github.com/nolcay/98789dda60cd129ea322) –

+0

改变bits.draw到bits.draw(屏幕)..在这样做后,我得到了图像显示为我。如果不确定如何正确使用这些函数,请查看pygame.org/docs。我看了一下你的代码,大部分看起来不错。关于碰撞,如果你有一个pygame Group of Bits,并且想检查你的播放器是否与其中任何一个碰撞,我推荐使用pygame.sprite.spritecollideany(sprite,group)。如果您有更多问题,请告知我:D –