Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/physics.py
blob: 1cff1e90c1066b7752dcc418ce205d877cac6719 (plain)
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
# Physics.activity
# Go eat an apple, Newton!
# 
# Brian Jordan
# Modified from Alex Levenson's testbed
# Modified from Elements demos

import pygame
from pygame.locals import *
from pygame.color import *

import elements
from elements import Elements

def main():
    # set up pygame
    pygame.init()
    size = (1200,900) # A - Any way of getting a lower resolution? Changing size?
    #size = (1024, 768)
    screen = pygame.display.set_mode(size)
    clock = pygame.time.Clock()
        
    # set up the world
    world = elements.Elements((400,400)) # A - here?
    world.renderer.set_surface(screen)

    # set up enviornment
    world.add.ground()
    world.add.wall((100, 100), (300, 300), 5)
    body=world.add.rect((900,300),width=300,height=25)    
    world.add.joint(body)

    # loop control
    go = True
    
    a = 0
    jb1=jb2=jb1pos=jb2pos=None
    
    # Main Loop: - processes key and mouse events, world update and draw
    while go:
        for event in pygame.event.get():
            if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                # Quit the application -- bye bye!
                go = False
                
            elif event.type == KEYDOWN and event.key == K_SPACE:
                # Pause with SPACE
                world.run_physics = not world.run_physics
	   
            # Adds Mouse-->Object joints for grabbing/throwing objects
            elif event.type == MOUSEBUTTONDOWN and event.button == 1:
                # Add Mouse-->Object Joint if at an Object
                bodylist = world.get_bodies_at_pos(event.pos, include_static=False)
                if bodylist and len(bodylist) > 0:
                    world.add.mouseJoint(bodylist[0], event.pos) 
            elif event.type == MOUSEBUTTONUP and event.button == 1:
                # Delete Mouse-->Object Joint
                world.add.remove_mouseJoint()

            # Uses Box2D mouse movement 
            elif event.type == MOUSEMOTION and event.buttons[0]:
                world.mouse_move(event.pos)
            
            # Adds Object-->Object joints for connecting objects
            elif event.type == MOUSEBUTTONDOWN and event.button == 3:
                # Connect bodies
                jb1pos = event.pos
                jb1 = world.get_bodies_at_pos(event.pos)
                jb2 = None
                jb2pos = None
            elif event.type == MOUSEBUTTONUP and event.button == 3:
                jb2 = world.get_bodies_at_pos(event.pos)
                jb2pos = event.pos
                if jb1 and jb2 and str(jb1) != str(jb2):
                    world.add.joint(jb1[0],jb2[0],jb1pos,jb2pos)
                jb1 = jb2 = jb1pos = jb2pos = None
            
            # UI design --
            # We want to allow for the creation of different shapes
            # UI mockups for these (to be followed along with in this section)
            #   are available at http://wiki.laptop.org/go/Physics
            # The important ingredients here are (1) storing the X,Y mouse coordinates
            #   and (2) on-line resizing or visual drawing of the shapes (via
            #   any of Elements, pyBox2D (elements.world), pyGame, GTK?)
            # We are going to use pygame.draw for this, then upon release (and
            #   checking for bad cases, draw the objects. Portions of these functions
            #   should be added to Elements

            elif event.type == KEYDOWN:
                if event.key == K_1: # Add triangle at mouse
                    x,y = pygame.mouse.get_pos()
                    world.add.triangle((0,0),sidelength=40)
                    world.add.ball((x,y), radius=20)
                elif event.key == K_2: # Add circle at mouse
                    x,y = pygame.mouse.get_pos()
                    world.add.ball((100,0),radius=20)
                elif event.key == K_3:
                    x,y = pygame.mouse.get_pos()
                    world.add.ball((200,0),radius=20)
                elif event.key == K_4:
	        		x,y = pygame.mouse.get_pos()
	        		world.add.ball((300,0),radius=30)
                elif event.key == K_5:
	                x,y = pygame.mouse.get_pos()
	                world.add.ball((400,0),radius=40)
                elif event.key == K_6:
	                x,y = pygame.mouse.get_pos()
	                world.add.ball((500,0),radius=50)
                elif event.key == K_7:
                    x,y = pygame.mouse.get_pos()
                    world.add.ball((x,y),radius=60)
                elif event.key == K_8: # Add 20 high drop boxes
                    x,y = pygame.mouse.get_pos()
                    i = 0
                    for j in range(20):
                        world.add.rect((x-i,y-(j*500)),width=20,height=10,angle=a)
                elif event.key == K_9: # Add many triangles
                    x, y = pygame.mouse.get_pos()
                    for i in range(5):
                        for j in range(5):
                            world.add.triangle((x-i,y-j), sidelength=20)
                elif event.key == K_k:
                    world.add.rect()

        # Clear Display
        screen.fill((255,255,255))

        # Update & Draw World
        world.update()
        world.draw()

        if jb1pos:
            pygame.draw.line(screen,THECOLORS["red"],jb1pos,pygame.mouse.get_pos(),3)

        # Flip Display
        pygame.display.flip()
        
        # Try to stay at 30 FPS
        clock.tick(30) # originally 50
        x,y = pygame.mouse.get_pos()
        

        # Output framerate in caption
        pygame.display.set_caption("x: %i | y: %i | elements: %i | fps: %i" % (x, y, world.element_count, int(clock.get_fps())))
if __name__ == "__main__":
    main()