2017-01-26 2 views
-1

Im mit Python 2.7 und pygame im ein Space Invaders Spiel, aber im immer diesen Fehler und sein sagen sein ein Problem mit der LinieTypeError: 'Bool'-Objekt ist nicht aufrufbar?

screen.blit(font.render(str(hits),True(255,255,255)),(400,320)) 

könnte mir jemand sagen, was das bedeutet und wie man es beheben machen versuchen, bitte ? der vollständige Code ist

import pygame, sys, random, time, math 
from pygame.locals import * 
pygame.init() 
clock = pygame.time.Clock() 
pygame.display.set_caption("Space Invaders") 
screen = pygame.display.set_mode((640,650)) 
badguy_image = pygame.image.load("images/badguy.png").convert() 
badguy_image.set_colorkey((0,0,0)) 
fighter_image = pygame.image.load("images/fighter.png").convert() 
fighter_image.set_colorkey((255,255,255)) 
GAME_OVER = pygame.image.load("images/gameover.png").convert() 
font = pygame.font.Font(None,20) 
last_badguy_spawn_time = 0 
score = 0 
shots = 0 
hits = 0 
misses = 0 

class Badguy: 

    def __init__(self): 
     self.x = random.randint(0,570) 
     self.y = -100 
     d=(math.pi/2)*random.random()-(math.pi/4) 
     speed = random.randint(2,6) 
     self.dx=math.sin(d)*speed 
     self.dy=math.cos(d)*speed 

    def move(self):    
     self.x += self.dx 
     self.y += self.dy 

    def bounce(self): 
     if self.x < 0 or self.x > 570: 
      self.dx *= -1 

    def off_screen(self): 
     return self.y > 640 

    def touching(self,missile): 
     return (self.x+35-missile.x)**2+(self.y+22-missile.y)**2 < 1225 

    def score(self): 
     global score 
     score+=100 

    def draw(self): 
     screen.blit(badguy_image,(self.x,self.y))  

class Fighter: 
    def __init__(self): 
     self.x = 320 

    def move(self): 
     if pressed_keys[K_LEFT] and self.x > 0: 
      self.x -=3 
     if pressed_keys[K_RIGHT] and self.x < 540: 
      self.x +=3    

    def fire(self): 
     global shots 
     shots+=1 
     missiles.append(Missile(self.x+50)) 

    def hit_by(self,badguy): 
     return (
       badguy.y > 585 and 
       badguy.x > self.x - 55 and 
       badguy.x < self.x + 85 
       ) 

    def draw(self): 
     screen.blit(fighter_image,(self.x,591))    

class Missile: 
    def __init__(self,x): 
     self.x = x 
     self.y = 591 

    def move(self): 
     self.y -= 5 

    def off_screen(self): 
     return self.y < -8 

    def draw(self): 
     pygame.draw.line(screen,(255,0,0),(self.x,self.y),(self.x,self.y+8),1) 

badguys = [] 
fighter = Fighter() 
missiles = [] 

while 1: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      sys.exit() 
     if event.type == KEYDOWN and event.key == K_SPACE: 
      fighter.fire() 
    pressed_keys = pygame.key.get_pressed() 

    if time.time() - last_badguy_spawn_time > 0.5: 
     badguys.append(Badguy()) 
     last_badguy_spawn_time = time.time() 

    screen.fill((0,0,0)) 
    fighter.move() 
    fighter.draw() 

    i = 0 
    while i < len(badguys): 
     badguys[i].move() 
     badguys[i].bounce() 
     badguys[i].draw() 
     if badguys[i].off_screen(): 
      del badguys[i] 
      i -= 1 
     i += 1 

    i = 0 
    while i < len(missiles): 
     missiles[i].move() 
     missiles[i].draw() 
     if missiles[i].off_screen(): 
      del missiles[i] 
      misses += 1 
      i -= 1 
     i += 1 

    i = 0 
    while i < len(badguys): 
     j = 0 
     while j < len(missiles): 
      if badguys[i].touching(missiles[j]): 
       badguys[i].score() 
       hits += 1 
       del badguys[i] 
       del missiles[j] 
       i -= 1 
       break 
      j += 1 
     i += 1 

    screen.blit(font.render("Score: "+str(score),True,(255,255,255)),(5,5)) 

    for badguy in badguys: 
     if fighter.hit_by(badguy): 
      screen.blit(GAME_OVER,(170,200))    
      screen.blit(font.render(str(shots),True,(255,255,255)),(266,320)) 
      screen.blit(font.render(str(score),True,(255,255,255)),(266,348)) 
      screen.blit(font.render(str(hits),True(255,255,255)),(400,320)) 
      screen.blit(font.render(str(misses),True,(255,255,255)),(400,377)) 
      if shots == 0: 
       screen.blit(font.render("--",True,(255,255,255)),(400,357)) 
      else: 
       screen.blit(font.render(str((1000*hits/shots)/10.)+"%",True,(255,255,255)),(400,357))    
      while 1: 
       for event in pygame.event.get(): 
        if event.type == QUIT: 
         sys.exit() 
       pygame.display.update() 

    pygame.display.update()  
+0

hast du komma ',' nach 'True' vergessen - also versuchst du jetzt' True() ' – furas

Antwort

1

Sie Komma vergessen , nach True - so jetzt Sie versuchen, Funktion aufzurufen True()

Aber True ist bool Objekt, nicht funktionieren - es ist also nicht "callable" - und Sie erhalten Fehler.

+0

wie kann ich vermeiden, solche Dinge in der Zukunft zu verpassen? Ich habe diesen Code viele Male angeschaut und nie das fehlende Komma bemerkt – Spoooky

+0

Sie können nicht vermeiden, aber jetzt wissen Sie, was dieser Fehler bedeutet und wo das Problem sein kann - so können Sie dieses nächste Mal leicht auflösen. – furas

+1

BTW: vielleicht, wenn Sie 'IDE' ('PyCharm',' PyDev', etc.) statt 'Notepad ++' dann könnte es Sie über das erwartete Problem warnen - aber ich bin mir sicher. – furas

Verwandte Themen