Mizipzor a écrit :
I have some troubles with a member variable that seems to be missing
in a class. In short, heres what I do; class A is the parent class, B
inherits from A and C inherits from B (hope I used the right words
there). Now, I create an instance of C, which calls A's __init__ which
in turn creates all the member variables. Then I call C.move() (a
function defined in A), but then, one of the variables seems to have
become 'NoneType'.
The code can be found here (Ive taken away unnecessery stuff):
http://pastebin.com/875394
The exact error is (which occur on line 15 in the pasted code):
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'
Alas, there's a dependency on an unknown class or function vector (which
I presume lives in the eponym module), so we just can guess that the
call to vector() at line 8 returned None. IOW, the problem is elsewhere...
Any comments are welcome. :)
You ask for it, you get it:
import pygame, math
from pygame.locals import *
=bad style
import tilemap, dataManager
from vector import *
=idem
class _BaseEntity:
=class _BaseEntity(object):
def __init__(self, type, x, y):
self._direction = vector()
self.pos = vector(x,y)
self.stats = dataManager.getEntityStats(type)
self.hp = self.stats.maxHp # todo: make all atttributes local
def move(self):
""" moves the entity in its direction according to its speed """
self.pos += (self._direction * self.stats.speed)
def setDirection(self, point, y = None):
""" sets the direction to point, and normalises it
if y is specifed, "point" is expected to be x,
otherwise, "point" is expected to be a vector class """
# make a vector
if not y == None:
= if y is not None:
point = vector(point, y)
self._direction = point.normalise()
#def lookAt(self, point, y = None):
# """ changes the angle so the entity "looks" at the specified
coords
# if y is specifed, "point" is expected to be x,
# otherwise, "point" is expected to be a vector class """
# # make a vector
# if not y == None:
# point = vector(point, y)
=code duplication, should be factored out
# vec = vector(point.x - self.posx, point.y - self.posy)
# vec.normalise()
#
# angle = math.degrees(math.asin(vec.y))
# print angle
def draw(self, targetSurface):
""" blits the entire stats.image onto the targetSurface at the
ent's coords """
targetSurface.blit(self.stats.image, (self.pos.x,self.pos.y))
class Entity(_BaseEntity):
def __init__(self, type, x = 0, y = 0):
_BaseEntity.__init__(self, type, x, y)
=You don't need to override the __init__ method if it's just to call
the superclass's __init__ with the same args...
(snip)