Just another bug report (maybe it's just me doing everything wrong) for the sk
module:
Here is the code I'm using:
# coding: utf-8
import sk
import random
MAXSPD = 700
MAXLIFE = 15
TEXTURE = 'shp:Circle'
MINLIFED = -350
MAXLIFED = 350
SCALE = 2
decayrate = 0.005
collider_f = 0.35
def randvec(maxspd):
return (random.randint(-maxspd, maxspd), random.randint(-maxspd, maxspd))
particle_tpl = sk.SpriteNode(sk.Texture(TEXTURE))
particle_tpl.name = 'particle'
particle_tpl.color_blend_factor = 1
particle_tpl.age = 0
particle_tpl.lighting_bit_mask = 1
particle_tpl.x_scale = SCALE
particle_tpl.y_scale = SCALE
particle_tpl.alpha = 0.5
particle_tpl.shadow_cast_bit_mask = 1
physics = sk.PhysicsBody.circle(particle_tpl.size.x/2 * collider_f)
physics.restitution = 1.2
physics.affected_by_gravity = False
physics.allows_rotation = True
physics.mass = 2
physics.pinned = False
physics.angular_velocity = 0
physics.category_bit_mask = 1
physics.contact_test_bit_mask = 1
particle_tpl.physics_body = physics
class Game (sk.Scene):
def __init__(self):
sk.Scene.__init__(self)
self.name = 'scene'
self.particles = set()
self.img = sk.Texture(TEXTURE)
self.maxspd = MAXSPD
self.handles_node_touches = False
self.maxlife = MAXLIFE * 60 # convert to frames
self.selected = None
# init walls
for y in [768, 0]:
wall = sk.Node()
wall.position = (512, y)
physics = sk.PhysicsBody.rect(1024, 100)
physics.affected_by_gravity = False
physics.allows_rotation = False
physics.restitution = 1.2
physics.pinned = True
wall.physics_body = physics
self.add_child(wall)
for x in [0, 1024]:
wall = sk.Node()
wall.position = (x, 384)
physics = sk.PhysicsBody.rect(100, 768)
physics.affected_by_gravity = False
physics.allows_rotation = False
physics.restitution = 1.2
physics.pinned = True
wall.physics_body = physics
self.add_child(wall)
# lighting
light = sk.LightNode()
light.position = (10, 758)
light.shadow_color = (1, 0, 0)
light.ambient_color = (0, 0, 1)
light.light_color = (0, 1, 0)
light.enabled = True
light.category_bit_mask = 1
light.alpha = 1
light.falloff = 0.4
light.name = 'light'
self.add_child(light)
def update(self):
for p in self['particle']:
p.age += 1
if p.age >= p.lifespan:
# if exceeded life, reduce alpha by 1
p.alpha -= decayrate
if p.alpha <= 0:
p.run_action(sk.Action.call(p.remove_from_parent))
def touch_began(self, node, touch):
self.selected = None
new = particle_tpl.__copy__()
new.position = touch.location
new.physics_body.velocity = randvec(MAXSPD)
new.color = (random.random(), random.random(), random.random())
new.lifespan = self.maxlife + random.randint(MINLIFED, MAXLIFED)
#new.z_position = random.randint(0, len(self.get_children_with_name('particle')))
self.add_child(new)
def touch_moved(self, node, touch):
self.touch_began(node, touch)
def did_begin_contact(self, collison):
# Make the color change on collison
collison.body_a.node.color = (random.random(), random.random(), random.random())
collison.body_b.node.color = (random.random(), random.random(), random.random())
def main():
game = Game()
scene_view = sk.View(game)
scene_view.shows_fps = True
scene_view.shows_node_count = True
scene_view.present()
return game
if __name__ == '__main__':
g = main()
It's similar to the old Particles example, however using physics. I'm running into two problems:
- No matter what I do, I can't make the
sk.LightNode()
do anything.
- In
did_begin_contact
, I'm getting the following error:
AttributeError: 'NoneType' has no attribute 'color'
It says in the docs that the collison.body_a.node
attribute should be the node it is attached to, but for me it seems to be just None.