SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
Segue, Landscape, Touch events, Alpha and
User Defined Runtime Attributes
Yutaka Yasuda, Kyoto Sangyo University
iPhone Programming meetup Kyoto, June, 2012
⽬標
• ぱしぱし叩けるゲームを作りたい
タッチイベントに反応
⽕花が出て消える(アニメーション)
• ステージを IB の操作だけで簡単に増やせる
Segue での場⾯進⾏
Segue
• 場⾯が変わるだけのアプリを作る
• ボタンをクリックすると指定した View に進む
場⾯#1
場⾯#2
ゴール!
新規プロジェクト作成
New Project... で
Single View App を選択
step 1. step 2.
プロジェクト名指定時に
Use Storyboards をチェック
今回は iPhone 限定で作った
Storyboard 初期状態
StoryBoard ができている
最初の⾶び込み
先を⽰す
とりあえず標準の
ViewController で
1 scene 存在
⽅眼紙 double
click で縮⼩表⽰
場⾯の追加(View Controller の Drag & Drop)
元からある View
適当なところに Drag & Drop
場⾯移動のためのボタンを設置
出発する View に Drag & Drop
そのボタンを Modal でつなぐ
Control + Click でメニューを出すと
こんなのがある
これだけで移動はOK
• 往路だけならこれでOK
• 戻りは要コード
戻るためのコード
// このビューを閉じて⼀つ前に戻る
- (IBAction)dismissButton:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
遷移を覚えているのだけれど、、、
さてループするような場合はどうするのが?
ViewController.m
Navigation View Controller
• 戻りのボタンは⾃動合成(コードも不要)
• ちょっと操作がトリッキー
start
scene
A1
scene
A2
goal
scene
B1
scene
B2
処理する ViewController を変え
たい場合は、
1. 新しい VC クラスを作って
2. この欄を作った VC に変更
ViewController の変更
はじめから横向けでの起動
横⻑モードでの起動
常に横⻑モードで画⾯を表⽰するアプリケーションは、このモードで起動するよう、シス
テムに対して明⽰的に指⽰しなければなりません。通常、iOSアプリケーションは縦⻑モー
ドで起動します。そして、必要に応じてデバイスの向きに合うようにインターフェイスを
回転します。アプリケーションで縦⻑と横⻑の両⽅の向きをサポートする場合は、必ず縦
⻑モードでビューを設定してから、View Controllerを利⽤して任意の向きに回転する処理
を⾏わなければなりません。ただし、アプリケーションが縦⻑の向きをサポートせず、横
⻑のみをサポートする場合は、最初から横⻑モードで起動したように⾒せるために、以下
のタスクを実⾏しなければなりません。
• アプリケーションのInfo.plistファイルにUIInterfaceOrientationキーを追加し、このキー
の値をUIInterfaceOrientationLandscapeLeftまたは
UIInterfaceOrientationLandscapeRightに設定する。
• ビューを横⻑モードにレイアウトし、ビューの⾃動サイズ変更オプションを確実に正し
く設定する。
• View ControllerのshouldAutorotateToInterfaceOrientation:メソッドをオーバーライ
ドし、横⻑左向き、または横⻑右向きに対してはYES、縦⻑の向きに対してはNOを返す。
iOSアプリケーション プログラミングガイド 

