Проблема игры на платформе Python при переходе на следующий уровень

1

Я создал платформер с использованием 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: и изменить функцию выхода, чтобы изменить переменную, но она не работает.


Может ли кто-нибудь помочь?

  • 1
    «У меня есть гугл-решения, но ни один из них не работает с моим кодом». Это утверждение бесполезно, если вы не планируете делиться этими решениями и точно объяснять , почему они не дали результатов.
Теги:
python-3.x
pygame
python-3.5

1 ответ

2
Лучший ответ

Хорошо, я начал работать. 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()
  • 1
    Огромное спасибо. Кроме того, я могу добавить эту функцию снова, чтобы сделать больше уровней (например, еще 10?)
  • 2
    Да, как я уже сказал, просто скажите, если levelNum == 3: buildLevel (level3), или внесите их все в список.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню