def hunt( self, task ): if self.body.node.isEmpty(): return Task.done if self.target == None or self.target.isEmpty() or self.target.getTag("type") == "destroyed": list = render.findAllMatches("**/=type=robot") print "list size = " + str(list.size()) if list.size() < 2: return Task.cont target = randint(0, list.size() - 1 ) self.target = list.getPath( target ) if self.target == self.body.node: return Task.cont if task.time - self.time <= 0.1: return Task.cont self.time = task.time if calcDistance2D( self.target.getPos().getXy(), self.body.node.getPos().getXy() ) < 1: if task.time - self.bulletTime >= 5: Bullet(self.body.node.getX(), self.body.node.getY(), self.body.node.getZ(), calcDirection( self.body.node.getPos(), self.target.getPos() ),self.id) self.bulletTime = task.time else: direction = calcDirection2D(self.body.node.getPos().getXy(), self.target.getPos().getXy() ) # print "in hunt direction=" # print direction self.body.node.setH(Vec2.signedAngleDeg(Vec2(0,1), Vec2(direction.getX(),direction.getY()))) self.body.node.setX( self.body.node.getX() + direction.getX() ) self.body.node.setY( self.body.node.getY() + direction.getY() ) return Task.cont
def __init__(self, x, y, z, direction, id): NodePath.__init__(self,loader.loadModel("../Models/missile")) self.reparentTo(render) self.setPos(x, y, z) self.direction = Vec3() self.direction.set(direction.getX(), direction.getY(), direction.getZ()) self.setH(Vec2.signedAngleDeg(Vec2(0,1), Vec2(direction.getX(),direction.getY()))) if self.direction.length() == 0: self.removeNode() return self.direction /= direction.length() min, max = self.getTightBounds() size = max - min maximum = -1 for i in size: if i > maximum: maximum = i self.cnode = CollisionNode('bullet') self.cnode.setTag( "id", str(id) ) self.cnode.addSolid(CollisionSphere(0, 0, 0, maximum + 0.3)) self.cnodePath = self.attachNewNode(self.cnode) self.cnodePath.show() base.cTrav.addCollider(self.cnodePath, base.event) taskMgr.add(self.updateBullet, "update Bullet") print radiansToDegrees(atan2(direction.getY(),direction.getX()))
def randomWalk( self, task ): if self.body.node == None or self.body.node.isEmpty(): return Task.done if task.time - self.time <= 0.1: return Task.cont self.time = task.time if calcDistance2D(self.destination, self.body.node.getPos().getXy() ) <= 1: self.setRandomPoint( self.destination ) direction = calcDirection2D(self.body.node.getPos().getXy(), self.destination) #print "randomWalk destination =" #print direction self.body.node.setH(Vec2.signedAngleDeg(Vec2(0,1), Vec2(direction.getX(),direction.getY()))) self.body.node.setX( self.body.node.getX() + direction.getX() ) self.body.node.setY( self.body.node.getY() + direction.getY() ) return Task.cont