0

今天我尝试在 pygame 中制作一个小平台游戏。我使用了一个非常漂亮和有用的教程中的很多代码,因为我不知道该怎么做。

到目前为止,通过处理屏幕的 32x32 部分并根据地图文本部分中的字符为其分配块类型来制作地图。到目前为止,我有一个平台块、一个边界块和一个出口块,我希望最终使游戏加载一个新的关卡。

我的问题是:如果我“通过关卡”并想让游戏加载一张新地图,我该怎么做?我试过从组中删除精灵,但我没有任何运气。我已经尝试了一段时间,但我有点气馁。

这是代码:

import pygame
import math
from pygame import *

DISPLAY = (800, 640)
DEPTH = 32
FLAGS = 0

def main():
    pygame.init()
    screen = display.set_mode(DISPLAY, FLAGS, DEPTH)
    display.set_caption("Square2")
    timer = time.Clock()

    up = down = left = right = False
    bg = Surface((32,32))
    bg.convert()
    bg.fill(Color("#000000"))
    entities = pygame.sprite.Group()
    player = Player(32,32)
    platforms = []

    x = y = 0
    level = [
    "PPPPPPPPPPPPPPPPPPPPPPPPP",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                       P",
    "P                   pp  P",
    "P                       P",
    "P                       P",
    "P           pppppp      P",
    "P                       P",
    "P  pppppp               P",
    "P                       P",
    "PPPPPPPPPPPPPPPPPPPPPPPPP",
            ]

    #builds the level
    for row in level:
        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 == "P":
                P = Border(x, y)
                platforms.append(P)
                entities.add(P)
            x += 32
        y += 32
        x = 0
    entities.add(player)

    while 1:
        timer.tick(60)
        for e in pygame.event.get():
            if e.type == QUIT:
                pygame.quit()
                sys.exit()
                #raise SystemExit, "ESCAPE"
            if e.type == KEYDOWN and e.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
                #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_RIGHT:
                right = True
            if e.type == KEYDOWN and e.key == K_LEFT:
                left = 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 bg
        for y in range(20):
            for x in range(25):
                screen.blit(bg, (x * 32, y * 32))

        #update player, draw everything else
        player.update(up, down, left, right, platforms)
        entities.draw(screen)

        pygame.display.flip()

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.convert()
        self.image.fill(Color("#FF0000"))
        self.rect = Rect(x, y, 32, 32)

        self.reset(150, 400)

    def reset(self,x,y):
        self.x = x
        self.y = y

        self.rect.center = (self.x, self.y)

    def update(self, up, down, left, right, platforms):
        if up:
            #only jump if on the ground
            if self.onGround:
                self.yvel = -8
        if down:
            pass
        if left:
            self.xvel = -5
        if right:
            self.xvel = 5
        if not self.onGround:
            #only accelerate wit gravity if in the air
            self.yvel +=0.3
            #max falling sapeed
            if self.yvel > 30:
                self.yvel = 30
        if not (left or right):
            self.xvel = 0

        # increment in x direction
        self.rect.left+= self.xvel
        # 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;
        # y-axis collisions
        self.collide(0, self.yvel, platforms)

    def collide(self, xvel, yvel, platforms):
        for p in platforms:
            if sprite.collide_rect(self, p):
                if isinstance(p, ExitBlock):
                    event.post(event.Event(QUIT))
                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
                    self.yvel = 0
                   # Player.rect.top =  Player.rect.top


class Platform(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.image = Surface((32, 32))
        self.image.convert()
        self.image.fill(Color("#DDDDDD"))
        self.rect = Rect(x, y, 32, 32)

        def update(self):
            pass

class Border(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.image = Surface((32, 32))
        self.image.convert()
        self.image.fill((0,0,0))
        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"))



main()

在此先感谢您的帮助!

4

1 回答 1

0

创建一个算法来随机创建一个可行的关卡并为一个关卡输出一个可读的字符串。自动将其与边界对齐,制作一些随机平台,以及距离玩家最远的平台上的出口。您甚至可以计算是否可以从一个平台跳转到下一个平台,您可能应该这样做。要加载关卡,只需重新调用 main()。此外,实体似乎只是精灵的包装,您可能想保留它,但它似乎只是占用空间。因为算法可能是整个程序中最大的部分,所以我不会写一个例子,但是如果你正在寻找一种方法来加载一个新的关卡或一个开始算法的地方,这应该可以工作。

于 2013-11-22T02:36:51.400 回答