Python TypeError:参数1必须是pygame.Surface,而不是None
我正在制作一个类似于Galaga的电脑游戏。我在碰撞中遇到了麻烦,无法让物体在没有错误的情况下消失。我想让激光在与敌人碰撞时消失,敌人在10次左右的命中后消失。我不理解出现的错误,也不理解如何解决问题 谢谢 代码:Python TypeError:参数1必须是pygame.Surface,而不是None,python,python-2.7,Python,Python 2.7,我正在制作一个类似于Galaga的电脑游戏。我在碰撞中遇到了麻烦,无法让物体在没有错误的情况下消失。我想让激光在与敌人碰撞时消失,敌人在10次左右的命中后消失。我不理解出现的错误,也不理解如何解决问题 谢谢 代码: 导入pygame、sys、pygame.mixer 从系统导入退出 随机输入 从pygame导入* 导入时间 h=700 w=700 m=0 h=0 分数=0 screen=pygame.display.set_模式((w,h)) clock=pygame.time.clock()
导入pygame、sys、pygame.mixer
从系统导入退出
随机输入
从pygame导入*
导入时间
h=700
w=700
m=0
h=0
分数=0
screen=pygame.display.set_模式((w,h))
clock=pygame.time.clock()
完成=错误
x=400
y=400
白色=(255,255,255)
background=pygame.image.load('water.png')
pygame.init()
职业球员:
定义初始化(self,x,y):
self.x=x
self.y=y
自宽=100
自身高度=100
自速度=0
self.images=pygame.image.load('speeder.png')
self.numImages=6
self.cImage=0
def更新(自我):
self.speedx=0
self.speeded=0
pressed=pygame.key.get_pressed()
如果按下[pygame.K_LEFT]:
self.speedx-=8
如果按下[pygame.K_RIGHT]:
self.speedx+=8
self.x+=self.speedx
如果按下[pygame.K_DOWN]:
self.cImage=0
self.y+=4
如果按下[pygame.K_UP]和(self.cImage=5:
self.cImage=5
def渲染(自身,屏幕):
blit(self.images,(self.x,self.y),(self.cImage*self.width,0,self.width,self.height))
第1类:
定义初始化(self,x,y):
self.x=x
self.y=y
self.width=128
self.height=128
自速度=0
self.images=pygame.image.load('enemy1.png')
self.numImages=7
self.cImage=0
self.z=0
self.j=0
self.rect=self.images.get_rect()
def更新(自我):
self.j+=1
self.speedx=0
self.speeded=0
self.y+=1
如果self.z 100和self.z<200:
self.x+=random.randint(-2,-1)
#self.cImage+=1
如果self.z>=200:
self.z=0
如果self.j%10==0:
self.cImage+=1
如果self.cImage==7:
self.cImage=0
self.z+=random.randint(0,5)
def渲染(自身,屏幕):
blit(self.images,(self.x,self.y),(self.cImage*self.width,0,self.width,self.height))
激光类(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load('lazer.png')
self.rect=self.image.get_rect()
self.m=0
def更新(自我):
self.m+=1
如果(self.m%5)!=0或self.m%4!=1:
自校正y-=13
def杀死(自我):
self.image=None
类RLaser(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load('lazer.png')
self.rect=self.image.get_rect()
self.m=0
def更新(自我):
self.m+=1
如果(self.m%5)!=0或self.m%4!=1:
自校正y+=13
班长(pygame.sprite.sprite):
定义初始化(self,x,y):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.x=x
self.y=y
自宽=50
自身高度=100
自速度=0
self.images=pygame.image.load('boss.png')
self.numImages=5
self.cImage=0
self.z=0
self.rect=self.images.get_rect()
def更新(自我):
self.speedx=0
self.speeded=0
self.y+=1
如果self.z 100和self.z<200:
self.x+=random.randint(-2,-1)
self.cImage+=1
如果self.z>=200:
self.z=0
如果self.cImage==5:
self.cImage=4
self.z+=random.randint(0,5)
def渲染(自身,屏幕):
blit(self.images,(self.x,self.y),(self.cImage*self.width,0,self.width,self.height))
pygame.init()
所有精灵列表=pygame.sprite.Group()
laser_list=pygame.sprite.Group()
#enemy1blast_list=pygame.sprite.Group()
玩家=玩家(400590)
凸台=凸台(300100)
敌人=敌人1(100,50)
j=0
虽然没有这样做:
j+=1
屏幕光点(背景,(0,(-690*2)+j))
屏幕光点(背景,(0,-690+j))
屏幕光点(背景,(0,j))
屏幕光点(背景,(0690+j))
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
完成=正确
pressed=pygame.key.get_pressed()
#j+=1
#如果j%10==0:
#enemy1blaster=Enemy1Blast()
#enemy1blaster.rect.x=敌人.x
#enemy1blaster.rect.y=敌人.y
#所有精灵列表。添加(enemy1blaster)
#enemy1blast_列表。添加(enemy1blaster)
如果按下[pygame.K_SPACE]:
m+=2
如果(m%4)!=0:
激光=激光()
laser.rect.x=(player.x+14)
laser.rect.y=(player.y-6)
所有精灵列表。添加(激光)
激光列表。添加(激光)
对于激光器列表中的激光器:
如果laser.rect.x>=敌方.rect.x或laser.rect.x=敌方.rect.y或laser.rect.y,代码中的哪一行出现错误?在绘制它们时,第252行有问题。回溯(最后一次调用):文件“/Users/mktalaga/Desktop/Canterbury 2016/Computer Tech 2/Final.py”,第252行,在所有精灵列表中绘制(屏幕)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/pygame/sprite.py”,第409行,在draw self.spritedict[spr]=surface_blit(spr.image,spr.rect)TypeError:参数1必须是pygame.Surface,而不是None我还没有使用pygame,但第252行显示的是screen
是None
。我看不出它将被设置为否
import pygame, sys, pygame.mixer
from sys import exit
import random
from pygame import *
import time
h = 700
w = 700
m = 0
h = 0
score = 0
screen = pygame.display.set_mode((w, h))
clock = pygame.time.Clock()
done = False
x = 400
y = 400
white = (255, 255, 255)
background = pygame.image.load('water.png')
pygame.init()
class Player:
def __init__(self, x, y):
self.x = x
self.y = y
self.width = 100
self.height = 100
self.velocity = 0
self.images = pygame.image.load('speeder.png')
self.numImages = 6
self.cImage = 0
def update(self):
self.speedx = 0
self.speedy = 0
pressed = pygame.key.get_pressed()
if pressed[pygame.K_LEFT]:
self.speedx -= 8
if pressed[pygame.K_RIGHT]:
self.speedx += 8
self.x += self.speedx
if pressed[pygame.K_DOWN]:
self.cImage = 0
self.y += 4
if pressed[pygame.K_UP] and (self.cImage <= self.numImages - 1):
self.cImage += 1
self.y -= 10
if self.cImage >= 5:
self.cImage = 5
def render(self, screen):
screen.blit(self.images, (self.x, self.y), (self.cImage * self.width, 0, self.width, self.height))
class Enemy1:
def __init__(self, x, y):
self.x = x
self.y = y
self.width = 128
self.height = 128
self.velocity = 0
self.images = pygame.image.load('enemy1.png')
self.numImages = 7
self.cImage = 0
self.z = 0
self.j = 0
self.rect = self.images.get_rect()
def update(self):
self.j += 1
self.speedx = 0
self.speedy = 0
self.y += 1
if self.z <= 100:
self.x += random.randint(1, 2)
elif self.z > 100 and self.z < 200:
self.x += random.randint(-2, -1)
#self.cImage += 1
if self.z >= 200:
self.z = 0
if self.j % 10 == 0:
self.cImage += 1
if self.cImage == 7:
self.cImage = 0
self.z += random.randint(0, 5)
def render(self, screen):
screen.blit(self.images, (self.x, self.y), (self.cImage * self.width, 0, self.width, self.height))
class Laser(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('lazer.png')
self.rect = self.image.get_rect()
self.m = 0
def update(self):
self.m += 1
if (self.m % 5) != 0 or self.m % 4 != 1:
self.rect.y -= 13
def kill(self):
self.image = None
class RLaser(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('lazer.png')
self.rect = self.image.get_rect()
self.m = 0
def update(self):
self.m += 1
if (self.m % 5) != 0 or self.m % 4 != 1:
self.rect.y += 13
class Boss(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.x = x
self.y = y
self.width = 50
self.height = 100
self.velocity = 0
self.images = pygame.image.load('boss.png')
self.numImages = 5
self.cImage = 0
self.z = 0
self.rect = self.images.get_rect()
def update(self):
self.speedx = 0
self.speedy = 0
self.y += 1
if self.z <= 100:
self.x += random.randint(1, 2)
elif self.z > 100 and self.z < 200:
self.x += random.randint(-2, -1)
self.cImage += 1
if self.z >= 200:
self.z = 0
if self.cImage == 5:
self.cImage = 4
self.z += random.randint(0, 5)
def render(self, screen):
screen.blit(self.images, (self.x, self.y), (self.cImage * self.width, 0, self.width, self.height))
pygame.init()
all_sprites_list = pygame.sprite.Group()
laser_list = pygame.sprite.Group()
#enemy1blast_list = pygame.sprite.Group()
player = Player(400, 590)
boss = Boss(300, 100)
enemy = Enemy1(100, 50)
j = 0
while not done:
j += 1
screen.blit(background, (0, (-690 * 2) + j))
screen.blit(background, (0, -690 + j))
screen.blit(background, (0, j))
screen.blit(background, (0, 690 + j))
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
pressed = pygame.key.get_pressed()
#j += 1
#if j % 10 == 0:
# enemy1blaster = Enemy1Blast()
# enemy1blaster.rect.x = enemy.x
# enemy1blaster.rect.y = enemy.y
#all_sprites_list.add(enemy1blaster)
#enemy1blast_list.add(enemy1blaster)
if pressed[pygame.K_SPACE]:
m += 2
if (m % 4) != 0:
laser = Laser()
laser.rect.x = (player.x + 14)
laser.rect.y = (player.y - 6)
all_sprites_list.add(laser)
laser_list.add(laser)
for laser in laser_list:
if laser.rect.x >= enemy.rect.x or laser.rect.x <= enemy.rect.x and laser.rect.y >= enemy.rect.y or laser.rect.y <= enemy.rect.y:
laser.kill()
if pressed[pygame.K_SPACE]:
h += 2
if (h % 4) != 0:
l = Laser()
l.rect.x = (player.x + 61)
l.rect.y = (player.y - 6)
all_sprites_list.add(l)
laser_list.add(l)
lsound = pygame.mixer.Sound("Laser.wav")
lsound.play()
if j % 20 == 0 and boss.y <= 700:
bl = RLaser()
bl2 = RLaser()
bl.rect.x = (boss.x + 1)
bl.rect.y = (boss.y + 50)
bl2.rect.x = (boss.x + 19)
bl2.rect.y = (boss.y + 50)
all_sprites_list.add(bl)
all_sprites_list.add(bl2)
laser_list.add(bl)
laser_list.add(bl2)
blsound = pygame.mixer.Sound("Laser.wav")
blsound.play()
#if bool(bl) == True:
#bl.rect.y += 26
all_sprites_list.update()
#if bool(bl) == True:
#bl.rect.y += 26
#for laser in laser_list:
# if pygame.sprite.collide_rect(boss, laser):
# laser.kill()
# print "asdfasdf"
if player.y <= 200:
player.y = 202
if player.y >= 633:
player.y = 631
if player.x >= 623:
player.x = 621
if player.x <= -30:
player.x = -28
#Collision_Detector(laser, l, boss)
boss.render(screen)
boss.update()
enemy.render(screen)
enemy.update()
player.render(screen)
player.update()
boss_laser_hlist = pygame.sprite.spritecollide(boss, laser_list, False)
enemy_laser_hlist = pygame.sprite.spritecollide(enemy, laser_list, False)
for laser in enemy_laser_hlist:
score += 1
for laser in boss_laser_hlist:
score += 1
print score
all_sprites_list.draw(screen)
pygame.display.update()
clock.tick(30)