Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多发子弹攻击游戏空间入侵者_Python_Pygame - Fatal编程技术网

Python 多发子弹攻击游戏空间入侵者

Python 多发子弹攻击游戏空间入侵者,python,pygame,Python,Pygame,我是python的新手,我正在尝试制作一个小的太空入侵者游戏。我的问题是屏幕上的子弹不能超过一颗。我想能够发射至少3像在原来的游戏。这样做的最佳方式是什么 这是我的密码: from pygame import * import random class Sprite: def __init__(self, xpos, ypos, filename): self.x = xpos self.y = ypos

我是python的新手,我正在尝试制作一个小的太空入侵者游戏。我的问题是屏幕上的子弹不能超过一颗。我想能够发射至少3像在原来的游戏。这样做的最佳方式是什么

这是我的密码:

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
从pygame导入*
随机输入
类精灵:
def uuu init uuu(self、xpos、ypos、文件名):
self.x=xpos
self.y=ypos
self.bitmap=image.load(文件名)
self.bitmap.set_colorkey((0,0,0))
def设置位置(自身、xpos、YPO):
self.x=xpos
self.y=ypos
def渲染(自):
blit(self.bitmap,(self.x,self.y))
def相交(s1_x,s1_y,s2_x,s2_y):
如果(s1_x>s2_x-30)和(s1_xs2_y-30)和(s1_y590:
敌人速度=-3
对于范围内的计数(len(敌人)):
敌人[计数]。y+=5
如果敌人[0],x<10:
敌人速度=3
对于范围内的计数(len(敌人)):
敌人[计数]。y+=5
如果我们的导弹.y<640且我们的导弹.y>0:
我们的导弹
我们的导弹。y+=-5
定时器=定时器+1
如果enemymissile.y>=480且len(敌人)>0:
Enemy飞弹.x=敌人[random.randint(0,len(敌人)-1)].x+16
enemymissile.y=敌人[0].y
如果相交(hero.x,hero.y,enemymissile.x,enemymissile.y):
退出=1
对于范围内的计数(0,len(敌人)):
如果相交(our飞弹.x,our飞弹.y,敌人[count].x,敌人[count].y):
删除敌人[计数]
打破
如果len(敌人)==0:
退出=1
对于event.get()中的ourevent:
如果ourevent.type==退出:
退出=1
如果ourevent.type==KEYDOWN:
如果ourevent.key==K_RIGHT且hero.x<590:
hero.x+=5
如果ourevent.key==K_LEFT且hero.x>10:
英雄.x-=5
如果ourevent.key==K_空格:
如果定时器<400:
计时器=0
我们的导弹.x=heromid
我们的导弹.y=英雄.y
enemymissile.render()
Enemy导弹。y+=5
hero.render()
display.update()
时间延迟(10)
当quit==1时:
屏幕blit(gameover,(0,0))
display.update()
如果ourevent.type==KEYDOWN:
如果ourevent.key==K_空格:
退出==0

好吧,坦率地说。你必须重新编码大部分内容。以下是我如何做到这一点的示例:

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

然后我为子弹做了一个课程

# 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) 
现在创建一个项目符号:

# You can execute this same line as many times as you want and the bullets will be seperate
bullet = Bullet(x, y)
如果你需要帮助移动他们在这个格式让我知道,希望它有帮助


听起来不那么刻薄,但我真的很想知道:)

不要一枚导弹,而是列一份导弹清单。因此,与此相反:

if ourevent.key == K_SPACE:
    if timer < 400:
        timer = 0
        ourmissile.x = heromid
        ourmissile.y = hero.y
如果ourevent.key==K_空格:
如果定时器<400:
计时器=0
我们的导弹.x=heromid
我们的导弹.y=英雄.y
创建新导弹并将其添加到列表中:

if timer < 400:
    timer = 0
    missiles.append(Sprite(heromid, hero.y, 'data/heromissile.bmp')
如果计时器<400:
计时器=0
append(Sprite(heromid,hero.y,'data/herofiless.bmp'))
添加循环以绘制和移动所有导弹:

for m in missiles:
    if m.y < 640 and m.y > 0:
        m.render()
        m.y += -5
对于m英寸导弹:
如果m.y<640且m.y>0:
m、 render()
m、 y+=-5

使用您当前的代码。这并不容易,但我建议查看类和数据数组等。为您的子弹创建一个类。为敌人的子弹创建一个类。看看这个网站,从中获得一些灵感:嘿,我尝试了这个,它很管用,谢谢,但我现在得到了一个连续的子弹,我想推迟它,以便每颗子弹之间的间隔为50毫秒,以防止用户仅仅停留在空格键上并有一个连续的空格键bullet@user3454855制作计时器,检查按下空格键时是否经过足够的秒数
for m in missiles:
    if m.y < 640 and m.y > 0:
        m.render()
        m.y += -5