首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多发子弹游戏空间入侵者

多发子弹游戏空间入侵者
EN

Stack Overflow用户
提问于 2014-04-22 12:03:38
回答 2查看 1.5K关注 0票数 0

我对python相当陌生,我正在尝试做一个小小的太空入侵者游戏。我的问题是,我不能有超过一个子弹在屏幕上。我希望能像在最初的游戏中至少发射3次。这样做最好的方法是什么?

这是我的代码:

代码语言:javascript
运行
复制
from pygame import *
import random

class Sprite:

        def __init__(self, xpos, ypos, filename):
                self.x = xpos
                self.y = ypos
                self.bitmap = image.load(filename)
                self.bitmap.set_colorkey((0,0,0))
        def set_position(self, xpos, ypos):
                self.x = xpos
                self.y = ypos
        def render(self):
                screen.blit(self.bitmap, (self.x, self.y))

def Intersect(s1_x, s1_y, s2_x, s2_y):
        if (s1_x > s2_x - 30) and (s1_x < s2_x + 30) and (s1_y > s2_y - 30) and (s1_y < s2_y + 30):
                return 1
        else:
                return 0

init()
screen = display.set_mode((640,480))
key.set_repeat(1, 1)
display.set_caption('PyInvaders')
backdrop = image.load('data/backdrop.bmp') 
enemies = []

x = 0
count = 0

for count in range(10):
    if count < 10:
        enemies.append(Sprite(50 * x + 50, 50, 'data/baddie.bmp'))
        x += 1
        count += 1
    else:
        x = 0
        enemies.append(Sprite(100 * x + 100, 50, 'data/baddie.bmp'))
        x += 1





hero = Sprite(20, 400, 'data/hero.bmp')
ourmissile = Sprite(0, 480, 'data/heromissile.bmp')
enemymissile = Sprite(0, 480, 'data/baddiemissile.bmp')
gameover = image.load('data/gameover.bmp')



quit = 0
enemyspeed = 4
timer = 0        


while quit == 0:

        heromid = hero.x + 16
        screen.blit(backdrop, (0, 0))

        for count in range(len(enemies)):
                enemies[count].x += enemyspeed
                enemies[count].render()

        if enemies[len(enemies)-1].x > 590:
                enemyspeed = -3
                for count in range(len(enemies)):
                        enemies[count].y += 5

        if enemies[0].x < 10:
                enemyspeed = 3
                for count in range(len(enemies)):
                        enemies[count].y += 5

        if ourmissile.y < 640 and ourmissile.y > 0:
            ourmissile.render()
            ourmissile.y += -5
            timer  = timer + 1

        if enemymissile.y >= 480 and len(enemies) > 0:
            enemymissile.x = enemies[random.randint(0, len(enemies) - 1)].x + 16
            enemymissile.y = enemies[0].y

        if Intersect(hero.x, hero.y, enemymissile.x, enemymissile.y):
           quit = 1

        for count in range(0, len(enemies)):
            if Intersect(ourmissile.x, ourmissile.y, enemies[count].x, enemies[count].y):
                    del enemies[count]
                    break

        if len(enemies) == 0:
            quit = 1

        for ourevent in event.get():
                if ourevent.type == QUIT:
                        quit = 1
                if ourevent.type == KEYDOWN:
                        if ourevent.key == K_RIGHT and hero.x < 590:
                                hero.x += 5
                        if ourevent.key == K_LEFT and hero.x > 10:
                                hero.x -= 5
                        if ourevent.key == K_SPACE:
                            if timer < 400:
                                timer = 0
                                ourmissile.x = heromid
                                ourmissile.y = hero.y

        enemymissile.render()
        enemymissile.y += 5

        hero.render()

        display.update()
        time.delay(10)


while quit == 1:
    screen.blit(gameover,(0,0))
    display.update()
    if ourevent.type == KEYDOWN:
        if ourevent.key == K_SPACE:
            quit == 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-30 09:16:12

与其拥有一枚导弹,不如列一个导弹清单。所以,不是这样的:

代码语言:javascript
运行
复制
if ourevent.key == K_SPACE:
    if timer < 400:
        timer = 0
        ourmissile.x = heromid
        ourmissile.y = hero.y

创建一个新的导弹并将其添加到列表中:

代码语言:javascript
运行
复制
if timer < 400:
    timer = 0
    missiles.append(Sprite(heromid, hero.y, 'data/heromissile.bmp')

增加回路来绘制和移动所有的导弹:

代码语言:javascript
运行
复制
for m in missiles:
    if m.y < 640 and m.y > 0:
        m.render()
        m.y += -5
票数 1
EN

Stack Overflow用户

发布于 2014-04-30 04:58:23

好吧,坦白说吧。你得把大部分的内容都记录下来。下面是我如何做到这一点的一个例子:

我创建了一个精灵组(它包含多个精灵)

代码语言:javascript
运行
复制
bulletGroup = pygame.sprite.Group()

然后我给子弹上了课

代码语言:javascript
运行
复制
# The pygame.sprite.Sprite is necessary
class Bullet(pygame.sprite.Sprite):

def __init__(self, x, y):
    self.x = x
    self.y = y
    # What this line means is that whenever a bullet is created it goes in the group "bulletGroup"
    pygame.sprite.Sprite.__init__(self, bulletGroup) 

现在要创造一颗子弹:

代码语言:javascript
运行
复制
# You can execute this same line as many times as you want and the bullets will be seperate
bullet = Bullet(x, y)

如果您需要帮助移动在这种格式,让我知道,希望它有帮助!

听起来也不刻薄,但我真的很有名望,atm :)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23218971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档