Pygame游戏关卡/菜单创建

4

我用Python编写了一个简单的太空侵略者游戏,但是我想创建一个菜单和更多的关卡,但我不知道如何去做。请问有人能向我展示如何创建菜单级别和其他额外的关卡吗?

from pygame import *
import random

init()
screen = display.set_mode((640, 480))
key.set_repeat(1, 1)
display.set_caption("Py-Invaders")
background = image.load("data/background.bmp")

class Sprite:
    def __init__ (self, xposition, yposition, filename):
        self.x = xposition
        self.y = yposition
        self.bitmap = image.load(filename)
        self.bitmap.set_colorkey((0, 0, 0))
    def set_position (self, xposition, yposition):
        self.x = xposition
        self.y = yposition
    def render (self):
        screen.blit(self.bitmap, (self.x, self.y))
    def setImage (self, filename):
        self.bitmap = image.load(filename)
    def removeColor (self, colorkey):
        self.bitmap.set_colorkey(colorkey)

def Intersect(x1, y1, x2, y2):
    if (x1 > x2 - 32) and (x1 < x2 + 32) and (y1 > y2 - 32) and (y1 < y2 + 32):
        return (1)
    else:
        return (0)
def rocketIntersect(x1, y1, x2, y2):
    if (x1 > x2 - 32) and (x1 < x2 + 143) and (y1 > y2 - 32) and (y1 < y2 + 143):
        return (1)
    else:
        return (0)

#Creating invaders1
invaders = []

x = 0
for i in range (10):
    invaders.append(Sprite(50 * x + 50, 50, "data/invader.bmp"))
    x += 1

#Creating invaders2
invaders2 = []

y = 0
for i in range (10):
    invaders2.append(Sprite(50 * y + 50, 100, "data/invader.bmp"))
    y += 1

ship = Sprite(20, 400, "data/ship/shipup.bmp")
shiplaser = Sprite(0, 480, "data/lasers/shiplaser.bmp")
shiprocket = Sprite(0, 480, "data/shiprocket.bmp")
invaderlaser = Sprite(0, 480, "data/lasers/invaderlaser.bmp")
invaderlaser2 = Sprite(0, 480, "data/lasers/invaderlaser.bmp")

quit = 0
invaderspeed = 3
invaderspeed2 = 3

while quit == 0: #Main game while loop
    screen.blit(background, (0, 0))

#Moving the invaders
    for i in range(len(invaders)):
        invaders[i].x += + invaderspeed
        invaders[i].render()

    if invaders[len(invaders)-1].x > 590:
        invaderspeed = -3
        for i in range(len(invaders)):
            invaders[i].y += 5

    if invaders[0].x < 10:
        invaderspeed = 3
        for i in range(len(invaders)):
            invaders[i].y += 5

#Moving the invaders2
    for i in range(len(invaders2)):
        invaders2[i].x += + invaderspeed2
        invaders2[i].render()

    if invaders2[len(invaders2)-1].x > 590:
        invaderspeed2 = -3
        for i in range(len(invaders2)):
            invaders2[i].y += 5

    if invaders2[0].x < 10:
        invaderspeed2 = 3
        for i in range(len(invaders2)):
            invaders2[i].y += 5

#Moving the ship laser
    if shiplaser.y < 479 and shiplaser.y > 0:
        shiplaser.render()
        shiplaser.y -= 5

#Moving the ship rocket
    if shiprocket.y < 479 and shiprocket.y > -150:
        shiprocket.render()
        shiprocket.y -= 5

#Moving the invaders laser
    if invaderlaser.y >= 480 and len(invaders) > 0:
        invaderlaser.x = invaders[random.randint(0, len(invaders) - 1)].x
        invaderlaser.y = invaders[0].y

#Moving the invaders2 laser
    if invaderlaser2.y >= 480 and len(invaders2) > 0:
        invaderlaser2.x = invaders2[random.randint(0, len(invaders2) - 1)].x
        invaderlaser2.y = invaders2[0].y

#Ship collisions with invaders laser
    if Intersect(ship.x, ship.y, invaderlaser.x, invaderlaser.y):
        quit = 1

#Ship collisions with invaders2 laser
    if Intersect(ship.x, ship.y, invaderlaser2.x, invaderlaser2.y):
        quit = 1

#Invaders collision with ship laser
    for i in range(0, len(invaders)):
        if Intersect(shiplaser.x, shiplaser.y, invaders[i].x, invaders[i].y):
            del invaders[i]
            shiplaser.x  = -1
            shiplaser.y = -1
            break

