ソース全文
import pygame
import time
from random import *
# 初期化
pygame.init()
pygame.display.set_caption("pygame アプリ")
DISP_SIZE = (480, 480) # 横, 縦
surf = pygame.display.set_mode(DISP_SIZE)
# 色を定義しておく (タプル:固定)
COLOR_BG = (32, 32, 32)
# 座標, サイズ, 速度, 色 を管理するオブジェクトを定義
class MyRect:
def __init__(self, _pos, _size, _speed, _color):
self.pos = _pos
self.size = _size
self.speed = _speed
self.color = _color
def move(self):
self.pos[0] += self.speed[0]
self.pos[1] += self.speed[1]
def invert_x(self):
self.speed[0] *= -1
def invert_y(self):
self.speed[1] *= -1
# MyRect を格納するリスト
myRects = []
RECT_NUM = 30 # 作る個数
for i in range(RECT_NUM):
myRects.append(
MyRect(
[randint(0, DISP_SIZE[0]-64), randint(0, DISP_SIZE[1]-64)], # 座標
[64, 64], [4, 4], # サイズ, 速度
(randint(0, 255), randint(0, 255), randint(0, 255)) # 色
))
# 閉じるを押すまでループ
running = True
while running:
for myRect in myRects:
# 座標更新
myRect.move()
# もし画面端にたどり着いた場合は反転
if myRect.pos[0] > (DISP_SIZE[0] - myRect.size[0]) or myRect.pos[0] < 0:
myRect.invert_x()
if myRect.pos[1] > (DISP_SIZE[1] - myRect.size[1]) or myRect.pos[1] < 0:
myRect.invert_y()
# 描画
surf.fill(COLOR_BG)
for myRect in myRects:
pygame.draw.rect(surf, myRect.color, (*myRect.pos, *myRect.size))
pygame.display.update()
# ウェイト
time.sleep(0.016)
# イベント
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
実行結果は全く同じです。一体何を変えたというのでしょう。
# 座標, サイズ, 速度, 色 を管理するオブジェクトを定義
class MyRect:
def __init__(self, _pos, _size, _speed, _color):
self.pos = _pos
self.size = _size
self.speed = _speed
self.color = _color
def move(self):
self.pos[0] += self.speed[0]
self.pos[1] += self.speed[1]
def invert_x(self):
self.speed[0] *= -1
def invert_y(self):
self.speed[1] *= -1
途中、上記のような記述が登場します。これが先ほどとの違いです。これは クラス といいます。クラスを用いてプログラムを記述すると読みやすくなります。複数の四角形を動かす処理の部分を以前と比較してみます。
以前
for i in range(RECT_NUM): # 座標更新
pos[i][0] += speed[i][0]
pos[i][1] += speed[i][1]
現在
for myRect in myRects:
# 座標更新
myRect.move()
クラスを使わない場合、プログラムは計算式になりがちです。ところが、クラスを用いると、プログラムのソースを 「主語.述語」で記述できるようになります。