自由制作
私たちは、ARゲームを作るのを目指しunityを使い頑張り始めたところです。
まだ明確な目標は決めていませんが班で話し合っていた家族で楽しめるやつがいいと思います。
voforiaとunityを使って今日はサンプルを作り試みました。
unityが苦手な私は途中で断念しました。。また明日頑張る。
がしかし、班的には少し目指すものができたのはいいことです。毎時間頑張り、最終的にはいいものを作りつつ、班で楽しんで作れたらいいです。
個人研究
今日はpygameをpythonを使って本格的なゲームを使ってみたいと思います。
Pythonは欧米で人気なスクリプト言語です。
初心者にも扱いやすい言語で短くて読みやすいコードを書くことが出来ます。
数値計算や最近流行りの機械学習にも強いという特徴があります。
卓球ゲーム(PONG)
処理手順
① | ライブラリ「pygame」「sys」をインポートする。 |
② | バーとボールの位置・速度、得点の初期値を設定する。 |
③ | Pygameを初期化する。[pygame.init] |
④ | 大きさ640*480の画面(ウィンドウ)を生成する。[pygame.display.set_mode] |
⑤ | タイトルバーに表示する文字を「PONG」に設定する。[pygame.display.set_caption] |
⑥ | 画面に描画する文字のフォントと大きさを設定する。 |
⑦ | 背景色を黒に設定する。 |
⑧ | ボールを打つバーの設定をする。 |
⑨ | ボールの設定をする。 |
⑩ | 中央線、バー、ボールを描画する。 |
⑪ | 「↑」キーが押されたらプレイヤー側のバーのy座標を+10する。 |
⑫ | 「↓」キーが押されたらプレイヤー側のバーのy座標を-10する。 |
⑬ | 得点を計算する。[calc_score] |
⑭ | CPU側バーの動きを計算する。(ボールのy座標に追いつくように動かす)[calc_ai] |
⑮ | ボールの動きを壁・バーの跳ね返りを考慮して計算する。[calc_ball] |
⑯ | 閉じるボタンが押されたら画面を閉じて終了する。 |
サンプル
# -*- coding:utf-8 -*-
import pygame
from pygame.locals import *
import sys
# ボールの動きを計算
def calc_ball(ball_x, ball_y, ball_vx, ball_vy, bar1_x, bar1_y, bar2_x, bar2_y):
if ball_x <= bar1_x + 10.:
if ball_y >= bar1_y - 7.5 and ball_y <= bar1_y + 42.5:
ball_x = 20.
ball_vx = -ball_vx
if ball_x >= bar2_x - 15.:
if ball_y >= bar2_y - 7.5 and ball_y <= bar2_y + 42.5:
ball_x = 605.
ball_vx = -ball_vx
if ball_x < 5.:
ball_x, ball_y = 320., 232.5
elif ball_x > 620.:
ball_x, ball_y = 307.5, 232.5
if ball_y <= 10.:
ball_vy = -ball_vy
ball_y = 10.
elif ball_y >= 457.5:
ball_vy = -ball_vy
ball_y = 457.5
return ball_x, ball_y, ball_vx, ball_vy
# AIの動きを計算
def calc_ai(ball_x, ball_y, bar2_x, bar2_y):
dy = ball_y - bar2_y
if dy > 80: bar2_y += 20
elif dy > 50: bar2_y += 15
elif dy > 30: bar2_y += 12
elif dy > 10: bar2_y += 8
elif dy < -80: bar2_y -= 20
elif dy < -50: bar2_y -= 15
elif dy < -30: bar2_y -= 12
elif dy < -10: bar2_y -= 8
if bar2_y >= 420.: bar2_y = 420.
elif bar2_y <= 10.: bar2_y = 10.
return bar2_y
# プレイヤーの動き
def calc_player(bar1_y, bar1_dy):
bar1_y += bar1_dy
if bar1_y >= 420.: bar1_y = 420.
elif bar1_y <= 10. : bar1_y = 10.
return bar1_y
# 得点の計算
def calc_score(ball_x, score1, score2):
if ball_x < 5.:
score2 += 1
if ball_x > 620.:
score1 += 1
return score1, score2
# イベント処理
def event(bar1_dy):
for event in pygame.event.get():
if event.type == QUIT: # 閉じるボタンが押されたら終了
pygame.quit()
sys.exit()
if event.type == KEYDOWN: # キーを押したら
if event.key == K_UP:
bar1_dy = -10
elif event.key == K_DOWN:
bar1_dy = 10
elif event.type == KEYUP: # キーを押し終わったら
if event.key == K_UP:
bar1_dy = 0.
elif event.key == K_DOWN:
bar1_dy = 0.
return bar1_dy
def main():
# 各パラメータ
bar1_x, bar1_y = 10. , 215.
bar2_x, bar2_y = 620., 215.
ball_x, ball_y = 307.5, 232.5
bar1_dy, bar2_dy = 0. , 0.
ball_vx, ball_vy = 250., 250.
score1, score2 = 0,0
ball_r = 7
# pygameの設定
pygame.init() # Pygameの初期化
screen = pygame.display.set_mode((640,480),0,32) # 画面の大きさ
pygame.display.set_caption("PONG") # 画面タイトル
clock = pygame.time.Clock()
font = pygame.font.SysFont(None,40) # 画面文字の設定
# 背景の設定
back = pygame.Surface((640,480))
background = back.convert()
screen.fill((0,0,0))
# ボールを打つバーの設定
bar = pygame.Surface((10,50))
bar1 = bar.convert()
bar1.fill((255,255,255))
bar2 = bar.convert()
bar2.fill((255,255,255))
# ボールの設定
circ_sur = pygame.Surface((20,20))
pygame.draw.circle(circ_sur,(255,255,255),(ball_r, ball_r), ball_r)
ball = circ_sur
ball.set_colorkey((0,0,0))
while (1):
# 各オブジェクトの描画
screen.blit(background,(0,0))
pygame.draw.aaline(screen,(255,255,255),(330,5),(330,475)) # 中央線の描画
screen.blit(bar1,(bar1_x,bar1_y)) # プレイヤー側バーの描画
screen.blit(bar2,(bar2_x,bar2_y)) # CPU側バーの描画
screen.blit(ball,(ball_x, ball_y)) # ボールの描画
screen.blit(font.render(str(score1), True,(255,255,255)),(250.,10.))
screen.blit(font.render(str(score2), True,(255,255,255)),(400.,10.))
# プレイヤー側バーの位置
bar1_dy = event(bar1_dy)
bar1_y = calc_player(bar1_y,bar1_dy)
# ボールの移動
time_passed = clock.tick(30)
time_sec = time_passed / 1000.0
ball_x += ball_vx * time_sec
ball_y += ball_vy * time_sec
# 得点の計算
score1, score2 = calc_score(ball_x, score1, score2)
# CPUのバー速度を計算
bar2_y = calc_ai(ball_x, ball_y, bar2_x, bar2_y)
# ボールの速度・位置を計算
ball_x, ball_y, ball_vx, ball_vy = calc_ball(ball_x, ball_y, ball_vx, ball_vy, bar1_x, bar1_y, bar2_x, bar2_y)
pygame.display.update() # 画面を更新
if __name__ == "__main__":
main()
■
今回はパイソンの数値計算のプログラムのサンプルコードを試してみたいと思います。
#!/usr/local/python print('2+1 =', 2+1) print('10-3 =', 10-3) print('7*4 =', 7*4) print('5/2 =', 5/2) print('5//2 =', 5//2) print('10%3 =', 10%3) print('2**10 =', 2**10)
[user@localhost basic]$ python ensan.py
2+1 = 3
10-3 = 7
7*4 = 28
5/2 = 2.5
5//2 = 2
10%3 = 1
2**10 = 1024
九九計算
#!/usr/local/bin/python for x in range(0,9): for y in range(0,9): print('{0}'.format('%2d ' % ((x+1) * (y+1))), end="") print('')
[user@localhost basic]$ python 99.py
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
円周率
#!/usr/local/bin/python import sys import math # # Machin's formula # π/4 = 4 * Arctan(1/5) - Arrctan(1/239) # def arctan(x, k): arctanx = 0 for n in range(0, k): arctanx += pow(-1, n) * (1/(2 * (n+1) - 1)) * pow(x, (2*(n+1) - 1)) return arctanx if __name__ == '__main__': argv = sys.argv if len(argv) != 2: print('usage : {0} <n>'.format(argv[0])) quit() for k in range(1, int(argv[1])): pi = 4 * (4 * arctan(1/5, k) - arctan(1/239, k)) print(pi)
[user@localhost basic]$ python pi.py 10
3.141592653589836
■
画像フィルタ機能
説明
CIFilter
を使用した、フィルタリング後の画像を一覧表示するサンプル。- このサンプルは1枚の画像にフィルタをかけた場合のサンプル。 ※複数の画像を用意すれば、複数枚画像を掛け合わせたような画像を生成することができるフィルタも多数ある。フィルタの種類についてはAppleのCore Image Filter Referenceを参照。
ポイント
CIFilter
の生成時にフィルタ名としてCIBoxBlur
やCIDiscBlur
などの文字列を指定することで画像にフィルタをかけることができる。
Delegateによるデータ受け渡しのデザインパターン(DelegateSample)
説明
protocol
を使用し、UITableViewCell
に配置されたUIButton
のタップイベントをView配置元のUIViewController
に検知させるためのDelegateデザインパターンサンプル。 ※今回はDelegateデザインパターンを実装するためのサンプルなので、UITableViewDelegate
のDelegateに関する説明は割愛します。
ポイント
- Delegate(移譲)
元
のdelegateプロパティ定義には基本的に弱参照weak
で定義する。 - Delegate
元
のdelegateプロパティ定義はランタイムエラーを防ぐためにオプショナル型?
で定義する。 - Delegate
元
のdelegate定義にはprotocol
を使用する。 - Delegate
先
のdelegate対象クラス生成時に移譲処理(xxx.delegate = self
に該当する)を記述する。 - Delegate
先
のクラス定義部分にdelegateに該当するprotocol名
と、Delegate元
のprotocolで定義したメソッド
を記述する。 ※extension
を使用して、移譲先
クラスのスコープ外にprotocol名
とメソッド
を定義し直してもOK。