https://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneAppProgrammingGuide.pdf
Info.plist に UIInterfaceOrientation を追加
値は UIInterfaceOrientation のはずだがこの
ような表⽰になる
(この表⽰の通り⼊⼒してもちゃんと値は
UIInterfaceOrientation になる)
ここも表⽰とは異なり、値は
UIInterfaceOrientationLandscapeRight or ...Left に
ここはProjectの
target設定の
Supported Device
View を横⻑モードにレイアウト
• info-plist の Initial Interface Orientation が
Landscape
• StoryBoard で ViewController の Orientation
(Attributes Inspector) が inferred (推論)
であれば、⾃動的に View は横⻑ (480x320) になる
ViewController の Attributes Inspector View の Size Inspector
shouldAutorotateToInterfaceOrientation
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
(interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}
ViewController.m
ここで設定しているのだから、⾃動処理し
てくれてもいいのに!(実験済)
タッチイベントの取得
ぱしぱし叩きたい
• 画⾯上のどの位置をタッ
チしたか知りたい
• ボタンの
TouchUpInside などで
は座標位置の情報が⾜り
ない
• タッチイベントをそのま
ま取得
タッチイベントの取得
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// タッチ開始地点を取得
CGPoint lastTouchPoint = [[touches anyObject] locationInView:self.view];
[self punch:lastTouchPoint];
}
ViewController.m
⾃前のアクションを呼び出すなり
• touchesBegan イベントがそのまま拾える
• 当該ビューでの座標位置が得られる
★が出て消えるアニメーション
どこかで画像を初期処理などで flashImage プロパティに読み込み、保持しておく
flashImage = [UIImage imageNamed:@"flash01.png"];
- (void)punch:(CGPoint)point {
// イメージビューを置く
UIImageView *anImageView = [[UIImageView alloc] initWithImage:flashImage];
[anImageView setCenter:point];
[anImageView setAlpha:1.0];
[anImageView setUserInteractionEnabled:NO];
[self.view addSubview:anImageView];
// 徐々に薄くして最後は消す
[UIView animateWithDuration:0.5f
animations:^(void){
anImageView.alpha = 0.3;
}
completion:^(BOOL finished){
[anImageView removeFromSuperview];
}];
}
最初は Alpha 値 1.0 で⽤意
Alpha 値 0.3 まで変化させる
addSubview で「置く」
0.5秒かけて、
終了したら削除
ViewController.m
// アニメーションの開始
- (void)startAnimation
{
isAnimationRunning = YES;
[UIView animateWithDuration:0.1f // コマの周期
delay:0.0f
options:UIViewAnimationOptionCurveLinear |
UIViewAnimationOptionAllowUserInteraction
animations:^(void){ // アニメーション 1 サイクルの処理
[self moveChars]; // ⼀歩移動
}
completion:^(BOOL finished){
if( isAnimationRunning ) [self startAnimation];
}];
}
全体アニメーション制御
ViewController.m ループフラグを⽴てておく
直線的動作(イーズなどなし)
アニメート中のユーザ
操作を認める
再びアニメーション処理を⾏うループフラグが⽴っている限り
・ViewDidAppear イベントなどによって startAnimation 呼び出し
・ゲームオーバー判定になればループフラグを落として停⽌
ようやくゲーム的なこと
逃げるキャラクターを先回りして追う敵
• 移動するキャラクターと、どこで遭遇できるかを予想
して⾛る追跡キャラクター
以下の状況で A, B が衝突する時間 t と、そのために必要な⾓θを調べる
A (Ax, Ay)
Speed
A
B (Bx, By)
Speed B
(x, y)
逃亡する味⽅
追いかける敵
てくる敵
衝突予定
地点
衝突予測:ベクター & 三⾓関数
A
B
θ
Speed B
Speed A
(x, y)
(Ax, Ay)
単純化しました(B 原点出発・横移動のみ)
以下の状況で A, B が衝突する時間 t と、そのために必要な⾓θを調べる
関係式
x = SpeedB * t
x = cos θ * t * SpeedA + Ax
y = sin θ * t * SpeedA + Ay
y = 0
    
SpeedB * t = cos θ * t * SpeedA + Ax
0 = sin θ * t * SpeedA + Ay
ここで t が最⼩になる θ を求める
A
B
θ
Speed B
Speed A
(x, y)
(Ax, Ay)
y を消す
x を消す
勉強して出直してきます・・・・
いや、我々には Alpha がある
Mathematica (Alpha) で θ について解かせる
S = Speed B
R = Speed A
X = Ax
Y = Ay
r = θ  と表記
SpeedB * t = cos θ * t * SpeedA + Ax
0 = sin θ * t * SpeedA + Ay
Alpha への⼊⼒式:
 S*t=cos(r)* t* R + X, 0=sin(r) * t * R + Y for r and t
