ドラマ『3人のパパ』
昔見た『Three Men and a Baby』(1987)
と似てますが、次回予告を見る限り似てるのは1話だけっぽいです。赤ちゃんかわいいですねえ。
babyに関するコマンドがないかなあと思いaptで探してみました。
takk@deb8:~$ apt-cache search baby dvdrip-queue - queue up dvd::rip projects bambam - keyboard mashing and doodling game for babies dictconv - convert a dictionary file type in another dictionary file type guitarix - Rock guitar amplifier for Jack ospics - Some images of operating system logos/mascots goldendict - 機能豊富な辞書検索プログラム takk@deb8:~$
こんなコマンドが見つかりました。
bambam – keyboard mashing and doodling game for babies
さっそくインストールして起動。
takk@deb8:~$ sudo apt-get install bambam (snip) takk@deb8:~$ bambam
ん〜。何でしょう。
でも、きっと、自分が赤ちゃんなら面白いゲームに違いありません。
ゲームは赤ちゃん向けでも、ソースは大人向けです。ソースを見てみます。
takk@deb8:~$ cd bambam-0.5+dfsg/ takk@deb8:~/bambam-0.5+dfsg$ ls COPYING README bambam.6 bambam.py data debian docs extrasounds icon.gif takk@deb8:~/bambam-0.5+dfsg$ wc -l bambam.py 227 bambam.py takk@deb8:~/bambam-0.5+dfsg$
ソースの量も少ないので、全文見てみます。
takk@deb8:~/bambam-0.5+dfsg$ cat -n bambam.py 1 #!/usr/bin/env python 2 #Copyright (C) 2007-2008 Don Brown 2010 Spike Burch <spikeb@gmail.com> 3 # This program is free software: you can redistribute it and/or modify 4 # it under the terms of the GNU General Public License as published by 5 # the Free Software Foundation, either version 3 of the License, or 6 # (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # GNU General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public License 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 import pygame, sys,os, random, string, glob 17 import argparse 18 import fnmatch 19 from pygame.locals import * 20 21 # draw filled circle at mouse position 22 def draw_dot(): 23 r = 30 24 mousex, mousey = pygame.mouse.get_pos() 25 26 dot = pygame.Surface((2 * r, 2 * r)) 27 pygame.draw.circle(dot, get_color(), (r, r), r, 0) 28 dot.set_colorkey(0, pygame.RLEACCEL) 29 30 screen.blit(dot, (mousex - r, mousey - r)) 31 32 33 # Return bright color varying over time 34 def get_color(): 35 col = Color('white'); 36 37 hue = pygame.time.get_ticks() / 50 % 360 38 col.hsva = (hue, 100, 100, 50) 39 40 return Color(col.r, col.g, col.b) 41 42 43 # Load image/, handling setting of the transparency color key 44 def load_image(fullname, colorkey = None): 45 try: 46 image = pygame.image.load(fullname) 47 except pygame.error, message: 48 print "Cannot load image:", fullname 49 raise SystemExit, message 50 image = image.convert() 51 if colorkey is not None: 52 if colorkey is -1: 53 colorkey = image.get_at((0, 0)) 54 image.set_colorkey(colorkey, RLEACCEL) 55 return image 56 57 58 # Load sound file in data/ 59 def load_sound(name): 60 class NoneSound: 61 def play(self): pass 62 if not pygame.mixer: 63 return NoneSound() 64 try: 65 sound = pygame.mixer.Sound(name) 66 except pygame.error, message: 67 print "Cannot load sound:", name 68 raise SystemExit, message 69 return sound 70 71 72 # Loads a list of sounds 73 def load_sounds(lst): 74 result = [] 75 global args 76 for name in lst: 77 if True in [fnmatch.fnmatch(name, p) for p in args.sound_blacklist]: 78 print "Skipping blacklisted sound:", name 79 else: 80 result.append(load_sound(name)) 81 return result 82 83 84 # Processes events 85 def input(events, quit_pos): 86 global sequence, mouse_down, sound_muted 87 for event in events: 88 if event.type == QUIT: 89 sys.exit(0) 90 91 # handle keydown event 92 elif event.type == KEYDOWN: 93 # check for words like quit 94 if event.type == KEYDOWN: 95 if is_alpha(event.key): 96 sequence += chr(event.key) 97 if sequence.find('quit') > -1: 98 sys.exit(0) 99 elif sequence.find('unmute') > -1: 100 sound_muted = False 101 #pygame.mixer.unpause() 102 sequence = '' 103 elif sequence.find('mute') > -1: 104 sound_muted = True 105 pygame.mixer.fadeout(1000) 106 sequence = '' 107 108 # Clear the background 10% of the time 109 if random.randint(0, 10) == 1: 110 screen.blit(background, (0, 0)) 111 pygame.display.flip() 112 113 # play random sound 114 if not sound_muted: 115 sounds[random.randint(0, len(sounds) - 1)].play() 116 117 # show images 118 if is_alpha(event.key): 119 print_letter(event.key) 120 else: 121 print_image() 122 pygame.display.flip() 123 124 # mouse motion 125 elif event.type == MOUSEMOTION : 126 if mouse_down: 127 draw_dot() 128 pygame.display.flip() 129 130 # mouse button down 131 elif event.type == MOUSEBUTTONDOWN: 132 draw_dot() 133 mouse_down = True 134 pygame.display.flip() 135 136 # mouse button up 137 elif event.type == MOUSEBUTTONUP: 138 mouse_down = False 139 140 return quit_pos 141 142 143 # Prints an image at a random location 144 def print_image(): 145 #global swidth, sheigh 146 img = images[random.randint(0, len(images) - 1)] 147 w = random.randint(0, swidth - img.get_width()) 148 h = random.randint(0, sheight - img.get_height()) 149 screen.blit(img, (w, h)) 150 151 # Is the key that was pressed alphanumeric 152 def is_alpha(key): 153 return key < 255 and (chr(key) in string.letters or chr(key) in string.digits) 154 155 # Prints a letter at a random location 156 def print_letter(key): 157 global args 158 font = pygame.font.Font(None, 256) 159 if args.uppercase: 160 char = chr(key).upper() 161 else: 162 char = chr(key) 163 text = font.render(char, 1, colors[random.randint(0, len(colors) - 1)]) 164 textpos = text.get_rect() 165 center = (textpos.width / 2, textpos.height / 2) 166 w = random.randint(0 + center[0], swidth - center[0]) 167 h = random.randint(0 + center[1], sheight - center[1]) 168 textpos.centerx = w 169 textpos.centery = h 170 screen.blit(text, textpos) 171 172 # Main application 173 # 174 parser = argparse.ArgumentParser(description='A keyboard mashing game for babies.') 175 parser.add_argument('-u', '--uppercase', action='store_true', help='Whether to show UPPER-CASE letters.') 176 parser.add_argument('--sound_blacklist', action='append', default=[], help='List of sound filename patterns to never play.') 177 args = parser.parse_args() 178 179 if not pygame.font: print 'Warning, fonts disabled' 180 if not pygame.mixer: print 'Warning, sound disabled' 181 182 pygame.init() 183 184 # figure out the install base to use with image and sound loading 185 progInstallBase = '/usr/share/bambam' 186 187 # swith to full screen at current screen resolution 188 window = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) 189 190 # determine display resolution 191 displayinfo = pygame.display.Info() 192 swidth = displayinfo.current_w 193 sheight = displayinfo.current_h 194 195 pygame.display.set_caption('Bam Bam') 196 screen = pygame.display.get_surface() 197 198 background = pygame.Surface(screen.get_size()) 199 background = background.convert() 200 background.fill((250, 250, 250)) 201 sequence = "" 202 screen.blit(background, (0, 0)) 203 pygame.display.flip() 204 205 mouse_down = False 206 sound_muted = False 207 208 def glob_data(pattern): 209 return glob.glob(os.path.join(progInstallBase, 'data', pattern)) 210 211 sounds = load_sounds(glob_data('*.wav')) 212 213 colors = (( 0, 0, 255), (255, 0, 0), (255, 255, 0), 214 (255, 0, 128), ( 0, 0, 128), ( 0, 255, 0), 215 (255, 128, 0), (255, 0, 255), ( 0, 255, 255) 216 ) 217 218 images = [load_image(glob_data('chimp.bmp')[0], -1)] 219 images.extend([load_image(name) for name in glob_data('*.gif')]) 220 221 quit_pos = 0 222 223 clock = pygame.time.Clock() 224 225 while True: 226 clock.tick(60) 227 quit_pos = input(pygame.event.get(), quit_pos)
pygame使っているんですね。
dataディレクトリに格納したgifファイルを使うので、自分で作った画像も使えるようです。
コメント