C++

SDL始めました

C++

試しに自作のフレームワークを公開してみる。 まだ全然作りかけですが…(´Д`; なにが凄いかというと(まあ、フレームワークとしては当たり前ですが) CSDLManager::Run()を呼ぶと、勝手にゲームループがぐるぐる回ってくれるので、 ISceneを継承して、各シ…

曲線

はじめに 今回は曲線の作り方を解説します。 「?…なぜ曲線?」 と思われるかもしれませんが、 曲線を作れるようになると、美しい軌道をする敵を簡単に作れるようになります。 実際、市販のシューティングゲームの開発現場では、 曲線を使って、動きのスクリ…

有限状態機械(Finite State Machine)

はじめに 有限状態機械とは、 「複数の『状態』を持ち、その『状態』により『振る舞い』が決定される抽象的な機械」 のことです。 具体的な例を挙げると、パックマンのモンスターがそれに該当します。 モンスターは、 移動 追跡 逃避 3つの「状態」を持ちま…

OpenGLでOBB

うーん、OBB素晴しい…。 こんなきわどい衝突も検知できてしまいますね…。 個人的にハマったのは、回転行列を掛け合わせる順番を、 「描画」ではrotX*rotY*rotZとしていたのに、 「行列構造体」ではrotZ*rotX*rotYにしていたことですね。 (というか、それはO…

OpenGLでAABB

操作方法は昨日と同じです。 AABBは頂点の最小値と最大値を引っ張ってきて、 比較するだけなので、判定処理は簡単ですね。 むしろ、箱を表示するのに手間がかかりました…(´∀`; #include <math.h> #include <string> #include <iostream> #include <glut.h> #include <ctype.h> using namespace std; /</ctype.h></glut.h></iostream></string></math.h>…

OpenGLで境界球判定

ようやくOpenGLが分かってきたような、分からないような…(∀`; とりあえず、境界球判定を行うサンプルを。 赤ボールの移動 Z・Xキー:X方向への移動 A・Sキー:Y方向への移動 Q・Wキー:Z方向への移動 カメラの移動 ↑↓キー:X軸回転 ←→キー:Y軸回転 ソース…

リストファイル読み込みクラス

C++

これも、全然なんてことはないですが、あると便利なクラス。 1.enemy # 敵のタイプ,x座標,y座標,z座標, # 一匹目 nomal,-10,0,-5, # 二匹目 nomal,5,0,20, # 三匹目 fly,-2,10,15,こんなファイルをリストに読み込みます。 ListLoader.h #pragma once #includ…

連想配列ファイル読み込みクラス

C++

全然なんてことはないですが、あると便利なクラス。1.area # マップの左上座標 map_lt_x=-50 map_lt_y=0 map_lt_z=-50 # マップの右上座標 map_rb_x=50 map_rb_y=0 map_rb_z=50 # 木の座標 tree_x=5 tree_y=0 tree_z=-10 # プレイヤーの初期座標 player_x=0 …

スプライト構造体

最近、不真面目な更新が多いので、 今日は真面目路線で、私が使っているタスクシステムもどきの解説をします。 C++でやるなら、本当ならクラスでやるべきなのですが、 モノグサな私は、構造体でスプライトを定義しています。 (…不真面目じゃん) まずはユー…

描画処理とデータ処理の分割(Observerパターン)

はじめに 今回はゲームシステムの構築の核となる、Observerパターンについて解説します。 なぜObserverパターンが必要になるのか? 例えばゲームを作ろうとすると、たいてい以下のような処理を書くことになります。 // メイン実行クラス class CMain { priva…

DirectXFramework

まだデバイス管理とシーン遷移管理しかないですが…。 Frameworkの外の部分が、実装するとこです。 CSceneResourceLoaderクラスは、 起動時に「Now Loading... 24%」みたいに、 画像ファイルやサウンドファイルの読み込み画面の表示です。 CSceneXXXクラスで…

シーンの遷移(Stateパターン)

C++

はじめに ゲームには、 タイトル モードセレクト メインゲーム 結果 などのシーンがあります。 それらのシーンの遷移をオブジェクト指向で実現する方法を解説します。 シーンクラス まず基底となるISceneクラスを定義します。 /** * シーン基底クラス。 * コ…

汎用フィールドクラス

最近、何時間もかけて更新しているので、 今日は軽めのネタで。 例えば、 テトリスやリバーシなどのパズルゲームや、 SLGやRPGでのマップなどを作る際には、 必ず2次元のフィールドが必要となります。 そういった場合に使える、汎用のフィールドクラ…

タスクシステム5

いよいよ最終回です(ようやく?) 今回はタスクシステムを発展させてみます。 C++におけるタスクシステム これまでは、タスクを「構造体」で定義していました。 ですが、せっかくC++を使っているので、 「クラス」で実装できないか?ということを考えてみま…

タスクシステム4

タスク同士の当たり判定 ここが超重要です。はいはいテストに出ますよー(何のテストじゃ) 例えば、ブロック崩し(こればっかですね)において、 以下のタスクがぶつかった場合、何らかのやり取りを考えなければなりません。 ボールvs壁 ボールvsパドル ボ…

タスクシステム3

タスクチェンジ タスクチェンジとは、実行関数ポインタの入れ替えを行うことです。 たとえば、シューティングゲームでは、敵の行動について、以下のパターンがあります。 初期処理 移動したり弾を撃ったりする 爆発処理 これらの処理を関数ポインタの入れ替…

タスクシステム2

ダミータスク タスクは双方向リストとなるわけですが、 先頭と末尾のタスクに「NULL」をいちいち設定するのは大変です。 ということで、先頭と末尾のタスクは、 ダミーとして空のタスクを用意しておきます。 これにより、タスクの追加・削除の処理が楽になり…

タスクシステム1

タスクシステムとは何か タスクシステムとは、 複数の「タスク」を並列実行する 仕組みのことです。 では、「タスク」というのは何かというと、 ゲームを構成する最小単位の要素 のことです。 例えば、ブロック崩しにおける、ブロックやパドル、ボールなどが…

MFCで画像表示3

C++

CreateDIBSectionで表示。 void *buffer; // 画像ビット配列 BITMAPINFO bmi; ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = height; bmi.bmiHeader.biPlanes…

MFCで画像表示2

C++

CBitmapでリソースから読み込み CBitmap bitmap; bitmap.LoadBitmap(リソースID); CClientDC dc(this); CDC mDC; mDC.CreateCompatibleDC(&dc); CBitmap *old = mDC.SelectObject(&bitmap); dc.BitBlt( 0, 0, 50, 50, &mDC2, 0, 0, SRCCOPY); mDC.SelectObje…

MFCで画像表示1

C++

LoadImageで読み込み HBITMAP hbmp = (HBITMAP)LoadImage(NULL, "ファイル名", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if(hbmp == NULL) return; CClientDC dc(this); CDC mDC; mDC.CreateCompatibleDC(&dc); HBITMAP old = (HBITMAP)mDC.SelectObject(hbmp…

グラデーション作成3

keim_at_Siさんの助言を元に、改造しました。 AB・AP BA・BP それ以外の場合は、n=(AB・AP)/(AB^2)⇒色=開始色*(1-n)+終了色*n う〜む、恐ろしいほどスッキリしてしまいました。 線形代数すばらしや…。 // =================================================…

グラデーション作成2

dx=0のときとdy=0のときは別処理にして、 それぞれマイナスのときは、スワップしてフラグを立て、最後に反転させることで対応しました〜。 // 汎用グラデーション作成(開始座標取得ポインタ) int (*GetStartX1)(float a, float b, int j, int x); int GetS…

グラデーション関数作成

学校の宿題のグラデーション関数を作成。 開始点と終了点、開始色と終了色を指定して、 直線のグラデーションを作るだけですが、、。 たったこれだけに、5h程かかりました…ふい〜(´Д`; なんというか、数学の力がものすごく不足してますね…。(トホホ…。 /…

四則演算

C++

勢いに任せて、C++版を実装。 #include <iostream> #include <string> using namespace std; int calc(string expr, int x) { bool flgInit = true; // 初期処理フラグ int ret; // 戻り値 int sIdx = 0; // 文字の切り出し開始位置 int eIdx = 0; // 文字の切り出し終了位置 s</string></iostream>…

シングルトン

C++

C++でのシングルトンをJavaと同じように書いてみたら、 コンパイルは通るけど、ビルドで落ちました…(´Д`; 小一時間悩んでも分からなかったので、ネットで調べたらこんなものが…。 http://www.01-tec.com/document/cpp_design_pattern.html#Singleton そう…

Boost C++

ゲームを作るときには、 マップデータ シューティングゲームの敵キャラの移動ルーチンスクリプト 当たり判定 敵のパラメータ サウンドON/OFFなどの設定ファイル といったものを、外部データにすることにより開発効率が上がります。 ということで、マップデー…

クラス

C++

今更ながらC++でのクラスの使い方が分かったので、メモメモ。 virtual 関数名 = 0; とすると純粋仮想関数となり、そのクラスでは実装する必要がない。 純粋仮想関数を持つクラスは抽象クラスとなり、インスタンスを行うことができない。 基底クラスで関数にv…

変数の定義

C++

変数の定義はどこでもできるので、 必要なときまでガマンして宣言するようにする。(Lazy Instantiation) それはスコープを明確にするためと、コンストラクタ引数を用意するためである。

friend関数

C++

複数クラスの共通処理の実体を1つにまとめることができる。 クラスの外からprivateメンバ変数にアクセスすることができる。