明日への断片

ゲーム制作やプログラミング関する記事を中心に更新していこうと思います。

12欠片目:第1回ミッカソン終了~全ての事には意味がある~

 こんにちは。今日自転車で帰宅中、正面から来た同じく自転車のおっちゃんと、どっちに避けるかの一瞬の心理戦が繰り広げられ、無事敗北を喫したvoidです。おっちゃん強かった...

今日は、うん...反省会です。

結果発表

動画

宇宙っぽい背景に、弾を飛ばすプレイヤーと上から降りてくる敵たち...これはもう紛うことなきシューティングゲームですね!!




反省会に行きたいと思います。




反省会

点数:20点(100点満点)

実装できなかったもの

 ・効果音、BGM
  これは今回特に重要視するものではなかったので、時間の都合上省略しました。(ということにしました。)
 ・敵の弾及びパターン
  こちらは次の項にも関わってきますが、パターン分けをどこでどの様に実装するかの設計が甘かったため実装できませんでした。
 デザインパターン
  今回の主役であるはずの彼らを実装できなかったとは何事かと、突っ込みたくなる気持ちは抑えて頂き、自分なりの反省点を挙げていきたいと思います...

そもそもデザインパターンを理解しきれていなかった...

 デザインパターンは、ネット上のいくつかの記事を使って勉強していました。説明文やサンプルコードを読んで、多分こんなものだろうなと納得し、実際にプログラムで使ってみようというのが、今回のミッカソンの起点でした。
 
 しかし今回の制作を経て、「多分こんなもんだろうな」というあいまいな理解のまま使おうとした事がまずかったのだと思います。

成果

 今回のミッカソンの成果は、自分がデザインパターンいかに理解できていないかということを理解したという点だと思っています。全ての事には意味があるのです。無駄とかとかではないのです。

むしろそう思わなきゃやってられないですよ。

「ミッカソンで三日損」

とか、始めてこのPCに「みっかそん」って打って変換した時の誤字が「三日損」だった(本当にあった話)のが伏線だったとかそんなオチは多分求められていないと思うので...

もう一つの目標である「ゴールをぶれないようにする」は、まぁ達成だと思います。
(切羽詰まっててぶれる余裕がなかったともいう)

思わぬ収穫アリ

 今回の制作で思わぬ副産物がありました。
それは、[キーボードの同時入力数限界]です。


普通に文字を入力したり、ショートカットキーとして使っていると気が付かないのではないでしょうか。


今回の制作で、当初は矢印キーで移動、スペースキーでショットというキー割り当てだったのですが、ショットを打ちながら(スペースキー押しっぱなし)だとプレイヤーの斜め移動(横キーと縦キーの同時押し)がうまくいかず、プログラム的なミスだと思い何度か見直していたのですが、どうやらハード(キーボード)側の仕様らしいのです。
(学校の自習室で困っていたら先生がフラーっと来て教えてくれました)

詳しい仕組み説明はネットに載っていたのでぜひ調べてみてください。

というわけで、ハードによっては同じプログラムでもちゃんと動いたりするそうで。また、キーの組み合わせによっては3キー以上同時押ししても大丈夫なものがありました。最終的にこのゲームはWASDキーで移動、Enterキーでショットとい具合に落ち着きました。


どっと疲れた3日間

 精神的にも体力的にも結構消耗した3日間。3日って意外と短い...ということを痛感しました。
第2回ミッカソンに向けて(性懲りもなく続ける)、しばらくはデザインパターン等を勉強し、ちゃんと理解して、ちゃんと休んでおきたいと思います。ブログもしばらくはカジュアルな感じになると思います(多分)。
3日間お騒がせしました。ではまた!

10欠片目:シューティングゲーム進捗報告①

 こんにちは!ブログタイトルの数字が2桁になってちょっとうれしいvoidです。


早速、昨日お話していたシューティングゲームの進捗を報告していきたいと思います。

その前に、昨日の補足

 昨日の記事見返してていろいろ言葉足らずな点があったたので、補足します...
クラス設計、クラス設計って何回か言うてますが、デザインパターンを利用した、ゲームのクラス設計を勉強するのが今回の目的の1つでした。その言葉入れるのすっかり忘れてました(大事なとこなのに...)