#Invaders2 collision with ship laser
    for i in range(0, len(invaders2)):
        if Intersect(shiplaser.x, shiplaser.y, invaders2[i].x, invaders2[i].y):
            del invaders2[i]
            shiplaser.x = -1
            shiplaser.y = -1
            break

#Invaders collision with ship rocket
    for i in range(0, len(invaders)):
        if Intersect(shiprocket.x, shiprocket.y, invaders[i].x, invaders[i].y):
            del invaders[i]
            break

#Invaders2 collision with ship rocket
    for i in range(0, len(invaders2)):
        if Intersect(shiprocket.x, shiprocket.y, invaders2[i].x, invaders2[i].y):
            del invaders2[i]
            break

    if len(invaders) and len(invaders2) == 0:
        quit = 1

    for ourevent in event.get():
        if ourevent.type == QUIT:
            quit = 1
        if ourevent.type == KEYDOWN:
            if ourevent.key == K_RIGHT and ship.x < 590:
                ship.x += 5
                ship.setImage("data/ship/shipright.bmp")
                ship.removeColor((0, 0, 0))

            if ourevent.key == K_LEFT and ship.x > 10:
                ship.x -= 5
                ship.setImage("data/ship/shipleft.bmp")
                ship.removeColor((0, 0, 0))

            if ourevent.key == K_UP and ship.y > 10:
                ship.y -= 5
                ship.setImage("data/ship/shipup.bmp")
                ship.removeColor((0, 0, 0))

            if ourevent.key == K_DOWN and ship.y < 450:
                ship.y += 5
                ship.setImage("data/ship/shipdown.bmp")
                ship.removeColor((0, 0, 0))

            if ourevent.key == K_SPACE:
                shiplaser.x = ship.x
                shiplaser.y = ship.y

            if ourevent.key == K_z:
                shiprocket.x = ship.x
                shiprocket.y = ship.y

            if ourevent.key == K_p:
                time.delay(10000)

    invaderlaser.render()
    invaderlaser.y += 5

    invaderlaser2.render()
    invaderlaser2.y += 5

    ship.render()

    display.update()
    time.delay(5)

这有点太笼统了,你具体遇到什么问题了吗?我们宁愿要一个明确可解决的问题,而不是“我应该做什么?” - TankorSmash
好的,基本上我不知道如何创建菜单。我想要创建一个启动页面,上面写着“按空格键开始游戏”,然后一旦你按下空格键,它就会带你到第一关,也就是上面的代码。此外,我想添加第二关,所以一旦第一关中所有入侵者都被消灭,也就是上面的代码,它就会带我去另一个关卡。我在寻找一种方法来创建这些关卡并在它们之间移动时遇到了麻烦。谢谢你的帮助。 - ZON
1
关于你的游戏,有一个小提示:考虑只从磁盘加载每个图像到内存一次,并重复使用它;这将节省大量的加载时间和内存使用。其中一种方法是 shipdownPic = image.load("data/ship/shipup.bmp") 然后 ship.setImage(shipdownPic) - SimonT
可能是Pygame级别/菜单状态的重复问题。 - sloth
2个回答

1
给定你的代码,我猜你是一位初学者程序员 - 因为你没有使用任何代码结构,比如函数(也没有关于对象导向的任何东西,但这并不是必须的)。所以,现在你需要更加正式地学习你已经学到的东西:寻找一个Python教程,并学习有关函数的知识。练习一些直到你理解它们。然后你需要"重构"你的代码,将整个现有的级别存在一个函数中(该函数应该调用较小的函数,而不是像现在这样在一个大块中)。
当这些都做好后,你将创建一个具有完全不同逻辑的菜单,可能使用一些其他辅助项目来使用Pygame创建菜单(它本身没有创建菜单的设施,并且它可能比你整个游戏还要复杂)。然后,一个"主函数"将驱动你的游戏,要么调用菜单显示,要么调用级别进行游戏。这个主函数可以向你的"级别"函数传递参数(基本上是你当前整个游戏),使相同的代码对每个级别表现出不同的行为。(例如,敌人船只的数量或速度是区分一个级别和另一个级别的好参数)

0

阅读关于有限状态机的内容,然后将您的主循环转换为一个有限状态机。


1
这应该是一条注释,而不是一个答案。 - sloth
我想我在回答这个问题时付出的努力和提问者一样多。 - kitti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接