我定义了检查触摸(如果玩家触摸对象)并收到此错误:不支持的操作数类型 -: 'NoneType' 和 'NoneType'



我从老师那里复制了一个示例,遇到了以下错误:

Traceback (most recent call last):
File "G:/LF15/Python/29.09.20 TEST.py", line 81, in <module>
checkTouching()
File "G:/LF15/Python/29.09.20 TEST.py", line 45, in checkTouching
if -10 < y - ballY < 10 and -10 < x - ballX < 10:
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'

这是我的代码:

import random
import pygame
pygame.init()
#Farben bestimmen
red = pygame.color.Color("#FF8080")
blue = pygame.color.Color("#8080FF")
white = pygame.color.Color("#FFFFFF")
black = pygame.color.Color("#000000")
width = 400
height = 300
windowsize = [width, height]
window = pygame.display.set_mode(windowsize)
clock = pygame.time.Clock()
# Position Spieler
x = int(windowsize[0]/2)
y = int (windowsize[1]/2)
#Position Ball
ballX = random.randrange(0, windowsize[0])
ballY = random.randrange(0, windowsize[1])
def checkOffWindowX(x) :
if x > windowsize[0]:
x = 0
elif x < 0:
x = windowsize[0]
return x
def checkOffWindowY(y):
if y > windowsize[1]:
y = 0
elif y < 0:
y = windowsize[1]
return y
def checkTouching():
global x
global ballX
global y
global ballY
if -10 < y - ballY < 10 and -10 < x - ballX < 10:
pygame.draw.circle (window, white, [x, y],15)
xDiff = x - ballX
yDiff = y - ballY
#Falls der Spielball in einer Ecke sein sollte
if  ballY == 0:
xDiff -= 5
elif ballX == windowsize[0]:
xDiff += 5
if ballY == windowsize[1]:
yDiff += 5
#Spielball und Spieler verschieben
x += xDiff *3
ballX -= xDiff *3
y += xDiff *3
ballY -= yDiff *3
done = False
while not done:
window.fill(black)
keys = pygame.key.get_pressed()
#Bewegung Spieler
if keys [pygame.K_UP]:
y -= 1
if keys[pygame.K_DOWN]:
y += 1
if keys[pygame.K_LEFT]:
x -= 1
if keys[pygame.K_RIGHT]:
x += 1
#Positionsbestimmung
x = checkOffWindowX(x)
y = checkOffWindowY(y)
ballX = checkOffWindowX(ballX)
ballY = checkOffWindowY(ballY)
#Auf Berührung testen
checkTouching()
#Spieler zeichnen
pygame.draw.circle (window, red, [x, y], 6)
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
clock.tick(72)
pygame.quit()

功能,其中错误是关于检查玩家是否触摸对象。顺便说一句,忽略德国的评论。如果你想知道评论里写了什么,我可以翻译一下。我是pygame的新手,我还在学习基本功能

这是一个缩进的问题。checkOffWindowXcheckOffWindowY在任何情况下都需要返回一个值。如果函数没有显式返回值,则返回值None,因此分别xyballXballY变为None

def checkOffWindowX(x) :
if x > windowsize[0]:
x = 0
elif x < 0:
x = windowsize[0]
#<--| INDENTATION
return x
def checkOffWindowY(y):
if y > windowsize[1]:
y = 0
elif y < 0:
y = windowsize[1]
#<--| INDENTATION
return y

您可以使用%(模)运算符简化代码:

def checkOffWindowX(x) :
return x % windowsize[0]
def checkOffWindowY(y):
return y % windowsize[1]

最新更新