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
|
#!/usr/bin/python
"""
XOlympics is a 2 player game where you are a triangle!
Use w,a,s,d and up,down,left,right to play.
Score by making the newest ball hit your opponent's wall.
"""
import pippy
import pygame
import sys
import math
from pygame.locals import *
from pippy import physics
from pygame.color import *
from pippy.physics import box2d
class XOlympicsGame:
def __init__(self):
self.rightscore = self.leftscore = 0
self.forcespeed = 75
self.jumpforce = 20
self.leftDPress = False
self.rightDPress = False
self.leftLPress = False
self.leftRPress = False
self.leftJump = False
self.rightLPress = False
self.rightRPress = False
self.rightJump = False
self.updateList = []
self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
self.width, self.height = self.screen.get_size()
self.clock = pygame.time.Clock()
# set up the world (instance of Elements)
self.world = physics.Elements(self.screen.get_size())
self.world.renderer.set_surface(self.screen)
# set up static environment
self.world.set_color((0, 255, 0))
self.world.add.ground()
self.ball = self.world.add.ball((self.width / 2, 0), 50)
# add the left border and player (red)
self.world.set_color((255, 0, 0))
self.world.add.rect((0, -20), 25, self.height,
dynamic=False, density=1.0,
restitution=0.16, friction=0.5)
self.leftplayer = self.world.add.poly(( self.width * 0.25, 81.0 ), [(-109.9405166666667, -64.244016666666653), (110.60718333333335, -63.089316666666605), (-0.66666666666668561, 127.33333333333337)], dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=False)
# add the right border and player (blue)
self.world.set_color((0, 0, 255))
self.world.add.rect((self.width, -20), 25, self.height,
dynamic=False, density=1.0,
restitution=0.16, friction=0.5)
self.rightplayer = self.world.add.poly(( self.width * 0.75, 81.0 ), [(108.94051666666667, -65.976066666666611), (2.6666666666666288, 127.33333333333337), (-111.60718333333341, -61.357266666666646)] , dynamic=True, density=1.0, restitution=0.16, friction=0.5, screenCoord=False)
# we're getting 2 grounds - grey and green. why?
def run(self):
self.running = True
while self.running:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
self.running = False
if (event.type == KEYDOWN and (event.key == K_a or event.key == K_KP4)):
self.leftLPress = True
if (event.type == KEYUP and (event.key == K_a or event.key == K_KP4)):
self.leftLPress = False
if (event.type == KEYDOWN and (event.key == K_s or event.key == K_KP2)):
self.leftDPress = True
if (event.type == KEYUP and (event.key == K_s or event.key == K_KP2)):
self.leftDPress = False
if (event.type == KEYDOWN and (event.key == K_d or event.key == K_KP6)):
self.leftRPress = True
if (event.type == KEYUP and (event.key == K_d or event.key == K_KP6)):
self.leftRPress = False
if (event.type == KEYDOWN and (event.key == K_w or event.key == K_KP8)):
self.leftJump = True
if (event.type == KEYUP and (event.key == K_w or event.key == K_KP8)):
self.leftJump = False
if (event.type == KEYDOWN and (event.key == K_LEFT or event.key == K_KP7)):
self.rightLPress = True
if (event.type == KEYUP and (event.key == K_LEFT or event.key == K_KP7)):
self.rightLPress = False
if (event.type == KEYDOWN and (event.key == K_RIGHT or event.key == K_KP1)):
self.rightRPress = True
if (event.type == KEYUP and (event.key == K_RIGHT or event.key == K_KP1)):
self.rightRPress = False
if (event.type == KEYDOWN and (event.key == K_UP or event.key == K_KP9)):
self.rightJump = True
if (event.type == KEYUP and (event.key == K_UP or event.key == K_KP9)):
self.rightJump = False
if (event.type == KEYDOWN and (event.key == K_DOWN or event.key == K_KP3)):
self.rightDPress = True
if (event.type == KEYUP and (event.key == K_DOWN or event.key == K_KP3)):
self.rightDPress = False
if self.leftLPress:
self.leftplayer.ApplyForce(box2d.b2Vec2(-self.forcespeed, 0), self.leftplayer.GetWorldCenter())
if self.leftRPress:
self.leftplayer.ApplyForce(box2d.b2Vec2(self.forcespeed, 0), self.leftplayer.GetWorldCenter())
if self.leftJump:
if self.leftplayer.GetWorldCenter().y < 0.75:
self.leftplayer.ApplyImpulse(box2d.b2Vec2(0, self.jumpforce), self.leftplayer.GetWorldCenter())
if self.rightLPress:
self.rightplayer.ApplyForce(box2d.b2Vec2(-self.forcespeed, 0), self.rightplayer.GetWorldCenter())
if self.rightRPress:
self.rightplayer.ApplyForce(box2d.b2Vec2(self.forcespeed, 0), self.rightplayer.GetWorldCenter())
if self.rightDPress:
self.rightplayer.ApplyImpulse(box2d.b2Vec2(0 ,-self.jumpforce), self.rightplayer.GetWorldCenter())
if self.rightJump:
if self.rightplayer.GetWorldCenter().y < 0.75:
self.rightplayer.ApplyImpulse(box2d.b2Vec2(0, self.jumpforce), self.rightplayer.GetWorldCenter())
if self.leftDPress:
self.leftplayer.ApplyImpulse(box2d.b2Vec2(0, -self.jumpforce), self.leftplayer.GetWorldCenter())
# Clear Display
if self.ball.GetWorldCenter().x < 1:
self.leftscore += 1
print "Goal Blue!", self.leftscore
self.world.set_color((0, 0, 255))
self.ball = self.world.add.ball((self.width / 2, 0), 50)
elif self.ball.GetWorldCenter().x > 11:
# FIXME: the 11 above works only when display width is
# 1200 pixels
self.rightscore += 1
print "Goal Red!", self.rightscore
self.world.set_color((255, 0, 0))
self.ball = self.world.add.ball((self.width / 2, 0), 50)
self.screen.fill((255, 255, 255))
# Update & Draw World
self.world.update()
self.world.draw()
# Flip Display
pygame.display.flip()
# Try to stay at 30 FPS
self.clock.tick(30) # originally 50
def main():
pygame.init()
pygame.display.init()
# create an instance of the game
game = XOlympicsGame()
# start the main loop
game.run()
# make sure that main is called
if __name__ == '__main__':
main()
|