【发布时间】:2020-02-02 21:26:21
【问题描述】:
程序运行时出现此错误:
Traceback (most recent call last):
File "G:/assets/gametest1.py", line 141, in <module>
cam = camera(318,0,220)
File "G:/gametest1.py", line 85, in __init__
super(camera,self).__init__(playerposX,characterPosX,y)
NameError: name 'characterPosX' is not defined
播放器类
class player:
def __init__(self, playerposX,characterPosX,y):
self.playerposX = playerposX
self.y = y
self.width = 88
self.height = 135
self.standing = True
self.left = False
self.right = True
self.vel = 15
self.jumping = False
self.jumpCount = 10
self.attacking = False
self.characterPosX = characterPosX
上面是玩家类的构造函数代码,代码的目的是让屏幕随着玩家的移动而滚动,最终在达到地图限制时停止
def move(self, playerposX, y):
self.k = pygame.key.get_pressed()
if self.k[pygame.K_LEFT] and self.playerposX > 0 - 45:
self.left = True
self.right = False
self.playerposX -= self.vel
self.standing = False
elif self.k[pygame.K_RIGHT] and self.playerposX < 1500 - 90:
self.right = True
self.left = False
self.standing = False
self.playerposX += self.vel
else:
self.standing = True
def jump(self, y):
if not (self.jumping): # checks if user's jumping intiating jump
if self.k[pygame.K_SPACE]:
self.jumping = True
else:
if self.jumpCount >= -10:
neg = 1
if self.jumpCount < 0:
neg = -1
self.y -= (self.jumpCount ** 2) * 0.5 * neg
self.jumpCount -= 1
else:
self.jumping = False
self.jumpCount = 10
def draw(self, win):
wLeft = pygame.image.load('runningleft.png')
wRight = pygame.image.load('running.png')
char = [pygame.image.load('idleright.png'), pygame.image.load('idleleft.png')]
attack = [pygame.image.load('attackleft.png'), pygame.image.load('attackright.png')]
if not (self.standing):
if self.left:
win.blit(wLeft, (self.playerposX, self.y))
elif self.right:
win.blit(wRight, (self.playerposX, self.y))
else:
if self.right:
win.blit(char[0], (self.playerposX, self.y))
if self.left:
win.blit(char[1], (self.playerposX, self.y))
if self.attacking == True:
if self.left:
win.blit(attack[0], (self.playerposX, self.y))
if self.right:
win.blit(attack[1], (self.playerposX, self.y))
我的目标是从父类(播放器)继承属性的子类相机。这是我将用来在玩家向前或向后移动时移动背景的代码
class camera(player):
def __init__(self, stagePosX,playerposX,y):
super(camera,self).__init__(playerposX,characterPosX,y)
self.playerposX = playerposX
self.startscrolling = bgWidth / 2
self.stagePosX = stagePosX
self.rel_x = 0
def scroll(self,stagePosX):
if self.k[pygame.K_LEFT]:
self.vel = (self.vel*-1)
elif self.k[pygame.K_RIGHT]:
self.vel = (self.vel*1)
else:
self.vel = 0
self.rel_x = self.stagePosX % bgWidth
if self.playerPosX > stageWidth - self.width:
self.playerPosX = self.stageWidth - self.width # If the player position exceeds the stage
if self.playerposX < 0 - self.width:
self.playerposX = self.width # If the player position is far left
if self.playerposX < self.startscrolling:
self.characterPosX = self.playerposX
elif self.playerposXplayerposX > stageWidth - self.startscrolling:
self.characterPosX = self.playerPosX - stageWidth + self.width
else:
self.characterPosX = self.startscrolling
self.stagePosX += -self.vel
def draw(self, win):
win.blit(bg, (self.rel_x - bgWidth, 0))
if self.rel_x < bgWidth:
win.blit(bg, (self.rel_x, 0))
【问题讨论】:
-
如果你想调用
player的__init__方法,你需要弄清楚你打算为characterPosX参数传递什么值。目前你只是在那个地方写characterPosX,一个在你试图使用它的上下文中不存在的变量。 -
是的,解释器是正确的(毫不奇怪),在表达式
super(camera,self).__init__(playerposX,characterPosX,y)中,变量characterPosX没有在范围内的任何地方定义。你为什么期望它被定义? -
我不明白我已经定义了不是吗?
标签: python python-3.x oop pygame