嗨,我是编程和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时,游戏将会落后太多我不知道我做错了什么
抱歉,如果我问了太多不好的问题,但非常感谢你,我从你们那里学到了很多东西
答案 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碰撞函数来轻松处理碰撞。