先週まではARのゲームを目指していましたが、班の人と話し合っていくうちにまた違う案がどんどん浮かび上がってARは諦めたいと思いました。

そこで他のアプリを作るにはどのような開発環境が必要なのかを調べてみていいなと思ったのは二つあります。

1.UWP Windows用のプラットフォーム

2.Monaca IOS.android両方に対応している

 

どちらにしても自分たちが目指しているアプリを作るには使うことになると思います。

 

自由制作

私たちは、ARゲームを作るのを目指しunityを使い頑張り始めたところです。

まだ明確な目標は決めていませんが班で話し合っていた家族で楽しめるやつがいいと思います。

voforiaとunityを使って今日はサンプルを作り試みました。

unityが苦手な私は途中で断念しました。。また明日頑張る。

がしかし、班的には少し目指すものができたのはいいことです。毎時間頑張り、最終的にはいいものを作りつつ、班で楽しんで作れたらいいです。

自由制作(グループテーマ)

今日は何を作るかをグループで少し話し合いました。

今日は昨日話し合った親のスマホ依存で子供がボッチになっているという問題についてのアプリを作るには、何の機能をつかって作るのかを考えていました。

例えばUnity,パイソン、C言語Javaなど

Unityでアニメーションを作りJavaなのでプログラミングをしそういったアプリを作りたいのと

そういったアプリを使って家族でコミュニケーションが取れればいいと思います。

自由制作(グループテーマ)

私たちが考えているのは

介護系・子供向けのアプリケーション

・介護食・幼児食用などのクッキングアプリ

家で介護する家庭も増えてきている中、介護のごはんに困ることもあると思いそれを支援するクッキングアプリ

 

・親のスマホ依存、子供ボッチ、コミュニケーション不足問題を解決するアプリーケーション。

スマホゲーム、一緒に体を動かす、カメラ機能のARゲーム

このことによって一緒に家族で遊べながら体を動かすことのできるARゲーム

 

のを話し合い模索中。。。

 

個人研究

今日はpygamepythonを使って本格的なゲームを使ってみたいと思います。

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()

今回はパイソンの数値計算のプログラムのサンプルコードを試してみたいと思います。

f:id:segmentation-fault:20170811151613p:plain

#!/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枚の画像にフィルタをかけた場合のサンプル。 ※複数の画像を用意すれば、複数枚画像を掛け合わせたような画像を生成することができるフィルタも多数ある。フィルタの種類についてはAppleCore Image Filter Referenceを参照。

 ポイント

  • CIFilterの生成時にフィルタ名としてCIBoxBlurCIDiscBlurなどの文字列を指定することで画像にフィルタをかけることができる。

 Delegateによるデータ受け渡しのデザインパターン(DelegateSample)

 説明

  • protocolを使用し、UITableViewCellに配置されたUIButtonのタップイベントをView配置元のUIViewControllerに検知させるためのDelegateデザインパターンサンプル。 ※今回はDelegateデザインパターンを実装するためのサンプルなので、UITableViewDelegateDelegateに関する説明は割愛します。

 ポイント

  • Delegate(移譲)delegateプロパティ定義には基本的に弱参照weakで定義する。
  • Delegatedelegateプロパティ定義はランタイムエラーを防ぐためにオプショナル型?で定義する。
  • Delegatedelegate定義にはprotocolを使用する。
  • Delegatedelegate対象クラス生成時に移譲処理(xxx.delegate = selfに該当する)を記述する。
  • Delegateのクラス定義部分にdelegateに該当するprotocol名と、Delegateのprotocolで定義したメソッドを記述する。 ※extensionを使用して、移譲クラスのスコープ外にprotocol名メソッドを定義し直してもOK。