Python平台的游戏问题正在进入下一个层次



我使用Python 3.5制作了一个平台生成器,并达到了第二级。

当你触摸蓝色区域(由E表示(时,我想进入第二个级别。现在,蓝色区域退出代码,只是为了确保触发器被触发。

我已经创建了第二个级别,并将其放入数组中。


这是我的代码:

def main():
global cameraX, cameraY
pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
timer = pygame.time.Clock()
up = down = left = right = running = False
bg = Surface((32,32))
entities = pygame.sprite.Group()
player = Player(32, 700)
platforms = []
x = y = 0
level1 = [ #level as an array
]

level2 = [ #level as an array
]

# build the level
for row in level1:
for col in row:
if col == "P":
p = Platform(x, y)
platforms.append(p)
entities.add(p)
if col == "E":
e = ExitBlock(x, y)
platforms.append(e)
entities.add(e)
if col == "L":
l = Lava(x, y)
platforms.append(l)
entities.add(l)
x += 32
y += 32
x = 0
total_level_width  = len(level1[0])*32
total_level_height = len(level2)*32
camera = Camera(complex_camera, total_level_width, total_level_height)
entities.add(player)
while 1:
timer.tick(60)
for e in pygame.event.get():
if e.type == QUIT:
raise SystemExit("ESCAPE")
if e.type == KEYDOWN and e.key == K_UP:
up = True
if e.type == KEYDOWN and e.key == K_DOWN:
down = True
if e.type == KEYDOWN and e.key == K_LEFT:
left = True
if e.type == KEYDOWN and e.key == K_RIGHT:
right = True
if e.type == KEYDOWN and e.key == K_SPACE:
running = True
if e.type == KEYUP and e.key == K_UP:
up = False
if e.type == KEYUP and e.key == K_DOWN:
down = False
if e.type == KEYUP and e.key == K_RIGHT:
right = False
if e.type == KEYUP and e.key == K_LEFT:
left = False
# draw background
for y in range(32):
for x in range(32):
screen.blit(bg, (x * 32, y * 32))
camera.update(player)
# update player, draw everything else
player.update(up, down, left, right, running, platforms)
for e in entities:
screen.blit(e.image, camera.apply(e))
pygame.display.update()
class Camera(object):
def __init__(self, camera_func, width, height):
self.camera_func = camera_func
self.state = Rect(0, 0, width, height)
def apply(self, target):
return target.rect.move(self.state.topleft)
def update(self, target):
self.state = self.camera_func(self.state, target.rect)
def simple_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h)
def complex_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h
l = min(0, l)                           # stop scrolling at the left edge
l = max(-(camera.width-WIN_WIDTH), l)   # stop scrolling at the right edge
t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling at the bottom
t = min(0, t)                           # stop scrolling at the top
return Rect(l, t, w, h)
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Player(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = Surface((32,32))
self.image.fill(Color("#ff0000"))
self.image.convert()
self.rect = Rect(x, y, 32, 32)
def update(self, up, down, left, right, running, platforms):
if up:
# only jump if on the ground
if self.onGround:
self.yvel -= 8
if down:
pass
if running:
self.xvel = 12
if left:
self.xvel = -8
if right:
self.xvel = 8
if not self.onGround:
# only accelerate with gravity if in the air
self.yvel += 0.3
# max falling speed
if self.yvel > 100: self.yvel = 100
if not(left or right):
self.xvel = 0
# increment in x direction
self.rect.left += self.xvel
# do x-axis collisions
self.collide(self.xvel, 0, platforms)
# increment in y direction
self.rect.top += self.yvel
# assuming we're in the air
self.onGround = False;
# do y-axis collisions
self.collide(0, self.yvel, platforms)
def collide(self, xvel, yvel, platforms):
for p in platforms:
if pygame.sprite.collide_rect(self, p):
if isinstance(p, ExitBlock):
pygame.event.post(pygame.event.Event(QUIT))
if isinstance(p, Lava):
main()
if xvel > 0:
self.rect.right = p.rect.left
if xvel < 0:
self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
self.yvel = 0
if yvel < 0:
self.rect.top = p.rect.bottom

class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#7cfc00"))
self.rect = Rect(x, y, 32, 32)
def update(self):
pass
class ExitBlock(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image.fill(Color("#0033FF"))

class Lava(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image.fill(Color("#ff0000"))

if __name__ == "__main__":
main()

我曾尝试复制for row in level1:并更改出口函数以更改变量,但它不起作用。


有人能帮忙吗?

好的,我开始工作了。这是代码,它的工作原理是将平台和实体重新初始化为所需的值(与级别相对应,也添加更多级别,有您的级别变量,然后说如果

levelNum == 3:
buildLevel(level3)

否则,一个更有效的方法会将放入列表中,并将级别num设置为0这是完整的代码,而且,如果你通过了第二级,它可能不起作用,因为没有第三级,所以你可能只想让它说祝贺或其他什么。

import pygame
from pygame import *
levelNum = 1
WIN_WIDTH = 1000
WIN_HEIGHT = 640
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)
DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 32
FLAGS = 0
CAMERA_SLACK = 30
def buildLevel(level):
plats = []
ents = pygame.sprite.Group()
x,y = 0,0
for row in level:
for col in row:
if col == "P":
p = Platform(x, y)
plats.append(p)
ents.add(p)
if col == "E":
e = ExitBlock(x, y)
plats.append(e)
ents.add(e)
if col == "L":
l = Lava(x, y)
plats.append(l)
ents.add(l)
x += 32
y += 32
x = 0
return plats,ents
def main():
global level2,player
global cameraX, cameraY
pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
timer = pygame.time.Clock()
up = down = left = right = running = False
bg = Surface((32,32))
bg.convert()
bg.fill(Color("#87ceeb"))
entities = pygame.sprite.Group()
player = Player(32, 700)
platforms = []
x = y = 0
level1 = [
"P PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P PE                                       P",
"P PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP  P   P",
"P                                   P   P",
"P                                  P     P", 
"P                                 P       P",
"P                                P     P",
"P            L     L        P       P",
"P     PPPPPPPPPPPPPPPPPPPPPPPPPPP       P",
"P  LLL                                   P",
"P  LLL                                   P",
"P  PPPP                                     P",
"P                                         P",
"P                P                     P",
"P     PPPP    PPPPPP                  P",
"P                    PP                   P",
"P                                         P",
"P                        PPPPPPPPPP       P",
"P                                         P",
"P                 PPPP                 P",
"P            PP                           P",
"P   E      PP                         P",
"P   PPPPLLLLLPP                           P",
"P   PPPPPPLLLLLPPLLLLLLLLLLLLLLLLLLLLLLLLLLLP",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
level2 = [
"P PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P PE                                       P",
"P PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP  P   P",
"P                                   P   P",
"P                                  P     P", 
"P                                 P       P",
"P                                P     P",
"P            L     L        P       P",
"P     PPPPPPPPPPPPPPPPPPPPPPPPPPP       P",
"P  LLL                                   P",
"P  LLL                                   P",
"P  PPPP                                     P",
"P                                         P",
"P                P                     P",
"P     PPPP    PPPPPP                  P",
"P                    PP                   P",
"P                                         P",
"P                        PPPPPPPPPP       P",
"P                                         P",
"P                 PPPP                 P",
"P                                         P",
"P                                         P",
"P                                         P",
"P                                         P",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
# build the level
if levelNum ==1:
platforms,entities = buildLevel(level1) 
elif levelNum == 2:
platforms,entities = buildLevel(level2) 
total_level_width  = len(level1[0])*32
total_level_height = len(level2)*32
camera = Camera(complex_camera, total_level_width, total_level_height)
entities.add(player)
while 1:
timer.tick(60)
for e in pygame.event.get():
if e.type == QUIT:
raise SystemExit("ESCAPE")
if e.type == KEYDOWN and e.key == K_UP:
up = True
if e.type == KEYDOWN and e.key == K_DOWN:
down = True
if e.type == KEYDOWN and e.key == K_LEFT:
left = True
if e.type == KEYDOWN and e.key == K_RIGHT:
right = True
if e.type == KEYDOWN and e.key == K_SPACE:
running = True
if e.type == KEYUP and e.key == K_UP:
up = False
if e.type == KEYUP and e.key == K_DOWN:
down = False
if e.type == KEYUP and e.key == K_RIGHT:
right = False
if e.type == KEYUP and e.key == K_LEFT:
left = False
# draw background
for y in range(32):
for x in range(32):
screen.blit(bg, (x * 32, y * 32))
camera.update(player)
# update player, draw everything else
player.update(up, down, left, right, running, platforms)
for e in entities:
screen.blit(e.image, camera.apply(e))
pygame.display.update()
class Camera(object):
def __init__(self, camera_func, width, height):
self.camera_func = camera_func
self.state = Rect(0, 0, width, height)
def apply(self, target):
return target.rect.move(self.state.topleft)
def update(self, target):
self.state = self.camera_func(self.state, target.rect)
def simple_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h)
def complex_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h
l = min(0, l)                          # stop scrolling at the left edge
l = max(-(camera.width-WIN_WIDTH), l)   # stop scrolling at the right edge
t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling at the bottom
t = min(0, t)                          # stop scrolling at the top
return Rect(l, t, w, h)
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Player(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = Surface((32,32))
self.image.fill(Color("#ff0000"))
self.image.convert()
self.rect = Rect(x, y, 32, 32)
def update(self, up, down, left, right, running, platforms):
if up:
# only jump if on the ground
if self.onGround:
self.yvel -= 8
if down:
pass
if running:
self.xvel = 12
if left:
self.xvel = -8
if right:
self.xvel = 8
if not self.onGround:
# only accelerate with gravity if in the air
self.yvel += 0.3
# max falling speed
if self.yvel > 100: self.yvel = 100
if not(left or right):
self.xvel = 0
# increment in x direction
self.rect.left += self.xvel
# do x-axis collisions
self.collide(self.xvel, 0, platforms)
# increment in y direction
self.rect.top += self.yvel
# assuming we're in the air
self.onGround = False;
# do y-axis collisions
self.collide(0, self.yvel, platforms)
def collide(self, xvel, yvel, plats):
global levelNum
for p in plats:
if pygame.sprite.collide_rect(self, p):
if isinstance(p, ExitBlock):
levelNum+=1
main()  
#pygame.event.post(pygame.event.Event(QUIT))
if isinstance(p, Lava):
main()
if xvel > 0:
self.rect.right = p.rect.left
if xvel < 0:
self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
self.yvel = 0
if yvel < 0:
self.rect.top = p.rect.bottom

class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#7cfc00"))
self.rect = Rect(x, y, 32, 32)
def update(self):
pass
class ExitBlock(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image.fill(Color("#0033FF"))
class Lava(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image.fill(Color("#ff0000"))
if __name__ == "__main__":
main()

最新更新