From 5b05d263ac35bd26e25d434c86948003883c5d03 Mon Sep 17 00:00:00 2001 From: Brian Jordan Date: Sun, 21 Jun 2009 18:37:44 +0000 Subject: Add XOlympics physics example --- diff --git a/NEWS b/NEWS index 6eca394..8b3c153 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,9 @@ -32 +33 +* Include XOlympics physics game example -32 (Soas-only release) +32 * Trac #607 (SugarLabs), Font size needs to be 10 for Soas - (font size of 8 recommended for XO-1 users) + (font size of 8 for XO-1 users) 31 diff --git a/data/graphics/xolympics b/data/graphics/xolympics new file mode 100644 index 0000000..5fe273c --- /dev/null +++ b/data/graphics/xolympics @@ -0,0 +1,150 @@ +#!/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, pygame, sys, math +from pygame.locals import * +from pippy import physics +from pygame.color import * + +from pippy.physics import box2d + +class XOlympicsGame: + def __init__(self,screen): + 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((1200,900)) + + self.clock = pygame.time.Clock() + self.font = pygame.font.Font(None, 24) # font object + + # 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((600, 0), 50) + # add the left border and player (red) + self.world.set_color((255, 0, 0)) + self.world.add.rect((0,-20), 25, 900, dynamic=False, density=1.0, restitution=0.16, friction=0.5) + self.leftplayer = self.world.add.poly(( 264.0, 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((1180,-20), 25, 900, dynamic=False, density=1.0, restitution=0.16, friction=0.5) + self.rightplayer = self.world.add.poly(( 885.0, 78.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. wtf. + self.leftplayer.linearDamping = 0.07 + self.test = self.leftplayer.GetWorldCenter() + 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((600, 0), 50) + elif self.ball.GetWorldCenter().x > 11: + self.rightscore += 1 + print "Goal Red!", self.rightscore + self.world.set_color((255, 0, 0)) + self.ball = self.world.add.ball((600, 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(): + toolbarheight = 0 + tabheight = 0 + pygame.init() + pygame.display.init() + x,y = pygame.display.list_modes()[0] + screen = pygame.display.set_mode((x,y-toolbarheight))#-tabheight)) + # create an instance of the game + game = XOlympicsGame(screen) + # start the main loop + game.run() + +# make sure that main get's called +if __name__ == '__main__': + main() + -- cgit v0.9.1