自上而下的射手僵尸生存如何让玩家射击?

时间:2015-07-07 21:28:14

标签: python pygame dir direction

有人请告诉我如何让子弹类/变量工作,因为我总是得到错误“'子弹'对象不可调用”。

继承人的子弹课程

class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.image = pygame.Surface([3,3])
        self.image.fill(brown)
        self.rect = self.image.get_rect()
        self.rect.center = Body.rect.center
        self.tick = True
        self.tickNum = 0
        self.tickTarget = 10

    def update(self):
        if self.tickNum == self.tickTarget:
            self.tick = True
        else:
            self.tickNum += 1

        self.velX = mouseX/20
        self.velY = mouseY/20

        self.rect.x += self.velX
        self.rect.y += self.velY

继续称呼它并使其射击

while True:
    if buttonDown:
        Bullet = Bullet()

        if Bullet.tick == True:            
            bullet_list.add(Bullet)
            all_sprites_list.add(Bullet)
            Bullet.tick = False

以下是整个代码:

import pygame, sys, time, math
from pygame.locals import *

pygame.init()

pygame.display.set_caption("###Zombie Survival###")

fps = 60

clock = pygame.time.Clock()

dpWidth = 1500
dpHeight = 800
middleX = int(dpWidth/2)
middleY = int(dpHeight/2)
middle = middleX,middleY
dp = pygame.display.set_mode((dpWidth,dpHeight))

mouseX = 0
mouseY =  0
mouse = mouseX,mouseY
buttonDown = False

black = 0,0,0
white = 255,255,255
purple = 255,0,255
lightblue = 170,190,255
blue = 0,0,255
red = 255,0,0
brown = 85,65,0
green = 0,100,0

all_sprites_list = pygame.sprite.Group()
zombie_list = pygame.sprite.Group()
bullet_list = pygame.sprite.Group()
block_list = pygame.sprite.Group()
player_list = pygame.sprite.Group()

load = pygame.image.load

class Legs(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.image = load("player/player_legs_1.png")
        self.rect = self.image.get_rect()
        self.rect.center = middle
        self.animate = False
        self.timeNum = 0
        self.newImg = 1
        self.timeTarget = 8
        self.rootImg = "player/player_legs_"

    def update(self):
        updatePlayer(self)          

class Body(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.image = load("player/player_gun_1.png")
        self.rect = self.image.get_rect()
        self.rect.center = middle
        self.animate = False
        self.timeNum = 0
        self.newImg = 1
        self.timeTarget = 5
        self.rootImg = "player/player_gun_"

    def update(self):
        updatePlayer(self)

class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.image = pygame.Surface([3,3])
        self.image.fill(brown)
        self.rect = self.image.get_rect()
        self.rect.center = Body.rect.center
        self.tick = True
        self.tickNum = 0
        self.tickTarget = 10

    def update(self):
        if self.tickNum == self.tickTarget:
            self.tick = True
        else:
            self.tickNum += 1

        self.velX = mouseX/20
        self.velY = mouseY/20

        self.rect.x += self.velX
        self.rect.y += self.velY

##class Zombie(pygame.sprite.Sprite):
##
##class Block(pygame.sprite.Sprite):

def basic():
    global mouseX
    global mouseY
    global mouse
    global buttonDown

    for event in pygame.event.get():
        if event.type == MOUSEMOTION:
            mouseY = event.pos[1]
            mouseX = event.pos[0]
            mouse = mouseX,mouseY
        if event.type == MOUSEBUTTONDOWN:
            buttonDown = True
        elif event.type == MOUSEBUTTONUP:
            buttonDown = False
        elif event.type == QUIT:
            pygame.quit()
            exit

    curser()

def curser():
    pygame.draw.circle(dp,black,mouse,10,2)
    pygame.draw.circle(dp,black,mouse,3)

def rotatePlayer(Class):  
    playerXdif = mouseX-middleX
    playerYdif = mouseY-middleY
    dif = (playerXdif),(playerYdif)

    rotDeg1 = math.atan2(dif[0],dif[1])
    rotDeg2 = math.degrees(rotDeg1)

    img1 = rotateImage(Class.image,rotDeg2)

    return img1

def rotateImage(img,angle):
    orig_rect = img.get_rect()
    rot_img = pygame.transform.rotate(img,angle)
    rot_rect = orig_rect.copy()
    rot_rect.center = rot_img.get_rect().center
    rot_img = rot_img.subsurface(rot_rect).copy()

    return rot_img

def updatePlayer(Class):
        Class.newTimeTarget = int(fps/Class.timeTarget)

        if Class.animate == True:
            Class.timeNum += 1

            if Class.timeNum == self.newTimeTarget:
                if Class.newImg != self.maxImg:
                    Class.newImg += 1
                else:
                    Class.newImg = 1
                    Class.animate = False
                Class.timeNum = 0
        else:
            Class.newImg = 1

        Class.image = load(str(Class.rootImg+str(Class.newImg)+".png"))
        Class.image = rotatePlayer(Class)

Legs = Legs()
Body = Body()
player_list.add([Body,Legs])
all_sprites_list.add([Body,Legs])

while True:
    if buttonDown:
        Bullet = Bullet()

        if Bullet.tick == True:            
            bullet_list.add(Bullet)
            all_sprites_list.add(Bullet)
            Bullet.tick = False

    dp.fill(green)

    basic()

    all_sprites_list.update()
    all_sprites_list.draw(dp)

    clock.tick(fps)

    #print(mouse)

    pygame.display.update()

1 个答案:

答案 0 :(得分:3)

Bullet = Bullet()是你的问题。你正在为命名空间做些讨厌的事情。相反,请执行bullet = Bullet()b = Bullet()

之类的操作