home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 56 / CDPowerplay56Disc2.iso / demos / blade / data1.cab / Program_Executable_Files / Lib / Objects.py < prev    next >
Encoding:
Python Source  |  2000-10-27  |  13.2 KB  |  385 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6. import Bladex
  7. import InitDataField
  8. import B3DLib
  9. import GameStateAux
  10. import pdb
  11. import ObjStore
  12.  
  13. REL=0
  14. ABS=1
  15.  
  16.  
  17.  
  18.  
  19. def DisplaceAndRotateObjectFunc(obj_name, time):
  20.  
  21.     obj=Bladex.GetEntity(obj_name)
  22.  
  23.     dinobj=obj.Data.dinobjdata
  24.  
  25.     if (dinobj.OnMovement==0 and dinobj.OnRotation==0):
  26.         obj.RemoveFromList(dinobj.Timer)
  27.         obj.TimerFunc=""
  28.         return
  29.  
  30.     if (dinobj.OnMovement==1):
  31.         if (time<dinobj.end_time):
  32.             itime=time-dinobj.last_time
  33.             dinobj.displ=dinobj.init_vel*itime+(dinobj.acc*(itime**2))/2.0
  34.             x=dinobj.displ_vector[0]*dinobj.displ
  35.             y=dinobj.displ_vector[1]*dinobj.displ
  36.             z=dinobj.displ_vector[2]*dinobj.displ
  37.             obj.Move(x,y,z)
  38.             iend_vel=dinobj.init_vel+dinobj.acc*itime
  39.             dinobj.init_vel=iend_vel
  40.             dinobj.last_time=time
  41.             if (dinobj.while_displ_sound):
  42.                 dinobj.while_displ_sound.Position=dinobj.obj.Position
  43.             if (dinobj.WhileDisplFunc):
  44.                 apply(dinobj.WhileDisplFunc, dinobj.WhileDisplArgs)
  45.         else:
  46.             itime=dinobj.end_time-dinobj.last_time
  47.             dinobj.displ=dinobj.init_vel*itime+(dinobj.acc*(itime**2))/2.0
  48.             x=dinobj.displ_vector[0]*dinobj.displ
  49.             y=dinobj.displ_vector[1]*dinobj.displ
  50.             z=dinobj.displ_vector[2]*dinobj.displ
  51.             obj.Move(x,y,z)
  52.             dinobj.OnMovement=0
  53.             if (dinobj.while_displ_sound and (dinobj.while_displ_sound!=dinobj.next_while_displ_sound or dinobj.last_displ)):
  54.                 dinobj.while_displ_sound.StopSound()
  55.             if (dinobj.end_displ_sound):
  56.                 dinobj.end_displ_sound.Position=dinobj.obj.Position
  57.                 dinobj.end_displ_sound.PlaySound(0)
  58.             if (dinobj.OnRotation==0):
  59.                 obj.RemoveFromList(dinobj.Timer)
  60.                 obj.TimerFunc=""
  61.             if (dinobj.EndDisplFunc):
  62.                 apply(dinobj.EndDisplFunc, dinobj.EndDisplArgs)
  63.  
  64.     if (dinobj.OnRotation==1):
  65.         if (time<dinobj.end_time_w):
  66.             itime=time-dinobj.last_time_w
  67.             dinobj.angle=dinobj.init_w*itime+(dinobj.acc_w*(itime**2))/2.0
  68.             ce=dinobj.center
  69.             ax=dinobj.axis
  70.             if (dinobj.rotation_type==REL):
  71.                 obj.RotateRel(ce[0], ce[1], ce[2], ax[0], ax[1], ax[2], dinobj.angle)
  72.             else:
  73.                 obj.RotateAbs(ce[0], ce[1], ce[2], ax[0], ax[1], ax[2], dinobj.angle)
  74.             iend_w=dinobj.init_w+dinobj.acc_w*itime
  75.             dinobj.init_w=iend_w
  76.             dinobj.last_time_w=time
  77.             if (dinobj.while_rot_sound):
  78.                 dinobj.while_rot_sound.Position=dinobj.obj.Position
  79.             if (dinobj.WhileRotFunc):
  80.                 apply(dinobj.WhileRotFunc, dinobj.WhileRotArgs)
  81.         else:
  82.             itime=dinobj.end_time_w-dinobj.last_time_w
  83.             dinobj.angle=dinobj.init_w*itime+(dinobj.acc_w*(itime**2))/2.0
  84.             ce=dinobj.center
  85.             ax=dinobj.axis
  86.             if (dinobj.rotation_type==REL):
  87.                 obj.RotateRel(ce[0], ce[1], ce[2], ax[0], ax[1], ax[2], dinobj.angle)
  88.             else:
  89.                 obj.RotateAbs(ce[0], ce[1], ce[2], ax[0], ax[1], ax[2], dinobj.angle)
  90.             dinobj.OnRotation=0
  91.             if (dinobj.while_rot_sound and (dinobj.while_rot_sound!=dinobj.next_while_rot_sound or dinobj.last_rot)):
  92.                 dinobj.while_rot_sound.StopSound()
  93.             if (dinobj.end_rot_sound):
  94.                 dinobj.end_rot_sound.Position=dinobj.obj.Position
  95.                 dinobj.end_rot_sound.PlaySound(0)
  96.             if (dinobj.OnMovement==0):
  97.                 obj.RemoveFromList(dinobj.Timer)
  98.                 obj.TimerFunc=""
  99.             if (dinobj.EndRotFunc):
  100.                 apply(dinobj.EndRotFunc, dinobj.EndRotArgs)
  101.  
  102.  
  103.  
  104.  
  105.  
  106. ##class DinObj(GameStateAux.PersistentObject):
  107. class DinObj:
  108.  
  109.     ObjId=""
  110.     OnMovement=0
  111.     OnRotation=0
  112.     prev_while_displ_sound=""
  113.     next_while_displ_sound=""
  114.     last_displ=1
  115.     prev_while_rot_sound=""
  116.     next_while_rot_sound=""
  117.     last_rot=1
  118.     Timer="Timer60"
  119.     Activado=0
  120.     obj=None
  121.     EndDisplFunc=None
  122.     EndRotFunc=None
  123.  
  124.  
  125.     def __init__(self):
  126. ##        GameStateAux.PersistentObject.__init__(self)
  127.         self.ObjId=ObjStore.GetNewId()
  128.         ObjStore.ObjectsStore[self.ObjId]=self
  129.  
  130.     def __del__(self):
  131.         del ObjStore.ObjectsStore[self.ObjId]
  132.  
  133.     def DisplaceDinObj(self):
  134.  
  135.         self.OnMovement=1
  136.         if (self.OnRotation==0):
  137.             self.obj.TimerFunc=DisplaceAndRotateObjectFunc
  138.             self.obj.SubscribeToList(self.Timer)
  139.  
  140.  
  141.     def RotateDinObj(self):
  142.  
  143.         self.OnRotation=1
  144.         if (self.OnMovement==0):
  145.             self.obj.TimerFunc=DisplaceAndRotateObjectFunc
  146.             self.obj.SubscribeToList(self.Timer)
  147.  
  148.     def Stop(self):
  149.  
  150.         self.OnMovement=0
  151.         self.OnRotation=0
  152.  
  153.     def StopOnStep(self):
  154.  
  155.         self.EndDisplFunc=None
  156.         self.EndRotFunc=None
  157.  
  158.     def StopDisplacement(self):
  159.  
  160.         self.OnMovement=0
  161.  
  162.     def StopDisplacementOnStep(self):
  163.  
  164.         self.EndDisplFunc=None
  165.  
  166.     def StopRotation(self):
  167.  
  168.         self.OnRotation=0
  169.  
  170.     def StopRotationOnStep(self):
  171.  
  172.         self.EndRotFunc=None
  173.  
  174.     def persistent_id(self):
  175.         return self.ObjId
  176.  
  177.  
  178.     def __getstate__(self):
  179.         # Tiene que devolver como poder guardar el estado de la clase
  180.  
  181.         return (1,
  182.                 self.ObjId,
  183.                 self.Activado,
  184.                 self.OnMovement,
  185.                 self.OnRotation,
  186.                 self.prev_while_displ_sound,
  187.                 self.next_while_displ_sound,
  188.                 self.last_displ,
  189.                 self.prev_while_rot_sound,
  190.                 self.last_rot,
  191.                 self.Timer,
  192.                 GameStateAux.SaveEntityAux(self.obj),
  193.                 GameStateAux.SaveNewMembers(self),
  194.                 GameStateAux.SaveFunctionAux(self.EndRotFunc),
  195.                 GameStateAux.SaveFunctionAux(self.EndDisplFunc)
  196.                 )
  197.  
  198.     def __setstate__(self,parm):
  199.         # Toma como parßmetro lo que devuelve __getstate__() y debe recrear la clase
  200.  
  201.         if parm[0]==1:
  202.             #self.ObjId=parm[1] En GameStateAux.PersistentObject()
  203.             self.ObjId=parm[1]
  204.             ObjStore.ObjectsStore[self.ObjId]=self
  205.             self.Activado=parm[2]
  206.             self.OnMovement=parm[3]
  207.             self.OnRotation=parm[4]
  208.             self.prev_while_displ_sound=parm[5]
  209.             self.next_while_displ_sound=parm[6]
  210.             self.last_displ=parm[7]
  211.             self.prev_while_rot_sound=parm[8]
  212.             self.last_rot=parm[9]
  213.             self.Timer=parm[10]
  214.             self.obj=GameStateAux.LoadEntityAux(parm[11])
  215.             GameStateAux.LoadNewMembers(self,parm[12])
  216.             self.EndRotFunc = GameStateAux.LoadFunctionAux(parm[13])
  217.             self.EndDisplFunc = GameStateAux.LoadFunctionAux(parm[14])
  218.             
  219.             if self.obj:
  220.                 self.obj.Data=self
  221.         else:
  222.             print "DinObj.__setstate__() -> Version mismatch"
  223.             self.ObjId=ObjStore.GetNewId()
  224.             ObjStore.ObjectsStore[self.ObjId]=self
  225.  
  226.  
  227.  
  228.  
  229. def DisplaceObject(dinobj, displ, displ_vector, init_vel, end_vel, init_displ_sound="", while_displ_sound="", end_displ_sound="", WhileDisplFunc="", WhileDisplArgs=(), EndDisplFunc="", EndDisplArgs=()):
  230.  
  231.     dinobj.displ=displ
  232.     dinobj.displ_vector=B3DLib.Normalize(displ_vector)
  233.     dinobj.init_vel=float(init_vel)
  234.     dinobj.init_displ_sound=init_displ_sound
  235.     dinobj.while_displ_sound=while_displ_sound
  236.     dinobj.end_displ_sound=end_displ_sound
  237.     dinobj.WhileDisplFunc=WhileDisplFunc
  238.     dinobj.WhileDisplArgs=WhileDisplArgs
  239.     dinobj.EndDisplFunc=EndDisplFunc
  240.     dinobj.EndDisplArgs=EndDisplArgs
  241.     dinobj.acc=(end_vel**2-init_vel**2)/(2.0*displ)
  242.     if (dinobj.acc==0.0):
  243.         displ_time=displ/float(init_vel)
  244.     else:
  245.         displ_time=(end_vel-init_vel)/dinobj.acc
  246.     if (dinobj.init_displ_sound):
  247.         dinobj.init_displ_sound.Position=dinobj.obj.Position
  248.         dinobj.init_displ_sound.PlaySound(0)
  249.     if (dinobj.while_displ_sound and dinobj.while_displ_sound!=dinobj.prev_while_displ_sound):
  250.         dinobj.while_displ_sound.Position=dinobj.obj.Position
  251.         dinobj.while_displ_sound.PlaySound(-1)
  252.     start_time=Bladex.GetTime()
  253.     dinobj.last_time=Bladex.GetTime()
  254.     dinobj.end_time=start_time+displ_time
  255.     dinobj.DisplaceDinObj()
  256.  
  257.  
  258. def DisplaceObjectFromTo(dinobj, init_point, end_point, init_vel, end_vel, init_displ_sound="", while_displ_sound="", end_displ_sound="", WhileDisplFunc="", WhileDisplArgs=(), EndDisplFunc="", EndDisplArgs=()):
  259. ##    pdb.set_trace()
  260.     displ_vector=end_point[0]-init_point[0], end_point[1]-init_point[1], end_point[2]-init_point[2]
  261.     displ=(displ_vector[0]**2+displ_vector[1]**2+displ_vector[2]**2)**0.5
  262.     dinobj.obj.Position=init_point
  263.     DisplaceObject(dinobj, displ, displ_vector, init_vel, end_vel, init_displ_sound, while_displ_sound, end_displ_sound, WhileDisplFunc, WhileDisplArgs, EndDisplFunc, EndDisplArgs)
  264.  
  265.  
  266. def RotateObject(dinobj, angle, init_w, end_w, center, axis, rotation_type=REL, init_rot_sound="", while_rot_sound="", end_rot_sound="", WhileRotFunc="", WhileRotArgs=(), EndRotFunc="", EndRotArgs=()):
  267.  
  268.     dinobj.angle=angle
  269.     if (angle<0):
  270.         init_w=-init_w
  271.         end_w=-end_w
  272.     dinobj.init_w=float(init_w)
  273.     dinobj.center=center
  274.     dinobj.axis=axis
  275.     dinobj.rotation_type=rotation_type
  276.     dinobj.init_rot_sound=init_rot_sound
  277.     dinobj.while_rot_sound=while_rot_sound
  278.     dinobj.end_rot_sound=end_rot_sound
  279.     dinobj.WhileRotFunc=WhileRotFunc
  280.     dinobj.WhileRotArgs=WhileRotArgs
  281.     dinobj.EndRotFunc=EndRotFunc
  282.     dinobj.EndRotArgs=EndRotArgs
  283.     dinobj.acc_w=(end_w**2-init_w**2)/(2.0*angle)
  284.     if (dinobj.acc_w==0.0):
  285.         rotat_time=angle/float(init_w)
  286.     else:
  287.         rotat_time=(end_w-init_w)/dinobj.acc_w
  288.     if (dinobj.init_rot_sound):
  289.         dinobj.init_rot_sound.Position=dinobj.obj.Position
  290.         dinobj.init_rot_sound.PlaySound(0)
  291.     if (dinobj.while_rot_sound and dinobj.while_rot_sound!=dinobj.prev_while_rot_sound):
  292.         dinobj.while_rot_sound.Position=dinobj.obj.Position
  293.         dinobj.while_rot_sound.PlaySound(-1)
  294.     start_time=Bladex.GetTime()
  295.     dinobj.last_time_w=Bladex.GetTime()
  296.     dinobj.end_time_w=start_time+rotat_time
  297.     dinobj.RotateDinObj()
  298.  
  299.  
  300. def NDisplacement(dinobj, displ, displ_vector, init_vel, end_vel, init_displ_sound, while_displ_sound, end_displ_sound):
  301.  
  302.     dinobj.currentdispl=dinobj.currentdispl+1
  303.     n=dinobj.currentdispl
  304.     dinobj.prev_while_displ_sound=while_displ_sound[n-1]
  305.     if (n<dinobj.ndispl-1):
  306.         dinobj.next_while_displ_sound=while_displ_sound[n+1]
  307.         DisplaceObject(dinobj, displ[n], displ_vector[n], init_vel[n], end_vel[n], init_displ_sound[n], while_displ_sound[n], end_displ_sound[n], dinobj.WhileDisplFunc, dinobj.WhileDisplArgs, NDisplacement, (dinobj, displ, displ_vector, init_vel, end_vel, init_displ_sound, while_displ_sound, end_displ_sound))
  308.     else:
  309.         dinobj.next_while_displ_sound=""
  310.         dinobj.last_displ=1
  311.         DisplaceObject(dinobj, displ[n], displ_vector[n], init_vel[n], end_vel[n], init_displ_sound[n], while_displ_sound[n], end_displ_sound[n], dinobj.WhileDisplFunc, dinobj.WhileDisplArgs, dinobj.EndNDisplFunc, dinobj.EndNDisplArgs)
  312.  
  313.  
  314. def NDisplaceObject(dinobj, displ, displ_vector, init_vel, end_vel, init_displ_soundlist=(), while_displ_soundlist=(), end_displ_soundlist=(), WhileDisplFunc="", WhileDisplArgs=(), EndDisplFunc="", EndDisplArgs=()):
  315.  
  316.     init_displ_sound=[]
  317.     while_displ_sound=[]
  318.     end_displ_sound=[]
  319.     for n in range(len(displ)):
  320.         init_displ_sound.append("")
  321.         while_displ_sound.append("")
  322.         end_displ_sound.append("")
  323.     for n in range(len(init_displ_soundlist)):
  324.         init_displ_sound[n]=init_displ_soundlist[n]
  325.     for n in range(len(while_displ_soundlist)):
  326.         while_displ_sound[n]=while_displ_soundlist[n]
  327.     for n in range(len(end_displ_soundlist)):
  328.         end_displ_sound[n]=end_displ_soundlist[n]
  329.     dinobj.EndNDisplFunc=EndDisplFunc
  330.     dinobj.EndNDisplArgs=EndDisplArgs
  331.     dinobj.ndispl=len(displ)
  332.     dinobj.currentdispl=0
  333.     dinobj.prev_while_displ_sound=""
  334.     dinobj.next_while_displ_sound=while_displ_sound[1]
  335.     dinobj.last_displ=0
  336.     DisplaceObject(dinobj, displ[0], displ_vector[0], init_vel[0], end_vel[0], init_displ_sound[0], while_displ_sound[0], end_displ_sound[0], WhileDisplFunc, WhileDisplArgs, NDisplacement, (dinobj, displ, displ_vector, init_vel, end_vel, init_displ_sound, while_displ_sound, end_displ_sound))
  337.  
  338.  
  339. def NRotation(dinobj, angle, init_w, end_w, center, axis, init_rot_sound, while_rot_sound, end_rot_sound):
  340.  
  341.     dinobj.currentangle=dinobj.currentangle+1
  342.     n=dinobj.currentangle
  343.     dinobj.prev_while_rot_sound=while_rot_sound[n-1]
  344.     if (n<dinobj.nangle-1):
  345.         dinobj.next_while_rot_sound=while_rot_sound[n+1]
  346.         RotateObject(dinobj, angle[n], init_w[n], end_w[n], center[n], axis[n], dinobj.rotation_type, init_rot_sound[n], while_rot_sound[n], end_rot_sound[n], dinobj.WhileRotFunc, dinobj.WhileRotArgs, NRotation, (dinobj, angle, init_w, end_w, center, axis, init_rot_sound, while_rot_sound, end_rot_sound))
  347.     else:
  348.         dinobj.next_while_rot_sound=""
  349.         dinobj.last_rot=1
  350.         RotateObject(dinobj, angle[n], init_w[n], end_w[n], center[n], axis[n], dinobj.rotation_type, init_rot_sound[n], while_rot_sound[n], end_rot_sound[n], dinobj.WhileRotFunc, dinobj.WhileRotArgs, dinobj.EndNRotFunc, dinobj.EndNRotArgs)
  351.  
  352.  
  353. def NRotateObject(dinobj, angle, init_w, end_w, center, axis, rotation_type=REL, init_rot_soundlist=(), while_rot_soundlist=(), end_rot_soundlist=(), WhileRotFunc="", WhileRotArgs=(), EndRotFunc="", EndRotArgs=()):
  354.  
  355.     init_rot_sound=[]
  356.     while_rot_sound=[]
  357.     end_rot_sound=[]
  358.     for n in range(len(angle)):
  359.         init_rot_sound.append("")
  360.         while_rot_sound.append("")
  361.         end_rot_sound.append("")
  362.     for n in range(len(init_rot_soundlist)):
  363.         init_rot_sound[n]=init_rot_soundlist[n]
  364.     for n in range(len(while_rot_soundlist)):
  365.         while_rot_sound[n]=while_rot_soundlist[n]
  366.     for n in range(len(end_rot_soundlist)):
  367.         end_rot_sound[n]=end_rot_soundlist[n]
  368.     dinobj.EndNRotFunc=EndRotFunc
  369.     dinobj.EndNRotArgs=EndRotArgs
  370.     dinobj.nangle=len(angle)
  371.     dinobj.currentangle=0
  372.     dinobj.prev_while_rot_sound=""
  373.     dinobj.next_while_rot_sound=while_rot_sound[1]
  374.     dinobj.last_rot=0
  375.     RotateObject(dinobj, angle[0], init_w[0], end_w[0], center[0], axis[0], rotation_type, init_rot_sound[0], while_rot_sound[0], end_rot_sound[0], WhileRotFunc, WhileRotArgs, NRotation, (dinobj, angle, init_w, end_w, center, axis, init_rot_sound, while_rot_sound, end_rot_sound))
  376.  
  377.  
  378. def CreateDinamicObject(obj_name):
  379.  
  380.     dinobj=DinObj()
  381.     dinobj.obj=Bladex.GetEntity(obj_name)
  382.     InitDataField.Initialise(dinobj.obj)
  383.     dinobj.obj.Data.dinobjdata=dinobj
  384.     return dinobj
  385.