# -*- indent-tabs-mode: t -*-
INTRO = """
the hit function take arguments, the first one is the body you collide and the
second is a list of Contact object containing information about the Point of contact
In this more complex scene Head will tell who they hit when collision occured
"""
import sys, os
from random import choice
import soya
from soya import Vector
soya.init("ode-collision-6-hit_func-2",width=1024,height=768)
soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))
print INTRO
class PoliteHead(soya.Body):
head_model = soya.Model.get("caterpillar_head")
sentences = [
"<%s> Oups sorry *%s*!",
"<%s> Damned I hit *%s*",
"<%s> excuse me *%s*. I hope I didn't hurt you",
"<%s> *%s*! please mind you step !",
"<%s> ho I did see you *%s* how. are you ?",
]
def __init__(self,parent,name):
soya.Body.__init__(self,parent,self.head_model)
self.name = name
def hit(self,other,*args,**kargs):
print choice(self.sentences)%(self.name,other.name)
################################################################################
scene = soya.World()
a_mass = 8
c_m = 7
d_m = 2
head_model = soya.Model.get("caterpillar_head")
head_a = PoliteHead(scene,"Pat")
head_a.mass = soya.SphericalMass(a_mass,1,"total_mass")
head_b = PoliteHead(scene,"Lili")
head_b.mass = soya.SphericalMass(3,1,"total_mass")
head_c = PoliteHead(scene,"Sam")
head_c.mass = soya.SphericalMass(c_m,1,"total_mass")
head_d = PoliteHead(scene,"Mike")
head_d.mass = soya.SphericalMass(d_m,1,"total_mass")
head_a.add_force(soya.Vector(head_a,15,34,56)*a_mass)#,soya.Vector(head_a,0.4,0.3,0.2))
head_a.add_force(soya.Vector(scene,-150,1,-505)*a_mass)
head_a.set_xyz(20,-5,0)
head_a.turn_y(30)
head_b.x = 1.0
head_b.add_force(Vector(head_b,0,0,-1368),Vector(head_b,0.0001,0.0002,0.0003))
head_c.set_xyz(-4.5,2.7,-77)
head_c.turn_y(180)
head_d.set_xyz(1,-50,-60)
head_d.turn_x(90)
head_d.add_force(soya.Vector(scene,0,350,-40)*d_m,soya.Vector(head_d,0.001,0.0015,0.002))
light = soya.Light(scene)
light.set_xyz(30, 5, -30)
camera = soya.Camera(scene)
camera.set_xyz(1,50,-40)
camera.turn_x(-90)
scene.gravity = soya.Vector(scene,0.0005,-0.03,2)
for head in (head_a,head_b,head_c,head_d,):
soya.GeomSphere(head,1.2)
print "scene built"
soya.set_root_widget(camera)
ml = soya.MainLoop(scene)
ml.main_loop()
Tutorials : basic-1 - basic-2 - basic-3 - basic-4 - basic-5 - basic-6 - basic-loadingfile-1 - basic-savingfile-cerealizer-1 - basic-savingfile-pickle-1 - blender-auto-exporter-1 - bsp-game_skel - character-animation-1 - character-animation-2 - character-animation-shadow-cellshading-1 - deform-1 - facecutter-1 - fullscreen-1 - game_skel-1 - game_skel-2 - game_skel-3 - game_skel-4 - game_skel-5 - gui-1 - gui-2 - gui-background-1 - label3D-1 - modeling-1 - modeling-2 - modeling-3 - modeling-cellshading-1 - modeling-env-mapping-1 - modeling-material-1 - modeling-material-2 - modeling-shadow-1 - modeling-smoothlit-1 - modeling-solid-model-1 - modeling-transparency-1 - mouse-1 - multiple-cameras-1 - nested-world-1 - ode-collision-1-base - ode-collision-2-base - ode-collision-3-mass_influence - ode-collision-4-pushable - ode-collision-5-hit_func - ode-collision-6-hit_func-2-other - ode-collision-7-hit_func-3-contacts - ode-collision-8-terrain - ode-collision-9-box - ode-gravity - ode-join - ode-mass - ode-test - particle-1 - portal-1 - pudding-1 - pudding-2 - pudding-buttonbar-1 - pudding-buttonbar-2 - pudding-console-1 - pudding-console-2 - pudding-game_skel-5 - pudding-image-1 - pudding-image-slicing-1 - pudding-input-1 - pudding-listbox-1 - pudding-menu-1 - pudding-meter-1 - pudding-svgelements-1 - pudding-z-index-1 - ray-1 - raypicking-1 - raypicking-2 - raypicking-3 - shader-1 - shader-2 - shader-3 - shader-4 - sound-1 - soya-with-tk-1 - speed-1 - state-1 - static-shadows-1 - terrain-1 - terrain-2 - test - traveling-camera-1 - widget-1 - widget-background-1