では、進捗報告に移ります

今日やったこと

 1.ゲームの大体の仕様を決定する

 2.クラス図を作成する

ゲームの仕様

ゲームの仕様はパワーポイントを使ってまとめました。


f:id:yasu-game-void:20170218232723j:plain

f:id:yasu-game-void:20170218232727j:plain

f:id:yasu-game-void:20170218232734j:plain

 今回はシンプルなシューティングゲームかつ個人制作ということで、仕様書はこんな感じでいいのかなと...



いいのかな...



気にするのはやめましょう、今回の制作で重要なことは、「やっぱりあれも追加しよう!」「これもやってみたい..」という誘惑に負けずに完成までもっていくことなのですから。

いろいろ追加しようとするとゴールがぶれて完成しなくなります。(自戒)

クラス図の作成


 ナニコレムズカシイ


シューティグゲームのクラス図なんてそんなに難しくならないだろ」と高を括っていました。

ところが、デザインパターンを組み込もうとすると、クラスとクラスの関係がぐちゃぐちゃしてきて、まるでパズルを解いているかのような感覚に陥っていました。
 
デザインパターンは上手く使えば強力な武器になるはずなんですが、まだその力を制御しきれていない感じです...



ブラウザ上でクラス図やフローチャートなど色々作成できるツール「Flowchart Maker & Online Diagram Software」を発見し、これを使って書いてみました。



試行錯誤の結果がこちらです。


f:id:yasu-game-void:20170219001627j:plain

f:id:yasu-game-void:20170218235802j:plain


まだクラスの中身の部分は書けていない部分があるのですが、こんな感じになりました。


あとは、中身を書き込んでプログラムに実装していくのですが、果たしてうまくいくのでしょうか...?

②へ続く...

そして今日も日をまたぐ...

はい、今回もグダグダと書いてしまっているうちに、日をまたいでしまいました。
特に気にしてはいなかったのですが、はてなブログでは日をまたぐと(?)継続日数が途切れてしまうようです。
かといって、毎日 日付変更後に書いては毎日夜更かし確定なので避けたいのです...
 次回からは、予約投稿とか使ってみようと思います。

ではまた!

11欠片目:シューティングゲーム進捗報告②

 こんにちは。頭痛がすると思って休んでいたて、目が覚めたら午前が終わっていて絶望したvoidです。色々時間を無駄にし過ぎました。進捗報告をささっと。

今日やったこと

 クラス図を基に、プログラムを組み始めました。
 

 具体的には、自機をキー操作で移動させる、敵を出現させて移動させる部分を組みました。
 振り返るとこんだけしかできてないのか...


 クラス図を自分で作成してそこからプログラムを組むといった経験があまりなかったので、ちょっとてこずりましたが何とか頑張っていました。

クラス図大事

 昨日、クラス図を書いているときはこんなに複雑になってていいのだろうかと思っていましたが、クラス図があることでクラス同士が複雑な関係にあっても視覚的に関係性をとらえることができ、プログラムを円滑に組むことが出来たような気がします。

発生した問題点

・ライブラリに慣れていない

問題点:まだDirectX ToolKitにあまり慣れておらず、思ったように処理を追加できなかった
解決策:チュートリアルサイトやサンプルコードを読んで勉強する

・時間管理

問題点:体調不良もあったが、それを加味しても作業している時間が少なかった
解決策:ここまで作ったら休憩という小目標を設定する

本日は以上

 今回は淡泊ですが、以上で報告を終了します。明日には完成報告出来るように頑張ります。ではまた!



大丈夫かミッカソン...

9欠片目:第1回ひとりミッカソン開催 ~シューティングゲーム篇~

 こんにちは。今朝、電車で両サイドの人(男性)がうたた寝で、がっつり自分に寄りかかるという小事件に遭遇したvoidです...

いや眠いのは分かりますが...

ミッカソンって何ぞ?

 えー、造語です。

三日間で行うハッカソン、略してミッカソンなのです。
 

ハッカソンとは...

