Pygame基于字符串的级别绘制一次然后消失
问题描述:
我正在使用Python 2.7。我在重新绘制基于字符串的级别时遇到问题。它在第一帧画得很好,但在此之后,它似乎不再吸引。我一直试图想出一段时间的修复。下面是完整的源代码:Pygame基于字符串的级别绘制一次然后消失
import pygame
from pygame.locals import *
xScan = 0
yScan = 0
level = "WWWWWWWW" \
"WSSSSSSW" \
"WSSSSSSW" \
"WSSSSSSW" \
"WSSSSSSW" \
"WWWWWWWW"
class Player():
def __init__(self, color, x, y, width, height, outline_size):
self.color = color
self.x = x
self.y = y
self.width = width
self.height = height
self.outline_size = outline_size
def draw(self):
pygame.draw.rect(screen, self.color, [self.x * 80, self.y * 80, self.width * 80, self.height * 80], self.outline_size)
def draw_level():
for tile in level:
global xScan, yScan
if tile == "W":
pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0)
elif tile == "S":
pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1)
if xScan >= 0 and xScan < 7:
xScan += 1
elif xScan == 7:
xScan = 0
yScan += 1
elif yScan == 5 and xScan == 7:
xScan = 0
yScan = 0
def update():
screen.fill([255, 255, 255])
draw_level()
player.draw()
pygame.display.flip()
pygame.init()
screen = pygame.display.set_mode([640, 480])
pygame.display.set_caption("Squares n' Tiles!")
player = Player([0, 100, 255], 1, 1, 1, 1, 0)
running = True
while running:
clock = pygame.time.Clock()
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == K_ESCAPE:
running = False
if event.key == K_UP and player.y * 80 >= 160:
player.y -= 1
if event.key == K_DOWN and player.y * 80 < 320:
player.y += 1
if event.key == K_LEFT and player.x * 80 >= 160:
player.x -= 1
if event.key == K_RIGHT and player.x * 80 < 480:
player.x += 1
if event.key == K_c or event.key == K_r:
player.x = 1
player.y = 1
if event.type == pygame.QUIT:
running = False
update()
pygame.quit()
我认为问题出在这部分代码中:
def draw_level():
for tile in level:
global xScan, yScan
if tile == "W":
pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0)
elif tile == "S":
pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1)
if xScan >= 0 and xScan < 7:
xScan += 1
elif xScan == 7:
xScan = 0
yScan += 1
elif yScan == 5 and xScan == 7:
xScan = 0
yScan = 0
我试着在前面的部分的后半数字搞乱。这是一个变化是主要解决了这个问题(尽管它的格式不是很一致):
if xScan >= 7:
xScan = 0
yScan += 1
elif yScan == 6:
xScan = 1
yScan = 0
else:
xScan += 1
与上面的代码唯一的问题是,左上方图块不画。我怎么能改变我的代码,使其正常工作?在每一帧上,我都希望屏幕充满白色,重新绘制关卡,玩家重新绘制,屏幕翻转。预先感谢您的帮助。我也希望对我的代码结构有所建议。
答
的问题是,该块不执行:
elif yScan == 5 and xScan == 7:
xScan = 0
yScan = 0
这是因为你循环遍历字符串level
每个字符,所以达到了最大值为XSCAN = 6,yScan = 5 。
而不只是初始化xScan
和yScan
进入抽奖级功能
def draw_level():
xScan = 0 # no need for these to be global
yScan = 0
for tile in level:
if tile == "W":
pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0)
elif tile == "S":
pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1)
if xScan >= 0 and xScan < 7:
xScan += 1
elif xScan == 7:
xScan = 0
yScan += 1
我时竟被ð建议储存你的级别人物的几行,而不是一个长字符串:
level = "WWWWWWWW\n" \
"WSSSSSSW\n" \
"WSSSSSSW\n" \
"WSSSSSSW\n" \
"WSSSSSSW\n" \
"WWWWWWWW\n" # note the new line characters (\n)
然后你可以遍历在地图上像这样:
def draw_level():
for yScan, row in enumerate(level.split('\n')):
for xScan, tile in enumerate(row):
if tile == "W":
pygame.draw.rect(screen, [0, 0, 0], [xScan * 80, yScan * 80, 80, 80], 0)
elif tile == "S":
pygame.draw.rect(screen, [120, 120, 120], [xScan * 80, yScan * 80, 80, 80], 1)
enumerate
接受一个列表(或迭代),并返回例如:
>>> a = 'test'
>>> for i, c in enumerate(a):
... print('i is {}, c is {}'.format(i, c))
...
i is 0, c is t
i is 1, c is e
i is 2, c is s
i is 3, c is t
谢谢!我很感激。 – Mikeureko