Bueno antes que nada aclaro que no soy ningún experto en programación python.
El problema que tengo es el siguiente:
Estoy dando clases de desarrollo de videojuegos RTS en blender, ya lo llevo muy bien. Me he encontrado con el siguiente obstáculo:
¿Como puedo pasar el valor de una variable objeto de un módulo a otro?
Estoy usando Windows 7 64bit| Blender 2.76b |
Mis módulos son los siguientes -> squadron.py | grid.py
El squadron.py es el siguiente:
Código: Seleccionar todo
from bge import logic
from math import *
import grid
######################################################
#
# Demo Script by: Diego Hiroshi | VindictuS HD@2016
#
######################################################
# Este script es un sistema de generación de Guerreros
# Los guerreros se crean en un limite de 6 a 8 unidades
# a lo largo de una matriz de 8x2 | Objeto: Estandarte
# Los NPC pasan a ser fieles seguidores a su Capitán 
# durante toda la partida o se los abandone/elmine
# Juegos Moba y RTS | DEV | Aplicado en Ingenieria
######################################################
 
######################################################
# No divulgues este script sin el consentimiento de
# preservar derechos de firma e información del Author
# Assets DEV-MOBA|RTS Update v0.6 Beta
######################################################
escena = logic.getCurrentScene()
class Banner:
    
    
    def __init__(self, controlador):
        
        self.own = controlador.owner
        self.target = escena.objects["Squadron"]        
        self.C02 = escena.objects["C02"]
        
        
    def getPosition_Hero (self):
        
        targetX = self.target.worldPosition[0]
        targetY = self.target.worldPosition[1]
        C02X = self.C02.worldPosition[0]
        C02Y = self.C02.worldPosition[1]
     
        self.own["targetX"] = targetX
        self.own["targetY"] = targetY
        
        self.own["C02X"] = C02X 
        self.own["C02Y"] = C02Y
        
        return self.own["C02X"], self.own["C02Y"]
    
           
    def main(self):
        
        # Obtiene el valor X,Y Hero Position y se lo aplica al Estandarte "Squadron"
        self.target.worldPosition.x, self.target.worldPosition.y = self.getPosition_Hero()
        
           
alliedBannerRuntime = Banner(logic.getCurrentController())
class Warriors:
    
    # La matriz 4x2 añade 4 objetos de frente (f) y 2 de soporte (s) secuencialmente
    def __init__ (self,controlador):
        
        self.own = controlador.owner
        self.banner = escena.objects["Squadron"]
        self.hero = escena.objects["C02"] # |Obtiene el objecto actual en escena|
        self.warriors = [[],[]]
        self.increment = 4
        self.RADAR = 5 # |Campo de detección de lejanía| Master Key
      
        
        
        
    def getList_Unit(self):
        
        self.unit = escena.objectsInactive["Unit"]
        return self.unit
    
    def getDistance_Hero(self):
        
        self.heroPosition_x = self.hero.worldPosition[0]
        self.heroPosition_y = self.hero.worldPosition[1]
        
        return int(self.heroPosition_x),int(self.heroPosition_y)
    
    
    def getCalculate_Distance(self):
        
        self.w01Position_x = self.s04.worldPosition[0]
        self.w01Position_y = self.s04.worldPosition[1]
        self.w02Position_x = self.s03.worldPosition[0]
        self.w02Position_y = self.s03.worldPosition[1]
        self.w03Position_x = self.s02.worldPosition[0]
        self.w03Position_y = self.s02.worldPosition[1]
        self.w04Position_x = self.s01.worldPosition[0]
        self.w04Position_y = self.s01.worldPosition[1]
        
        return int(self.w01Position_x),int(self.w01Position_y),int(self.w02Position_x),int(self.w02Position_y),int(self.w03Position_x),int(self.w03Position_y),int(self.w04Position_x),int(self.w04Position_y)
    
    def getRadar_System(self):
        
        x1,y1 = self.getDistance_Hero()
        w01x,w01y,w02x,w02y,w03x,w03y,w04x,w04y = self.getCalculate_Distance()
        
        #d = sqrt((x2-x1)**2 + (y2-y1)**2)
        d01 = sqrt((w01x-x1)**2 + (w01y-y1)**2)
        d02 = sqrt((w02x-x1)**2 + (w02y-y1)**2)
        d03 = sqrt((w03x-x1)**2 + (w03y-y1)**2)
        d04 = sqrt((w04x-x1)**2 + (w04y-y1)**2)
        
        
        return d01,d02,d03,d04
    
    def main(self):
        
        if self.own["cont"] < 1:
            self.s04 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.s03 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.s02 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.s01 = escena.addObject(self.getList_Unit(),self.banner,0)
            self.own["cont"] +=1
 
            
        hx,hy = self.getDistance_Hero()
        w01x,w01y,w02x,w02y,w03x,w03y,w04x,w04y = self.getCalculate_Distance()
        d01,d02,d03,d04 = self.getRadar_System()
        
        # DEBUG PROPERTYS DISTANCE RADAR|HERO|UNIT
        #self.own["hx"] = hx
        #self.own["ux"] = ux
        #self.own["hy"] = hy
        #self.own["uy"] = uy     
        #print (d)
        
            # Radar coontrolará que si tanto la posición X e Y de ambos son iguales pero superan el límite establecido, no se aplicará la orden: Detenerse
        
        try:
            
           
            grid = escena.objects["Grid"]
            
            if d01 <= self.RADAR and not int(self.s04.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s04.worldPosition[1]) == int(grid.worldPosition[1]): 
                self.s04.applyMovement([0.0, -0.04, 0.0], True)
            if d02 <= self.RADAR and not int(self.s03.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s03.worldPosition[1]) == int(grid.worldPosition[1]):    
                self.s03.applyMovement([0.0, 0.04, 0.0], True)
            if d03 <= self.RADAR and not int(self.s02.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s02.worldPosition[1]) == int(grid.worldPosition[1]):    
                self.s02.applyMovement([0.0, -0.04, 0.0], True)
            if d04 <= self.RADAR and not int(self.s01.worldPosition[0]) == int(grid.worldPosition[0]) or int(self.s01.worldPosition[1]) == int(grid.worldPosition[1]):    
                self.s01.applyMovement([0.0, 0.04, 0.0], True)
            
            
           
            
            # Radar siempre va a querer que ambos no superen su límite establecido es por eso que Radar genera una segunda clausula indicando que la distancia entre ambos no superen su perímetro de control.
      
            if d01 > self.RADAR:
                self.s04.applyMovement([0.07, 0.0, 0.0], True)
            if d02 > self.RADAR:
                self.s03.applyMovement([0.07, 0.0, 0.0], True)
            if d03 > self.RADAR:     
                self.s02.applyMovement([0.07, 0.0, 0.0], True)
            if d04 > self.RADAR:
                self.s01.applyMovement([0.07, 0.0, 0.0], True)
                    
          
        except:
               
            controlador = logic.getCurrentController()
            #quit = controlador.actuators["Game"]
            #print ("Error Inesperado: RADAR", self.RADAR) 
            #controlador.activate(quit)
     
