pygame系列_箭刺Elephant游戏
这个游戏原名为:Chimp,我们可以到:
http://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html
获取到源码和详细的源码讲解
下面是我对游戏的改编:
运行效果:
当箭刺到大象的时候,大象的身体就会翻转,并且发出声音,当然没有刺到的时候,也会发出另外的声音。
在游戏中,有很多地方值得我们参考,如加载图片,声音和异常处理等
=========================================
代码部分:
=========================================
1 #python elephant 2 3 #Import Modules 4 import os, pygame 5 from pygame.locals import * 6 7 __author__ = {'name' : 'Hongten', 8 'mail' : 'hongtenzone@foxmail.com', 9 'blog' : 'http://www.cnblogs.com/hongten', 10 'QQ' : '648719819', 11 'Version' : '1.0'} 12 13 if not pygame.font: print('Warning, fonts disabled') 14 if not pygame.mixer: print('Warning, sound disabled') 15 16 17 #functions to create our resources 18 def load_image(name, colorkey=None): 19 fullname = os.path.join('data', name) 20 try: 21 image = pygame.image.load(fullname) 22 except pygame.error as message: 23 print('Cannot load image:', fullname) 24 raise (SystemExit, message) 25 image = image.convert() 26 if colorkey is not None: 27 if colorkey is -1: 28 colorkey = image.get_at((0,0)) 29 image.set_colorkey(colorkey, RLEACCEL) 30 return image, image.get_rect() 31 32 def load_sound(name): 33 class NoneSound: 34 def play(self): pass 35 if not pygame.mixer or not pygame.mixer.get_init(): 36 return NoneSound() 37 fullname = os.path.join('data', name) 38 try: 39 sound = pygame.mixer.Sound(fullname) 40 except pygame.error as message: 41 print('Cannot load sound:', fullname) 42 raise (SystemExit, message) 43 return sound 44 45 46 #classes for our game objects 47 class Spear(pygame.sprite.Sprite): 48 """moves a clenched spear on the screen, following the mouse""" 49 def __init__(self): 50 pygame.sprite.Sprite.__init__(self) #call Sprite initializer 51 self.image, self.rect = load_image('spear-w.png', -1) 52 self.punching = 0 53 54 def update(self): 55 "move the spear based on the mouse position" 56 pos = pygame.mouse.get_pos() 57 self.rect.midtop = pos 58 if self.punching: 59 self.rect.move_ip(5, 10) 60 61 def punch(self, target): 62 "returns true if the spear collides with the target" 63 if not self.punching: 64 self.punching = 1 65 hitbox = self.rect.inflate(-5, -5) 66 return hitbox.colliderect(target.rect) 67 68 def unpunch(self): 69 "called to pull the spear back" 70 self.punching = 0 71 72 73 class Elephant(pygame.sprite.Sprite): 74 """moves a elephant critter across the screen. it can spin the 75 monkey when it is punched.""" 76 def __init__(self): 77 pygame.sprite.Sprite.__init__(self) #call Sprite intializer 78 self.image, self.rect = load_image('elephant-nw.png', -1) 79 screen = pygame.display.get_surface() 80 self.area = screen.get_rect() 81 self.rect.topleft = 10, 10 82 self.move = 9 83 self.dizzy = 0 84 85 def update(self): 86 "walk or spin, depending on the monkeys state" 87 if self.dizzy: 88 self._spin() 89 else: 90 self._walk() 91 92 def _walk(self): 93 "move the monkey across the screen, and turn at the ends" 94 newpos = self.rect.move((self.move, 0)) 95 if self.rect.left < self.area.left or \ 96 self.rect.right > self.area.right: 97 self.move = -self.move 98 newpos = self.rect.move((self.move, 0)) 99 self.image = pygame.transform.flip(self.image, 1, 0) 100 self.rect = newpos 101 102 def _spin(self): 103 "spin the monkey image" 104 center = self.rect.center 105 self.dizzy = self.dizzy + 12 106 if self.dizzy >= 360: 107 self.dizzy = 0 108 self.image = self.original 109 else: 110 rotate = pygame.transform.rotate 111 self.image = rotate(self.original, self.dizzy) 112 self.rect = self.image.get_rect(center=center) 113 114 def punched(self): 115 "this will cause the monkey to start spinning" 116 if not self.dizzy: 117 self.dizzy = 1 118 self.original = self.image 119 120 121 def main(): 122 """this function is called when the program starts. 123 it initializes everything it needs, then runs in 124 a loop until the function returns.""" 125 #Initialize Everything 126 pygame.init() 127 screen = pygame.display.set_mode((468, 60)) 128 pygame.display.set_caption('Monkey Fever') 129 pygame.mouse.set_visible(0) 130 131 #Create The Backgound 132 background = pygame.Surface(screen.get_size()) 133 background = background.convert() 134 background.fill((250, 250, 250)) 135 136 #Put Text On The Background, Centered 137 if pygame.font: 138 font = pygame.font.Font(None, 36) 139 text = font.render("Pummel The Elephant, And Win $$$", 1, (10, 10, 10)) 140 textpos = text.get_rect(centerx=background.get_width()/2) 141 background.blit(text, textpos) 142 143 #Display The Background 144 screen.blit(background, (0, 0)) 145 pygame.display.flip() 146 147 #Prepare Game Objects 148 clock = pygame.time.Clock() 149 whiff_sound = load_sound('elephant-jump.wav') 150 punch_sound = load_sound('elephant-mmove.wav') 151 elephant = Elephant() 152 spear = Spear() 153 allsprites = pygame.sprite.RenderPlain((spear, elephant)) 154 155 #Main Loop 156 while 1: 157 clock.tick(60) 158 159 #Handle Input Events 160 for event in pygame.event.get(): 161 if event.type == QUIT: 162 return 163 elif event.type == KEYDOWN and event.key == K_ESCAPE: 164 return 165 elif event.type == MOUSEBUTTONDOWN: 166 if spear.punch(elephant): 167 punch_sound.play() #punch 168 elephant.punched() 169 else: 170 whiff_sound.play() #miss 171 elif event.type is MOUSEBUTTONUP: 172 spear.unpunch() 173 174 allsprites.update() 175 176 #Draw Everything 177 screen.blit(background, (0, 0)) 178 allsprites.draw(screen) 179 pygame.display.flip() 180 181 #Game Over 182 183 184 #this calls the 'main' function when this script is executed 185 if __name__ == '__main__': main()