Я создал платформер с использованием Python 3.5 и сделал второй уровень.
Я хочу перейти на второй уровень, когда вы касаетесь синей области (представленной E
). На данный момент синяя область выходит из кода, чтобы убедиться, что триггер запускается.
Я создал второй уровень, помещенный в массив.
Это мой код:
#! /usr/bin/python
import pygame
from pygame import *
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 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 = [
"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
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:
и изменить функцию выхода, чтобы изменить переменную, но она не работает.
Может ли кто-нибудь помочь?
Хорошо, я начал работать. Heres код, он работает, в основном, заново инициализируя платформы и сущности до нужного значения (соответствующие уровню, тоже добавляйте больше уровней, имеют переменную уровня и просто скажите, если
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()