#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
SCR = ( 640 , 480 )
pygame.init ( )
screen = pygame.display .set_mode ( SCR)
pygame.display .set_caption ( u"水面波紋" )
clock = pygame.time .Clock ( )
animecycle = 3
frame = 0
x, y, z = 0 , 0 , 0
"""任意に指定できる数値"""
max_radius = 50 #描画する円の最大径
vestige = 5 #同じ径の円を何回描画するか
magnification = 3 #径を何倍にして描写するか
"""
max_circles = 7, vestige = 3の時の挙動
描画パターン番号 1 2 3 4 5 6 7 8 9 10 11
各番号の描画円数 1 1 2 2 3 3 3 2 2 1 1
peak↑ ↑peak_end = max_radius
描画最小円半径 1 2 1 2 1 2 3 4 5 6 7
"""
max_time = vestige * 3 + max_radius - 3 #一つの波紋を構成する描画パターン数
max_frame = max_time * animecycle #波紋を描き終えた時のフレーム
peak = vestige * 2 - 1 #描画円数が初めて最高値になるパターン番号
while True :
clock.tick ( 60 )
screen.fill ( ( 100 , 100 , 200 ) )
frame += 1
if frame > max_frame:
frame = 1
pattern = frame / animecycle #描画パターン番号
"""描画円数を求める"""
if pattern <= peak:
draw_times = pattern / 2 #各番号の描画円数
if pattern % 2 != 0 :
draw_times += 1
if pattern > peak:
if pattern <= max_radius:
pass
if pattern > max_radius:
draw_times = vestige - ( pattern - max_radius) / 2
if ( pattern - max_radius) % 2 != 0 :
draw_times -= 1
"""描画最小円半径を求める"""
if pattern < peak:
radius = 1
if pattern % 2 == 0 :
radius += 1
if pattern >= peak:
radius = pattern - peak + 1
radius *= magnification
for i in range ( draw_times) :
pygame.draw .circle ( screen, ( 150 , 150 , 255 ) , ( 320 , 240 ) , radius, 1 )
radius += 2 * magnification
pygame.display .update ( )
for event in pygame.event .get ( ) :
if event.type == QUIT:
pygame.quit ( )
sys .exit ( )
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCmltcG9ydCBweWdhbWUKZnJvbSBweWdhbWUubG9jYWxzIGltcG9ydCAqCmltcG9ydCBzeXMKClNDUiA9ICg2NDAsIDQ4MCkKCnB5Z2FtZS5pbml0KCkKc2NyZWVuID0gcHlnYW1lLmRpc3BsYXkuc2V0X21vZGUoU0NSKQpweWdhbWUuZGlzcGxheS5zZXRfY2FwdGlvbih1IuawtOmdouazoue0iyIpCgpjbG9jayA9IHB5Z2FtZS50aW1lLkNsb2NrKCkKCmFuaW1lY3ljbGUgPSAzCmZyYW1lID0gMAp4LCB5LCB6ID0gMCwgMCwgMAoKIiIi5Lu75oSP44Gr5oyH5a6a44Gn44GN44KL5pWw5YCkIiIiCm1heF9yYWRpdXMgPSA1MCAj5o+P55S744GZ44KL5YaG44Gu5pyA5aSn5b6ECnZlc3RpZ2UgPSA1ICPlkIzjgZjlvoTjga7lhobjgpLkvZXlm57mj4/nlLvjgZnjgovjgYsKbWFnbmlmaWNhdGlvbiA9IDMgI+W+hOOCkuS9leWAjeOBq+OBl+OBpuaPj+WGmeOBmeOCi+OBiwoiIiIKbWF4X2NpcmNsZXMgPSA3LCB2ZXN0aWdlID0gM+OBruaZguOBruaMmeWLlQrmj4/nlLvjg5Hjgr/jg7zjg7Pnlarlj7fjgIAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMQrlkITnlarlj7fjga7mj4/nlLvlhobmlbDjgIAxIDEgMiAyIDMgMyAzIDIgMiAgMSAgMQrjgIAgICAgICAgICAgICAgICAgICBwZWFr4oaRICAg4oaRcGVha19lbmQgPSBtYXhfcmFkaXVzCuaPj+eUu+acgOWwj+WGhuWNiuW+hOOAgOOAgDEgMiAxIDIgMSAyIDMgNCA1ICA2ICA3CiIiIgoKbWF4X3RpbWUgPSB2ZXN0aWdlICogMyArIG1heF9yYWRpdXMgLSAzICPkuIDjgaTjga7ms6LntIvjgpLmp4vmiJDjgZnjgovmj4/nlLvjg5Hjgr/jg7zjg7PmlbAKbWF4X2ZyYW1lID0gbWF4X3RpbWUgKiBhbmltZWN5Y2xlICPms6LntIvjgpLmj4/jgY3ntYLjgYjjgZ/mmYLjga7jg5Xjg6zjg7zjg6AKcGVhayA9IHZlc3RpZ2UgKiAyIC0gMSAj5o+P55S75YaG5pWw44GM5Yid44KB44Gm5pyA6auY5YCk44Gr44Gq44KL44OR44K/44O844Oz55Wq5Y+3Cgp3aGlsZSBUcnVlOgogICAgY2xvY2sudGljayg2MCkKICAgIHNjcmVlbi5maWxsKCgxMDAsMTAwLDIwMCkpCgogICAgZnJhbWUgKz0gMQogICAgaWYgZnJhbWUgPiBtYXhfZnJhbWU6CiAgICAgICAgZnJhbWUgPSAxCiAgICBwYXR0ZXJuID0gZnJhbWUgLyBhbmltZWN5Y2xlICPmj4/nlLvjg5Hjgr/jg7zjg7Pnlarlj7cKCiAgICAiIiLmj4/nlLvlhobmlbDjgpLmsYLjgoHjgosiIiIKICAgIGlmIHBhdHRlcm4gPD0gcGVhazoKICAgICAgICBkcmF3X3RpbWVzID0gcGF0dGVybiAvIDIgI+WQhOeVquWPt+OBruaPj+eUu+WGhuaVsAogICAgICAgIGlmIHBhdHRlcm4gJSAyICE9IDA6CiAgICAgICAgICAgIGRyYXdfdGltZXMgKz0gMQogICAgaWYgcGF0dGVybiA+IHBlYWs6CiAgICAgICAgaWYgcGF0dGVybiA8PSBtYXhfcmFkaXVzOgogICAgICAgICAgICBwYXNzCiAgICBpZiBwYXR0ZXJuID4gbWF4X3JhZGl1czoKICAgICAgICBkcmF3X3RpbWVzID0gdmVzdGlnZSAtIChwYXR0ZXJuIC0gbWF4X3JhZGl1cykgLyAyCiAgICAgICAgaWYgKHBhdHRlcm4gLSBtYXhfcmFkaXVzKSAlIDIgIT0gMDoKICAgICAgICAgICAgZHJhd190aW1lcyAtPSAxCgogICAgIiIi5o+P55S75pyA5bCP5YaG5Y2K5b6E44KS5rGC44KB44KLIiIiCiAgICBpZiBwYXR0ZXJuIDwgcGVhazoKICAgICAgICByYWRpdXMgPSAxCiAgICAgICAgaWYgcGF0dGVybiAlIDIgPT0gMDoKICAgICAgICAgICAgcmFkaXVzICs9IDEKICAgIGlmIHBhdHRlcm4gPj0gcGVhazoKICAgICAgICByYWRpdXMgPSBwYXR0ZXJuIC0gcGVhayArIDEKICAgIHJhZGl1cyAqPSBtYWduaWZpY2F0aW9uCgogICAgZm9yIGkgaW4gcmFuZ2UoZHJhd190aW1lcyk6CiAgICAgICAgcHlnYW1lLmRyYXcuY2lyY2xlKHNjcmVlbiwgKDE1MCwxNTAsMjU1KSwgKDMyMCwyNDApLCByYWRpdXMsIDEpCiAgICAgICAgcmFkaXVzICs9IDIgKiBtYWduaWZpY2F0aW9uCiAgICAKICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpCiAgICBmb3IgZXZlbnQgaW4gcHlnYW1lLmV2ZW50LmdldCgpOgogICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gUVVJVDoKICAgICAgICAgICAgcHlnYW1lLnF1aXQoKQogICAgICAgICAgICBzeXMuZXhpdCgpCg==