File: demo9_contactsound.py

package info (click to toggle)
python-elements 0.13%2Bsvn20090823.230%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze, wheezy
  • size: 1,208 kB
  • ctags: 445
  • sloc: python: 2,816; makefile: 27; sh: 6
file content (169 lines) | stat: -rw-r--r-- 5,833 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
"""
This file is an example for using 'Elements'
Elements is a 2D Physics API for Python using Box2D

Home:  http://elements.linuxuser.at
 IRC:  #elements on irc.freenode.net

Code:  svn co http://svn2.assembla.com/svn/elements          
       http://www.assembla.com/wiki/show/elements                  

License: Examples: Public Domain -- No legal restrictions
         Elements API: GPLv3
"""
import pygame
from pygame.locals import *
from pygame.color import *

from os import path
from sys import argv
from math import sqrt

import sys
sys.path.insert(0, "..") # if Elements has yet to be installed
import elements
from elements.locals import *

def load_sound(fullname):        
    if not pygame.mixer:#
        pygame.mixer.get_init()

    try:
        sound = pygame.mixer.Sound(fullname)
    except pygame.error, message:
        print 'Cannot load sound:', fullname
        raise SystemExit, message

    return sound

class Demo9:
    cur_sound = 0
    def __init__(self):
        # PyGame Init
        pygame.init()
        
        self.load_sounds()        
        self.clock = pygame.time.Clock()

        size = (1200, 900)
        self.screen = pygame.display.set_mode(size)

        self.world = elements.Elements(size)
        self.world.renderer.set_surface(self.screen)

    def load_sounds(self):
        self.snd = []
        for i in range(30): 
            #load to sound located at the same directory as this script
            s = load_sound(path.join(path.dirname(argv[0]),"beep.wav"))
            self.snd.append(s)

    def play_sound(self, vol=None):
        #the volume passed to this function cannot be negative
        #pygame takes care of the rest
        if vol != None:
            self.snd[self.cur_sound].set_volume(vol)
            print "volume: ", vol
        self.snd[self.cur_sound].play()

        self.cur_sound += 1
        if self.cur_sound == len(self.snd):
            self.cur_sound = 0
                        
    def contact_add(self, c):
        #the volume is calculated to be a fourth of the cubed root of the normal force on the body
        #thus, this can never be negative
        #volume = sqrt(c.normalForce) / 14
        volume = sqrt(c.velocity.Length()) / 14 # kne's hack since normalForce doesn't exist in 2.0.1
        self.play_sound(volume)
                    
    def run(self):
        b1 = self.world.add.ball((100, 100), 100)
    
        # Add Contact Callbacks    
        self.world.callbacks.add(CALLBACK_CONTACT_ADD, self.contact_add)
        
        # Add A Ground
        self.world.add.ground()
    
        # Default Settings
        running = True
        draw_poly = False
        points = []
        
        # Main Loop
        while running:
            for event in pygame.event.get():
                if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                    # Bye Bye
                    running = False
                    
                elif event.type == KEYDOWN and event.key == K_SPACE:    
                    # Pause with SPACE
                    self.world.run_physics = not self.world.run_physics
                  
                elif event.type == MOUSEBUTTONDOWN and event.button == 3:
                    # Add Square
                    self.world.add.triangle(event.pos, sidelength=50)
    
                elif event.type == MOUSEBUTTONDOWN and event.button == 1:
                    # Start/Stop Wall-Drawing 
                    #self.world.add_ball(event.pos)
                    if not draw_poly:
                        draw_poly = True
                        points = []
                        points.append(event.pos)
                        startpoly = True
                
                elif event.type == MOUSEBUTTONUP and event.button == 1:
                    if draw_poly:
                        # Create Polygon
                        draw_poly = False
                        points.append(event.pos)
                        if len(points) > 2: 
                            #print points
                            #print len(points)
                            body = self.world.add.complexPoly(points)
                            #self.world.add_callback(CALLBACK_CONTACT_ADD, contact_add_poly, body)
                        else:
                            self.world.add.rect(event.pos, width=80, height=30)
    
                elif event.type == MOUSEMOTION and draw_poly:
                    points.append(event.pos)

                    # Automatically release polygon if we get close the starting point
                    x1, y1 = points[0]
                    x2, y2 = event.pos
                    vx, vy = (x2-x1, y2-y1)
                    l = sqrt((vx*vx) + (vy*vy))
                    
                    if l < 20.0 and not startpoly:
                        d = { 'pos' : event.pos, 'button' : 1 }
                        pygame.event.post(pygame.event.Event(MOUSEBUTTONUP, d))
                        
                    elif l > 20.0 and startpoly:
                        startpoly = False
                
            # Clear Display
            self.screen.fill((255,255,255))
    
            # Update & Draw World
            self.world.update()
            self.world.draw()
    
            # Show line if drawing a wall
            if draw_poly and len(points) > 1:
                pygame.draw.lines(self.screen, (0,0,0), False, points)
    
            # Flip Display
            pygame.display.flip()
            
            # Try to stay at 50 FPS
            self.clock.tick(50)
            
            # output framerate in caption
            pygame.display.set_caption("elements: %i | fps: %i" % (self.world.element_count, int(self.clock.get_fps())))

if __name__ == "__main__":
    Game = Demo9()
    Game.run()