5欠片目:3歩進んで2歩下がる
こんにちは!小学生の時、何も持たずに習い事に行って、慌てて取りに戻ったことがあるvoidです!(アホですね!)
昨日、一昨日とプログラミング的な記事を書いて、ネタ切れというわけではないのですが休憩的な意味で今回は雑談回にしようかなーと思います...(言えない、今回のタイトル決めるだけで1時間かかったなんて...)
結局1歩しか進まない...
今回のタイトルは、「三百六十五歩のマーチ」という歌の歌詞の一部を抜き取ったものなのです。人生は進もうと思ってもうまくいかず、戻ってしまったり大変だけど1歩ずつ進んでいこうという歌とのことです。3歩進んで2歩下がれば1歩ずつしか進まないのは明白ですよね。ですが、私が思うに「3歩進んで2歩下がる」の文字通りなら、その進んだ1歩が3歩に達したとき、また2歩下がってしまい、結局1歩になってしまうんじゃないでしょうか!?
図にすると、
○○○ 3歩進んで
○ 2歩下がる
●○○○ 3歩進んで
●○ 2歩下がる
●●○○○3歩進んで
●●● 2歩下がる ←計3歩進んだ
● 2歩下がる
...以下ループ
なんと、最大でも5歩しか進めません!
衝撃のあまりプログラムを組んでしまいました!()
// ShiawasehaAruitekonai.c int main(void) { int num_walk = 0; // 歩いた歩数 int i = 0; // ループカウンタ // 無限ループ while (1) { // 3歩進む for (i = 0; i<3; i++) { num_walk++; } // 2歩下がる num_walk -= 2; // 3歩進んだら2歩下がる if (num_walk == 3) { num_walk -= 2; } } return 0; }
プログラムで人生の大変さを表せるんですね...
ちなみに、このプログラムで使われているループには終了条件がありません。このような状態を無限ループと言ったりします。ゲームを作っていると極稀にこれが原因でバグが起こったりしてしまいますので、無限ループを使うときはしっかりbreak文で終わらせるように気を付けましょう!
以上、無限ループのお話でした!(あれ?)
幸せ歩けよ
頑張って歩いている人の元には幸せの方から歩み寄ってあげてもいいと思うのです。
私も頑張って1歩ずつ歩んでいこうと思います。ではまた!
4欠片目:ビット演算の応用
こんにちは!ケーキのイチゴは最初でも最後でもなく途中で食べるvoidです。
何故かこの時間にブログを書くのが定着しそうなのが少し不安な今日この頃...(現在、午後11時)
(一応)毎日更新できてるので、この調子でどんどん書いていこうと思います。
続・ビット演算
さて、昨日はビット演算の基本的な計算方法を紹介しましたね。
↓昨日の記事
yasu-game.hatenablog.com
技術的な話をすると、「間違えたらまずい...」っていう感覚あって結構緊張しますね...まぁそれはそれで訓練(?)になると思うので慣れていきたいと思います。
ビット演算の使い道
自分が初めてビット演算を勉強した時は、こう思いました。
「ビット演算の基本は分かったが、こんな計算いつ使うんや?」
実はこいつには中々便利な使い道が存在しています。
その1つが、フラグ管理です。
ビット演算によるフラグ管理
ここでは、ロールプレイングゲームを例に挙げてみましょう。
ロールプレイングゲームに、毒、混乱、睡眠、火傷...等の状態異常を実装するとします。その状態によって、プレイヤーはダメージを受けたり、行動を制限されたりしますよね。そのためには、プレイヤーが今どの状態異常にかかっているかを記憶する必要があります。これを1つずつ管理しようとすると、C言語ではint型、C++言語ではbool型のフラグ用変数を用意する必要があります。
int isPoison; // 毒状態かどうか int isConfused; // 混乱状態かどうか int isSleeping; // 睡眠状態かどうか ・ ・ ・
このように、状態異常の数と同じ分だけ変数を作る必要があります。
これをたった1つの変数で管理出来たらすごいと思いませんか?思いますよね? なんとできてしまうのです!そう、ビット演算ならね(言ってみたかっただけ)
int state;
はい、これだけで良いのです。
フラグ管理の仕組み
ビット演算でのフラグ管理の仕組みを説明していきます。ビットのデータは「1」または「0」が存在していましたね。すなわち「ON」または「OFF」の状態が存在してるのです。その各ビット毎に状態異常を対応させてあげるのです。
状態異常 | 毒 | 混乱 | 睡眠 | 火傷 |
---|---|---|---|---|
ビットデータ | 0 | 0 | 0 | 0 |
このように対応させてみました。int型は4byte = 32bitなのでもっとたくさんの状態異常を用意できますね。(32個も状態異常があるゲームは見たことないですが...)
この対応で見ると、
プレイヤーの状態 | stateの値(2進数) | stateの値(10進数) |
---|---|---|
火傷 | 0001 | 1 |
睡眠 | 0010 | 2 |
混乱 | 0100 | 4 |
毒 | 1000 | 8 |
更には、
火傷+毒 | 1001 | 9 |
なんてこともできます。
プログラムに実装するには
サンプルコードを書いてみました
/* Sample.c*/ #include <stdio.h> // 状態異常を定数にする #define NORMAL 0 // 通常状態 #define BURN 1 // 火傷 #define SLEEP 2 // 睡眠 #define CONFUSE 4 // 混乱 #define POISON 8 // 毒 int main(void) { // 最初は通常状態 int state = NORMAL; // 毒状態を追加 state = state | POISON; // 火傷状態を追加 state = state | BURN; // 毒状態をチェック if (state & POISON) { // 毒状態のときの処理 printf("今は毒状態です\n"); } // 火傷状態をチェック if (state & BURN) { // 火傷状態のときの処理 printf("今は火傷状態です\n"); } return 0; }
まず、初めは通常状態なのでstateの値はNORMAL(0)です。次に、
state = state|POISON;
とありますが、stateは0000でPOISONは1000なので、ビット和は1000となりstate == 1000となります。ちゃんと毒状態になっていますね。
次を見てみましょう。
state = state | BURN;
となっています。現在のstateは1000で、BURNは0001なのでビット和は1001となりstate == 1001となります。このとき、
state = BURN;
としてしまうと、毒状態が上書きされて消えてしまうのでしっかり現在の状態とのビット和を求めましょう。
最後にstateと、調べたい状態のビット積を求めていますね。stateの値は1001、POISONの値は1000でビット積は1000となり、0以外なので真として判定されます。BURNを同じようにして調べても、ビット積は0001となり真になります。
しかし、SLEEP(0010)やCONFUSE(0100)と比べると、ビット積は0000となり、偽になります。
しっかりと、毒と火傷の状態をだけを判別できていますね!
長くなりましたが...
はい、思っていたよりも本当に長くなってしまいましたが、『ビット演算によるフラグ管理』、分かっていただけたでしょうか?(書き始めてから2時間たってました...)
ビット演算を使うと変数が一つで済むので、メモリも減らせますし、なんかかっこいいなぁと思って自分は結構使ってたりします。是非、使い道を探してみてください!
反省、そして明日へ...
全体的にもっと簡潔にまとめたいのですが、書いているうちにこれもいるんじゃないか?あれもいるんじゃないか?ここは間違ってないか?などとしているうちにこうなってしまいました...文章構成にも気にしながら明日からは書いていこうと思います...
ではまた!
3欠片目:ビット演算の基本
こんにちは!小学校の卒業アルバムの「将来の夢」を書く欄に、何故か「フリーター」と書いていたvoidです!
今回は、ブログ4回目にしてようやくプログラム的なお話をしようと思います!
ビット演算って何さ?
ビット同士の演算、すなわちデータを2進数で表したときの各ビット毎で行う演算のことです。
2進数とは何か?
私たちが普段使っている10進数に対して、コンピュータでは2進数が使われています。
10進数は0~9までの10個の数字を使って数を表すのに対し、2進数は0,1の2個の数字のみを使って数を表します。
表にするとこんな感じです
で、ビット演算ってなにさ?
ビット演算には3つの種類があります。
演算の種類 | 演算記号 | 演算の内容 |
---|---|---|
ビット和(OR) | | | どちらかが1ならば1 |
ビット積(AND) | & | どちらともが1ならば1 |
ビット差(XOR) | ^ | 互いに異なれば1 |
※書式の都合上記号は全角文字になっています。
...いまいち分かりませんね、では計算例を見てみましょう
1と3のビット和 |
1 | 3 → 0001 | 0011
このように、各ビット毎の上と下どちらかが1であれば1になります。
つまり1 | 3 = 3となります。
1と3のビット積 |
1 & 3 → 0001 & 0011
このように、各ビット毎の上と下どちらともが1であれば1になります。
つまり1 & 3 = 1となります。
1と3のビット差 |
1 ^ 3 → 0001 ^ 0011
このように、各ビット毎の上と下が互いに異なっていれば1になります。
つまり1 ^ 3 = 2となります。
本日はここまで
中の人が力尽きたので本日はここまでとしたいと思います。
間違いのないように書いているつもりですが、間違いを見つけた際はご指摘頂ければ幸いです。
明日は、ビット演算の応用的な使い方を書いていこうと思います。ではまた!
2欠片目:卒業研究制作展に参加
毎日更新の予定でしたが、不覚にも日をまたいでることに気が付かないとういう失態を犯してしまいました...
が、しかし、まだ寝てないのでノーカンということで!
卒業研究制作展
自分が通っている専門学校の先輩達による作品の展示会が行われました。自分が所属するゲーム学科以外にも情報処理学科やCG学科などの作品も見て回ることが出来ました。
感想
まず、ゲーム学科を見て回った感想は、どのチームもUnityやUnreal Engineなどのゲームエンジンを使用した作品が多く、各ゲームエンジンの特性を活かした開発を行っているように感じられました。
次に、他学科の作品を見た感想としては、今まで自分の知らなかったような技術を使ったソフトウェアや、クォリティの高いCG作品など、普段自分が携わっているゲーム開発とは全く違った視点から作られたものを見ることが出来ました。このような、いつもとは違った視点というのも大切にしていきたいと感じることが出来ました。
来る日に向けて
というと大げさかもしれませんが、再来年には自分達が出展者側になるのだと考えると、今の自分が何かを感じられたように、次に自分達の作品を見る人たちにも何かを残していけるよなものを作りたいと思いました。
そのための技術向上を図っていきたいですし、そのためにもこのブログを活用していけたらいいなぁなんて思っています。
ではまた!
1欠片目:感情を動かすゲーム作り
さて今回は内容的には第一回となる記事更新ですが、プログラム方面の事ではなく、ゲームの企画方面のことを書いていきたいと思います。
ダンガンロンパV3
何故こんな記事を書こうと思ったかというとダンガンロンパV3をプレイして、「こんなに感情の動いたゲームは久しぶりだ!!」と思ったからです。
知っていらっしゃる方もいると思われますが、「ダンガンロンパ」はハイスピード推理アクションと呼ばれている人気シリーズです。謎解きやアクションだけではなく、そのストーリーにも毎回力が入れられており、最新作である ダンガンロンパ V3でも予想できない展開を楽しむことが出来ました。
ゲームが動かす感情とは
映画や小説でも同じことが言えるように、人気のあるゲーム、面白いゲームというのは必ずと言っていいほど何かしらの感情が動いているはずです。では、自分がダンガンロンパV3をプレイしていたときに動いた感情をいくつか挙げてみます。
悲しい、嬉しい、悔しい、期待、不安、驚き、疑い、怒り、喜び、焦り、困惑、達成感...etc
1つのゲーム内で色んな感情を行ったり来たりできるのはなんでだろうと、自分なりに分析してみました。
■ぶれないテーマ
ゲーム内に一つぶれないテーマがあることでゲームとしての軸が生まれ、プレイヤーの没入感が高まり、より感情を動かしやすくなっているのではないでしょうか。
■細かな演出
画面の遷移などの細かな演出を工夫することで、シーンにメリハリがつきプレイヤーの感情の切り替えのタイミグを生み出しているのではないかと思います。例えば、印象的なシーンの前後のフェードインフェードアウトは普段よりもゆっくりになっていて、その衝撃の余韻を残す作りになっているように感じました。
※個人の意見です
やってみようと思った
この記事を書いてるうちに、いろんな感情をテーマにしてゲームを作ったら面白いものが作れるんじゃないだろうか?と思ってしまいました。春休みの期間を利用してやっていこうかなとおもいました。
今日こんな感じで。ではまた!
0欠片目:あいさつ
初めまして
これからvoidという名前でブログを書いていこうと思っている者です。
よろしくお願いします!
ブログ概要
このブログでは、主にゲームプログラミングに関する記事を上げていこうかなと思っております。
自分の作品の進捗状況や、学んだ技術の共有をしていく予定です。雑談も多くなるかもですが...
ブログを書くのはほぼ初めてなので、拙い点も多いと思いますのでご容赦下さい
目的と目標
このブログを書くにあたって目的と目標を定めました。
目的
- 継続力、習慣を身に付ける
- 技術、体験の発信
目標
まずは1か月間、毎日更新!
コツコツと更新して、自分の力として身に付け、書いた記事が自分や誰かの役に立っていけばいいなと思っています。
こんな感じで
自由に更新していこうと思っています。ではまた!