warriorsRuntime = Warriors(logic.getCurrentController())
# --------------------------------------------------------------------
# End Class 
######################################################
# Executer Program Runtime 
######################################################
        
def main():
    
    alliedBannerRuntime.main()
    warriorsRuntime.main()
       
# --------------------------------------------------------------------
# End Executer  
######################################################
# Acciones del Objeto padre: Unit
# Unit se encarga de generar unidades militares, magos
# arqueros y jinetes en base a una Matriz de 4x2
# Si la clase Banner existe generará un tipo de estandarte
# Si el estandarte no carga durante el Runtime
# los guerreros e instacia (Atributos) no se generarán
######################################################
        
  
def inteligentCollisionSytem():
    
    controlador = logic.getCurrentController()
    escena = logic.getCurrentScene()
    own = controlador.owner
    
    trackTo = controlador.actuators["trackTo"]
    colision = controlador.sensors["Collision"]
    SCI = controlador.sensors["SCI"]
    
    if SCI.positive:
        controlador.deactivate(trackTo)
        
    else:
        controlador.activate(trackTo)  
    
    
# --------------------------------------------------------------------
# End Script: squadron
#
# Author(s): DEV-Hiroshi <hiroshidaigh@gmail.com>  
Por otro lado el módulo grid.py es el siguiente:
Código: Seleccionar todo
from bge import logic
import squadron
escena = logic.getCurrentScene()
class systemFormation:
    
    def __init__(self,controlador):
        
        self.own = controlador.owner
        self.squadron = escena.objects["Squadron"]
        self.grid = escena.objectsInactive["Grid"]
        self.banner = escena.objects["Squadron"]
        self.c = escena.objects["C02"]
        self.distance = 3 # Distancia de formación
        self.rotation = [[1.0, 0.0, 0.0], [ 0.0, 1.0, 0.0], [0.0, 0.0, 1.0]] # Orientación de baldosas
        
    def getPosition_Owner(self):
        
        s_position_x = self.squadron.worldPosition[0]
        s_position_y = self.squadron.worldPosition[1]
        return s_position_x, s_position_y
    
    def createGrid(self):
        
        if self.own["grid_count"] < 1:
            
            self.grid01 = escena.addObject(self.grid,self.banner,0)
            self.grid02 = escena.addObject(self.grid,self.banner,0)
            self.grid03 = escena.addObject(self.grid,self.banner,0)
            self.grid04 = escena.addObject(self.grid,self.banner,0)
            
            s_position_x, s_position_y = self.getPosition_Owner()
            self.grid01.worldPosition.x,self.grid01.worldPosition.y,self.grid01.worldPosition.z= s_position_x+self.distance, s_position_y+self.distance,0.1 
            self.grid01.worldOrientation = self.rotation
            self.grid02.worldPosition.x,self.grid02.worldPosition.y,self.grid02.worldPosition.z= s_position_x+self.distance-2, s_position_y+self.distance,0.1 
            self.grid02.worldOrientation = self.rotation
            self.grid03.worldPosition.x,self.grid03.worldPosition.y,self.grid03.worldPosition.z= s_position_x+self.distance-4, s_position_y+self.distance,0.1 
            self.grid03.worldOrientation = self.rotation
            self.grid04.worldPosition.x,self.grid04.worldPosition.y,self.grid04.worldPosition.z= s_position_x+self.distance-6, s_position_y+self.distance,0.1 
            self.grid04.worldOrientation = self.rotation
            
            self.own["grid_count"] += 1
            
            self.grid01.setParent(self.c, 1, 1)
            self.grid02.setParent(self.c, 1, 1)
            self.grid03.setParent(self.c, 1, 1)
            self.grid04.setParent(self.c, 1, 1)
            
           
    def functionTiles(self):
        
        tile01,tile02,tile03,tile04 = self.grid01,self.grid02,self.grid03,self.grid04 
        print (tile01)
          
        
    def main(self):
       
        
        self.createGrid()
        self.functionTiles()
             
systemFormation_Runtime = systemFormation(logic.getCurrentController())
def main ():
    
    systemFormation_Runtime.main()
    
        
        
Bueno chicos o chicas blendereñas, ustedes saben más que yo. ¿Como hago para pasar la variable self.grid01, self.grid02, self.grid03 y self.grid04 del módulo: grid.py al otro módulo de: squadron.py para usarlo dentro?