pygame简单游戏滞后

时间:2017-01-18 19:19:40

标签: python pygame

嗨,我是编程和pygame的初学者 而我正试图制作这样的游戏

http://dan-ball.jp/en/javagame/dust/

我开始制作这个简单的代码

import pygame
from pygame.locals import*
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (0,25)
pygame.init()
screen=pygame.display.set_mode((1360,705))
clock = pygame.time.Clock()
boxs=[]
while True :
     screen.fill((0,0,0))
     for event in pygame.event.get():
                if event.type==QUIT :
                    pygame.quit()
                    quit()
                if event.type== pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                           mous=pygame.math.Vector2(event.pos[0]-4,event.pos[1]-4)
                           boxs.append(mous)
                if event.type== pygame.MOUSEBUTTONDOWN:
                     if event.button == 3:
                          print (len(boxs))
     for i in range(len(boxs)): 
          if ((boxs[i])[1])>=685:
               pass
          else:
               (boxs[i])[1]=(boxs[i])[1]+2
               for v in range (len(boxs)):
                    if v==i:
                         pass 
                    else :
                         if (int((boxs[i])[1]))+4 >= (int((boxs[v])[1])) and (int((boxs[i])[1])) <= (int((boxs[v])[1]))+4 and (int((boxs[i])[0]))+4 >= (int((boxs[v])[0])) and (int((boxs[i])[0])) <= (int((boxs[v])[0]))+4:
                               (boxs[i])[1]=(boxs[i])[1]-2
                               break 
          pygame.draw.rect(screen,(250,250,250),((boxs[i])[0],(boxs[i])[1], 4, 4))     
     pygame.display.update()
     clock.tick(60)

它起作用非常好,但我的问题是,当盒子变得更多350或400时,游戏将会落后太多我不知道我做错了什么

抱歉,如果我问了太多不好的问题,但非常感谢你,我从你们那里学到了很多东西

1 个答案:

答案 0 :(得分:1)

我注意到你正在这样做:

if ((boxs[i])[1])>=685:
    pass

这意味着你永远不会删除掉屏幕底部的方框,所以随着时间的推移,你的方框列表会变得越来越大,这最终会导致滞后。

您还在使用Pygame向量列表,然后不利用它们。例如,而不是:

(boxs[i])[1]=(boxs[i])[1]+2
你可以说:

boxs[i].y += 2

最后,你不是以Pythonic方式循环。在Python中,您几乎不需要使用索引变量循环。相反,你应该做这样的事情:

for box in boxs: 
      if box.y >= 685:
           pass
      else:
           box.y += 2
           for other in boxs:
                if other == box:
                     pass 

依旧......

最后,您应该使用pygame Rect()对象,因为这样您就可以使用内置的pygame碰撞函数来轻松处理碰撞。

http://www.pygame.org/docs/ref/rect.html