ハッカソン(英語: hackathon 、別名:hack day ,hackfest ,codefest )とはソフトウェア開発分野のプログラマやグラフィックデザイナー、ユーザインタフェース設計者、プロジェクトマネージャらが集中的に作業をするソフトウェア関連プロジェクトのイベントである。
(参照:Wikipedia)


要するに、

3日でゲームを作ろうという企画です。

開発期間:2/18, 19, 20
開発言語:C++
開発環境:DirectX Tool Kit(フレームワークは学校で使っているものを使用)

何故シューティングゲームか?

・クラス設計に重点を置きたいので、一度授業で作ったことがあるものが良いと思ったから
・かつ、設計を試してみるのに良さそうだったから

以上の理由により、シューティングゲームを採用しました

今回の制作で気を付けること

1.クラス設計
2.目標を途中で変更しない

この2つが、今回の制作で重要にしたいポイントです。
単純に言うと、苦手を克服するのが目的です。

今日は

 この企画の説明だけで終わろうと思います。明日から制作の進捗状況を載せていこうと思います。ではまた!

8欠片目:ゲーム制作に便利な数学関数~sin,cos編~

 こんにちは!冒頭の下らない自己紹介のネタが切れてきて困っているvoidです。
最近、本を読み始めました。タイトルは「オズの魔法使い」です。有名な童話ですね。まだ読み切ってないのですが、なかなかワクワクできて面白いと感じています。余裕が出来たらお勧めの本とかも紹介してみようかなぁなどと思いつつ本題へ!

サインコサインとかいう呪文

 サイン,コサイン,タンジェント。中学や高校で多くの人が数学の時間に習ったと思われます。そしてまた、多くの人がこう思ったのではないでしょうか。

「サインコサインなんていつ使うん?」

A:ゲーム制作で使います。
※もちろん、ゲーム制作以外の場所でも使われています
※今回は便宜上タンジェントさんの出番はございません

サイン,コサインを計算する関数

オススメ度★★★★

double sin(double x);  /*実数(double)型のサインを計算*/

double cos(double x);  /*実数(double)型のコサインを計算*/
機能 与えられた角度x(ラジアン値)のサイン値,コサイン値を返す

待って、そもそもサイン,コサインって何だっけ?

 ざっくりいうと、です。(ざっくりしすぎ)

図でわかる!サイン,コサイン

ここに、ある角度θ(シータ)が存在します。(パズーじゃないよ)
f:id:yasu-game-void:20170216223934j:plain

そこに、長さ1の辺を追加します。
f:id:yasu-game-void:20170216224156j:plain

この辺を斜辺とし、θを角度に持つ直角三角形は、
f:id:yasu-game-void:20170216224949j:plain

必ず、こんな形になると思います。

このとき、

「yは1(斜辺)の何倍か」を表したものがsinθ

「xは1(斜辺)の何倍か」を表したものがcosθ

即ち、

1 * sin(θ) == y;
1 * cos(θ) == x;

というわけです。

いつ使うの?

 シューティングゲーム等で、自機を斜めに動かしたい!弾を相手のいる方向に飛ばしたい!というときによく使われます。
プログラムで画像を表示する際にはx座標とy座標を指定して描画します。つまり斜めに動かすときは両方の値を計算する必要があります。

例えば、右キーを押したとき、右に1進む。上キーを押したときに上に1進むという処理で右上に進もうとすると、斜めの移動量は、√2という値になってしまい、不自然な動きになります。

 そこで!斜め移動をするときは、右に1*cos(π/4)進み、上に1*sin(π/4)進むことで、斜めの移動量が1になり、動きがとても滑らかになります。

π/4は45度のラジアン

いかがだったでしょうか

 あまり上手に説明できていなかった気もしますが、sin(),cos()を上手く使って計算すると、ゲームの表現の幅が広がると思うので、自分もどんどん使いこなせるようになっていきたいと思います!


本日はこの辺で。ではまた!

7欠片目:ゲーム制作に便利な数学関数~abs編~

 こんにちは!雨が降るか降らないか微妙なとき、傘を持って出かけると雨は降らず、持たずに出かけると雨が降る。そんな運命にあるvoidです。
 今日は家で一日まったりと過ごして、たまにはこんな日があってもいいなと思いました。