解
この √ 前負号は
まずい
R > S なので
これではtが負(マ
イナス時刻)になっ
てしまう
こちらは時刻が常
に正になってよろ
しい
Yがゼロでない
速度が同⼀でない(同⼀
だったら追いつかない)速度が逆符号の同値でない
たぶん無限⼤が出る
(divide by zero)
検算
試しに下側の式に S, R, X, Y の値を⼊れて t について解かせてみた。
⼊⼒式は以下のとおり:
(-S X+sqrt(R^2 X^2+R^2 Y^2-S^2 Y^2))/((R-S) (R+S)), R=2, S=1, X=5, Y=5
ルート 7 は 2.6 あたりなので
値は正。よしよし。
code : 最短合流地点への θ を得る
float thetaToMeetFor(float bSpeed, float ax, float ay, float aSpeed)
{
float theta;
// 先に計算不能状態を処理する
// もし A の y がゼロ(最初から B の真横にいた)なら theta は π or 0
if( fabs(ay) < 10.0 ) {
if(ax>0.0)
theta = M_PI;
else
theta = 0.0;
return theta;
}
// 解
theta = 2.0 * (atan((-1.0 * sqrt((aSpeed * aSpeed * ax * ax) +
(aSpeed * aSpeed * ay * ay) -
(bSpeed * bSpeed * ay * ay)) - ( bSpeed * ax ) )
/ ( ay * ( aSpeed + bSpeed ) )
)
);
return theta;
}
⼀般化
⼀般解が欲しくて
cos(R) * t * S2 + X2 = cos(r) * t * S1 + X1, sin(R) * t * S2 + Y2 = sin(r) * t * S1 + Y1 for r and t
つまり
をやらせてみたが、⼀般解は爆発して無理。
特殊条件のものについては並ぶが、それらではだめ。
レイアウトするだけで新しいステージを作る
レイアウトするだけでステージを作る
• scene を作り Segue で接続(勝つまで遷移ボタンは⾮表⽰)
• キャラクターはすべて共通のViewで作成
• キャラの性質はそのViewのproperty として埋め込み
User Defined Runtime Attributes
そのViewの任意の property に
初期値を設定できる
キャラの種類、速度、的の⼤
きさなどを設定
そのViewの任意の property
に初期値を設定できる
奇妙な制限事項
• ほとんど資料なし
• 使える形式は右の通り
• 数は Number のみ、かつ整数のみ
• Point, Size, Rect, Range は実数を
受け⼊れるが使うとエラーになる Xcode 4.3 以前
までは使えた?
コード
@synthesize charViews;
// 現在の view の上にある subviews を取り出し、そこから CharView だけを抜き出す
- (void)getCurrentCharViews
{
NSArray *subViews = [self.view subviews];
CharView *charView;
[charViews removeAllObjects]; // キャラの消滅を前提に毎回⼀旦空にする
int i;
for(i=0; i<subViews.count; i++) {
if([[subViews objectAtIndex:i] isKindOfClass:[CharView class]]) {
charView = [subViews objectAtIndex:i];
[charViews addObject:charView];
}
}
}
ViewController.h
ViewController.m
@property NSMutableArray *charViews;
isKindOfClass で種別を判定し、該当するものだけ加える
おしまい
• Segue での場⾯進⾏
• Landscape mode での起動
• touchesBegan の利⽤
• Mathematica Alpha
• 謎の User Defined Runtime Attributes
• Interface Builder だけで新ステージを作れる!

Weitere ähnliche Inhalte

Ähnlich wie Segue, Landscape, Touch events, Alpha and User Defined Runtime Attributes (8)

2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
OooBasic
OooBasicOooBasic
OooBasic
 
Swift Study Vol.4
Swift Study Vol.4Swift Study Vol.4
Swift Study Vol.4
 
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 
Leap Motion - 1st Review
Leap Motion - 1st ReviewLeap Motion - 1st Review
Leap Motion - 1st Review
 
Unity勉強会ハンズオン
Unity勉強会ハンズオンUnity勉強会ハンズオン
Unity勉強会ハンズオン
 
㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2㉔cocos2dでゲームを作ろう!その2
㉔cocos2dでゲームを作ろう!その2
 

Mehr von Yutaka Yasuda

Mehr von Yutaka Yasuda (13)

課題提出日の傾向から見る締切の期間設定
課題提出日の傾向から見る締切の期間設定課題提出日の傾向から見る締切の期間設定
課題提出日の傾向から見る締切の期間設定
 
ジェンガブロックの押しにくさを推定する試み
ジェンガブロックの押しにくさを推定する試みジェンガブロックの押しにくさを推定する試み
ジェンガブロックの押しにくさを推定する試み
 
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうか
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうかDomain Specific Architecture は今どこまで来ていて、これからどこに向かうか
Domain Specific Architecture は今どこまで来ていて、これからどこに向かうか
 
力のある情報系学生をうまく採用して欲しいのです
力のある情報系学生をうまく採用して欲しいのです力のある情報系学生をうまく採用して欲しいのです
力のある情報系学生をうまく採用して欲しいのです
 
RISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチRISC-V の現況と Esperanto Technologies のアプローチ
RISC-V の現況と Esperanto Technologies のアプローチ
 
教育側から見たセキュリティ人材教育の「明日はどっちだ」
教育側から見たセキュリティ人材教育の「明日はどっちだ」教育側から見たセキュリティ人材教育の「明日はどっちだ」
教育側から見たセキュリティ人材教育の「明日はどっちだ」
 
セキュリティ人材育成 最初の一步
セキュリティ人材育成 最初の一步セキュリティ人材育成 最初の一步
セキュリティ人材育成 最初の一步
 
京都産業大学におけるセキュリティ人材育成の考え方
京都産業大学におけるセキュリティ人材育成の考え方京都産業大学におけるセキュリティ人材育成の考え方
京都産業大学におけるセキュリティ人材育成の考え方
 
Lake Crest について調べてみた
Lake Crest について調べてみたLake Crest について調べてみた
Lake Crest について調べてみた
 
FPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow SwitchFPGA based 10G Performance Tester for HW OpenFlow Switch
FPGA based 10G Performance Tester for HW OpenFlow Switch
 
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
京都産業大学AO入試「情報」試験 – 実施報告と今後の展望
 
A proposal of the OpenFlow controller development support tool
A proposal of the OpenFlow controller development support tool A proposal of the OpenFlow controller development support tool
A proposal of the OpenFlow controller development support tool
 
OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

Segue, Landscape, Touch events, Alpha and User Defined Runtime Attributes