So I am, again, stuck with the problem of interacting via collision entries. I’ve managed to access the actor from the entries, but I am now unable to acces the methods of the actor’s class. My basic setup is that I have a Moving() task-method and a Move() method within the Unit() class, and I want to, from within my World() class, trigger the Move() method in response to a right mouse-click, which activates the Moving() task.
The trouble is, I get “libpanda.NodePath has no attribute ‘moving’” when I try to call the Unit() class’s Moving() function via an instance of Unit() called ‘unit’. I have also tried adding the task to the taskmanager directly from the World() class, which was unsuccessful.
I thought that the way to call a class’ methods from within another class was to use an instance, and I believe that’s what I’m doing, so what’s the problem?
Here is the relevant code. First, the click-triggering:
def rightClick(self): for i in range(self.moverHandler.getNumEntries()): entry = self.moverHandler.getEntry(i) if (entry.getIntoNode().getName() == "floorcollider"): for oldArrow in self.indicatorArrow: oldArrow.remove() self.indicatorArrow =  pos = entry.getSurfacePoint(render) arrow = indicatorArrow(pos) self.indicatorArrow.append(arrow) for unit in self.selectedUnits: position = unit.getPos(unit) target = entry.getSurfacePoint(unit) moveVector = target - position moveHeading = math.degrees(math.atan2(moveVector.getY(), moveVector.getX())) + 90 if moveHeading < 0: moveHeading += 360 unit.setH(unit, moveHeading) unit.move(pos)
Then, the unit’s movement code:
def move(self, pos): taskMgr.add(self.moving, "moving", extraArgs=[pos]) def moving(self, task, target): self.pos = self.actor.getPos(self.actor) self.targetPos = target.getPos(self.actor) self.move = self.targetPos - self.pos self.moveX = self.move.getX() self.moveY = self.move.getY() self.moveZ = self.move.getZ() self.twoDdistance = math.sqrt((self.moveX * self.moveX) + (self.moveY * self.moveY)) self.threeDdistance = math.sqrt((self.twoDdistance * self.twoDdistance) + (self.moveZ * self.moveZ)) if self.threeDdistance > 5: self.actor.setY(self.actor, +40 * globalClock.getDt()) return task.cont elif self.threeDdistance <= 5: return task.done
Keep in mind that I am trying to make the code viable even if several units are moving at once, RTS-style, which one reason it seems a better idea to have the movement handled in the unit class itself, rather than in a superordinate class.
Any and all help is greatly appreciated!