数学とゲーム

 ゲーム制作と数学には切っても切れない縁があります。今回はC言語の数学関数のうち、実際にゲームを作るときにオススメなもの紹介してい行きたいと思います。

数学関数を使うには

 数学関数を使うためには<math.h>をインクルードしてあげるだけで使えちゃいます。さて、それでは実際に関数を見ていきましょう。

絶対値を求める関数

オススメ度:★★☆☆

 double fabs(double x);  /*実数*/
 int abs(int x);      /*整数*/
機能 引数として渡した値の絶対値を戻り値として返す

どちらも基本的に同じ意味ですが、fabsは実数(小数)型を扱うとき、absは整数型を扱うといった使い分けです。

■使用例

「プレイヤーと敵の距離を絶対値で求める」

下の画像(即興で用意しました)のように敵とプレイヤーが配置されているとします。
真ん中の棒人間がプレイヤーです。
f:id:yasu-game-void:20170215224021j:plain

 単純に敵とプレイヤーの距離を測るには、敵のx座標からプレイヤーのx座標を引いてあげることで求めることが出来ますね。この場合、右をx軸のプラスとすると、敵2との距離は正の値に、敵1との距離は負の値になります。
しかし、そうなってしまうとまずいことがあります。
 
 例えばプレイヤーとの距離が5以下になったとき、敵は攻撃する。という処理を追加しようとすると、敵1のようにプレイヤーの左側にいる敵は全て距離が負の値なので、距離が5以下になってしまい、常に攻撃しようとしてしまいます。かといってif文で(-5以上かつ0以下)または(0以上5以下) というのも大変面倒くさいです。
 
 そこで、abs関数を使って絶対値を求めてあげるのです。
すると、左の敵も右の敵も正の距離として扱うことが出来ますね。
地味ですが、これはこれで結構便利だったりします。

この企画は分割払いで...

他にも便利な関数はたくさんあるのですが、一度にまとめようとすると、物量的にきついので何度かに分けて紹介使用するとしましょう。明日はみんな大好き、サインコサインについて話そうかと思います。ではまた!

6欠片目:とある聖職者の殉教日について

 こんにちは、好きなチョコレートはアルフォートなvoidです。
早いもので、このブログも書き始めて1週間となりました。果たしていつまで継続するのか、自分でも楽しみになってまいりました。

今日こそは雑談

 昨日は雑談するつもりが、気が付いたらプログラム話になっていました...
↓昨日の記事

yasu-game.hatenablog.com

 本日は世間的にも結構有名な記念日なわけでして、それについて調べたことを書いていこうと思います。
いわゆる、時事ネタってやつですよ。なんかブログっぽくていいじゃないですか。

ヴァレンタイン(ウァレンティヌス)とは何者だったのか?

 ウァレンティヌスは3世紀頃のキリスト教の聖職者で、恋人たちの守護聖人とされていたそうです。彼はキリスト教迫害の中でも熱心に宣教活動を行い、人々を助け導いてきましたが皇帝の怒りを買い、2月14日に処刑されてしまったようです。

恋人の記念日

 中世の頃、バレンタインデーに恋人へ、詩や文書を送るようになったのがバレンタインデーの起源とされているようです。元々のバレンタインデーにチョコを送る文化はなかったようですね。

日本への展開と文化の変質

 日本ではバレンタインデーは独特な展開をしました。「バレンタインデーにはチョコを贈る」という少し変わった形として一般的に広まるようになったのは1970年代後半の事だそうです。
 日本でのバレンタインデーの普及の起源は諸説あるようですが、とある製菓メーカーが、「バレンタインデーには愛しい人にチョコレートを贈りましょう」という旨の広告が、バレンタインチョコレートの起源として最も有力な説とされています。


(参考サイト: Wikipedia)

調べてみて思ったこと


 「...面白いなぁ」


 今までは、何となく「そういう記念日がある」という程度だったのですが、実際に調べてみると歴史的な面や宗教的な面があって、今にも残る記念日が出来たのだと思うと、文化の起源と変遷というのはとても興味深く感じられます。
 これからも、何か記念日があったらこういう記事を書いていくのも面白いかもしれないですね。

本日はここまで。ではまた!