Pygame子弹被画后不动

时间:2016-07-11 01:04:52

标签: python pygame

我对python很新,我无法弄清楚什么是错的。我试图让子弹出现并移动,但它不会那样做,它会被卡在玩家身上。我的代码有点混乱,但现在是:

screen = pygame.display.set_mode((512,512))
pygame.display.set_caption('The Necromancer')

background = pygame.image.load('textures/background/background1.png')
titlecard = pygame.image.load('textures/title/titlecard0.png')
chars = pygame.image.load('textures/char/chardown1.png')
skeleton = pygame.image.load('textures/char/chardown2.png')

up = 0
down = 0
right = 0
left = 0
x = 64
y = 64
selected = 0
titletime = 0
level = 0
facing = 'down'
dir = "down"
ballx = x
bally = y
ballstage = 0
spacetimer = 0
ballon = 0

global ballon
global ballstage
global dir
global ballx
global bally
global facing
global x
global y

class char(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.imagedown = pygame.image.load('textures/char/chardown1.png').convert_alpha()
        self.imagedown = pygame.transform.scale(self.imagedown, (64,64))
        self.imageup = pygame.image.load('textures/char/charup1.png').convert_alpha()
        self.imageup = pygame.transform.scale(self.imageup, (64,64))
        self.imageleft = pygame.image.load('textures/char/charleft1.png').convert_alpha()
        self.imageleft = pygame.transform.scale(self.imageleft, (64,64))
        self.imageright = pygame.image.load('textures/char/charright1.png').convert_alpha()
        self.imageright = pygame.transform.scale(self.imageright, (64,64))

        self.rect = screen.get_rect()

    def draw(self):

        if facing == 'up':
            screen.blit(self.imageup, (x,y))
        if facing == 'down':
            screen.blit(self.imagedown, (x,y))
        if facing == 'left':
            screen.blit(self.imageleft, (x,y))
        if facing == 'right':
            screen.blit(self.imageright, (x,y))
        pygame.display.update()

class ball(pygame.sprite.Sprite):

    def __init__(self, surface, bax, bay):
        #pygame.sprite.Sprite.__init__(self)
        self.surface = surface
        self.x = bax
        self.y = bay
        self.image = pygame.image.load('textures/proj/purpball1.png').convert_alpha()
        self.image = pygame.transform.scale(self.image, (64,64))
        self.rect = screen.get_rect()
        return

    def update(self):

        ballstage += 1
        global ballstage

        if ballstage == 20:
            self.image = pygame.image.load('textures/proj/purpball1.png').convert_alpha()
        if ballstage == 40:
            self.image = pygame.image.load('textures/proj/purpball2.png').convert_alpha()
        if ballstage == 60:
            self.image = pygame.image.load('textures/proj/purpball3.png').convert_alpha()
        if ballstage == 80:
            self.image = pygame.image.load('textures/proj/purpball4.png').convert_alpha()
        self.image = pygame.transform.scale(self.image, (64,64))
        if ballstage == 100:
            ballstage = 0
        if dir == 'down':
            self.y += 1
        if dir == 'up':
            self.y -= 1
        if dir == 'right':
            self.x += 1
        if dir == 'left':
            self.x -= 1

        self.surface.blit(self.image, (self.x, self.y))
        return

ballGroup = []

pygame.display.update()

while True: #Update

    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    pygame.display.update()

    while level == 1:

        randx = random.randrange(0, 512, 64)
        randy = random.randrange(0, 512, 64)

        if dir == 'down':
            bally += 1
        if dir == 'up':
            bally -= 1
        if dir == 'right':
            ballx += 1
        if dir == 'left':
            ballx -= 1

        if x <= -1:
            x = 0

        if y <= -1:
            y = 0

        if x >= 449:
            x = 448

        if y >= 449:
            y = 448

        screen.blit(background, (0,0))
        #screen.blit(skeleton, (randx,randy))
        for ball in ballGroup:
            Ball = ball(screen, 64,64).update()
        char().draw()   
        skeleton = pygame.transform.scale(skeleton, (64, 64))
        background = pygame.transform.scale(background,(512,512))
        pygame.display.update()

        if left != 0:
            x += 1
            left -= 8
        if right != 0:
            x -= 1
            right -= 8
        if up != 0:
            y -= 1
            up -= 8
        if down != 0:
            y += 1
            down -= 8
        for event in pygame.event.get():

            if event.type == KEYDOWN:

                if event.key == K_d:

                    #char = pygame.image.load('textures/char/charright1.png')
                    facing = 'right'
                    left += 512

                if event.key == K_a:

                    facing = 'left'
                    #char = pygame.image.load('textures/char/charleft1.png')
                    right += 512

                if event.key == K_s:

                    facing = 'down'
                    #char = pygame.image.load('textures/char/chardown1.png')
                    down += 512

                if event.key == K_w:

                    facing = 'up'
                    #char = pygame.image.load('textures/char/charup1.png')
                    up += 512

                if event.key == K_SPACE:

                    if facing == 'down':
                        dir = 'down'
                    if facing == 'up':
                        dir = 'up'
                    if facing == 'left':
                        dir = 'left'
                    if facing == 'right':
                        dir = 'right'
                    #ballx = x
                    #bally = y
                    #spacetimer = 500
                    #ballon = 1
                    ballGroup.append(ball)

        if spacetimer != 0:
            spacetimer -= 1
            ballon = 1

        else:
            ballon = 0



    while level == 0:
    #title screen       
        titletime += 1
        screen.blit(titlecard, (0,0))               
        pygame.display.update()

        if selected == -1:
            selected = 0

        if selected == 0:
            titlecard = pygame.image.load('textures/title/titlecard0.png')

        if selected == 1:
            titlecard = pygame.image.load('textures/title/titlecard1.png')

        if selected == 2:
            titlecard = pygame.image.load('textures/title/titlecard2.png')

        if selected == 3:
            selected = 2

        if selected == 4:
            selected = 5

        for event in pygame.event.get():

            if event.type == KEYDOWN:

                if event.key == K_w:

                    selected -=1

                if event.key == K_s:

                    selected +=1

                if event.key == K_RETURN:

                    if selected == 0:

                        level = 1

                    if selected == 1:

                        titlecard = pygame.image.load('textures/title/credits.png')
                        selected = 4

                    if selected == 2:

                        sys.exit()

                    if selected == 5:

                        selected = 1

pygame.display.update()

如果名称 ==&#39; 主要&#39;:     main()的

1 个答案:

答案 0 :(得分:0)

很抱歉,但很难帮助您解决这个问题,因为代码有点麻烦。我不能自己尝试也不改变它,特别是因为你加载了计算机上的许多图像。尽量使其更易于管理,以便我们更容易查明问题。您可以按照以下步骤操作:

  1. 使用函数将代码划分为更小,更易于管理的块。
  2. 在写作中保持一致!有时你在if语句之间有一个新的界限,有时候你没有。尝试将相关代码块放在一起。
  3. 请务必向我们提供必要的代码。删除所有不必要的内容,例如您已注释掉的代码,并添加必要的代码作为导入的模块。这使我们更容易测试和查找错误。
  4. 您在顶部的变量都是全局变量。在定义它们之后,您不必明确地说它们是全局的。尝试使用IDLE作为 PyCharm (社区版本是免费的)。您将收到错误或裁员的通知。
  5. 只要不使代码不易阅读,请关注PEP8
  6. 至于试图回答你的问题。在你的代码中没有任何地方存在一颗子弹...你的意思是球吗?在那种情况下,你会做一些我不太了解的特殊事情。

    document.array = array

    我认为你打算做for ball in ballGroup: Ball = ball(screen, 64,64).update() ,因为知道你在每个游戏循环的64,64位创造新球。这可能是问题所在。另外,将变量命名为小写,将命名为大写。如果您希望其他人能够轻松阅读和理解您的代码,那么遵循这些约定非常重要。

    Here是学习制作pygame游戏的基本机制和结构的好教程。