C++
試しに自作のフレームワークを公開してみる。 まだ全然作りかけですが…(´Д`; なにが凄いかというと(まあ、フレームワークとしては当たり前ですが) CSDLManager::Run()を呼ぶと、勝手にゲームループがぐるぐる回ってくれるので、 ISceneを継承して、各シ…
はじめに 今回は曲線の作り方を解説します。 「?…なぜ曲線?」 と思われるかもしれませんが、 曲線を作れるようになると、美しい軌道をする敵を簡単に作れるようになります。 実際、市販のシューティングゲームの開発現場では、 曲線を使って、動きのスクリ…
はじめに 有限状態機械とは、 「複数の『状態』を持ち、その『状態』により『振る舞い』が決定される抽象的な機械」 のことです。 具体的な例を挙げると、パックマンのモンスターがそれに該当します。 モンスターは、 移動 追跡 逃避 3つの「状態」を持ちま…
うーん、OBB素晴しい…。 こんなきわどい衝突も検知できてしまいますね…。 個人的にハマったのは、回転行列を掛け合わせる順番を、 「描画」ではrotX*rotY*rotZとしていたのに、 「行列構造体」ではrotZ*rotX*rotYにしていたことですね。 (というか、それはO…
操作方法は昨日と同じです。 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が分かってきたような、分からないような…(∀`; とりあえず、境界球判定を行うサンプルを。 赤ボールの移動 Z・Xキー:X方向への移動 A・Sキー:Y方向への移動 Q・Wキー:Z方向への移動 カメラの移動 ↑↓キー:X軸回転 ←→キー:Y軸回転 ソース…
これも、全然なんてことはないですが、あると便利なクラス。 1.enemy # 敵のタイプ,x座標,y座標,z座標, # 一匹目 nomal,-10,0,-5, # 二匹目 nomal,5,0,20, # 三匹目 fly,-2,10,15,こんなファイルをリストに読み込みます。 ListLoader.h #pragma once #includ…
全然なんてことはないですが、あると便利なクラス。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パターンが必要になるのか? 例えばゲームを作ろうとすると、たいてい以下のような処理を書くことになります。 // メイン実行クラス class CMain { priva…
まだデバイス管理とシーン遷移管理しかないですが…。 Frameworkの外の部分が、実装するとこです。 CSceneResourceLoaderクラスは、 起動時に「Now Loading... 24%」みたいに、 画像ファイルやサウンドファイルの読み込み画面の表示です。 CSceneXXXクラスで…
はじめに ゲームには、 タイトル モードセレクト メインゲーム 結果 などのシーンがあります。 それらのシーンの遷移をオブジェクト指向で実現する方法を解説します。 シーンクラス まず基底となるISceneクラスを定義します。 /** * シーン基底クラス。 * コ…
最近、何時間もかけて更新しているので、 今日は軽めのネタで。 例えば、 テトリスやリバーシなどのパズルゲームや、 SLGやRPGでのマップなどを作る際には、 必ず2次元のフィールドが必要となります。 そういった場合に使える、汎用のフィールドクラ…
いよいよ最終回です(ようやく?) 今回はタスクシステムを発展させてみます。 C++におけるタスクシステム これまでは、タスクを「構造体」で定義していました。 ですが、せっかくC++を使っているので、 「クラス」で実装できないか?ということを考えてみま…
タスク同士の当たり判定 ここが超重要です。はいはいテストに出ますよー(何のテストじゃ) 例えば、ブロック崩し(こればっかですね)において、 以下のタスクがぶつかった場合、何らかのやり取りを考えなければなりません。 ボールvs壁 ボールvsパドル ボ…
タスクチェンジ タスクチェンジとは、実行関数ポインタの入れ替えを行うことです。 たとえば、シューティングゲームでは、敵の行動について、以下のパターンがあります。 初期処理 移動したり弾を撃ったりする 爆発処理 これらの処理を関数ポインタの入れ替…
ダミータスク タスクは双方向リストとなるわけですが、 先頭と末尾のタスクに「NULL」をいちいち設定するのは大変です。 ということで、先頭と末尾のタスクは、 ダミーとして空のタスクを用意しておきます。 これにより、タスクの追加・削除の処理が楽になり…
タスクシステムとは何か タスクシステムとは、 複数の「タスク」を並列実行する 仕組みのことです。 では、「タスク」というのは何かというと、 ゲームを構成する最小単位の要素 のことです。 例えば、ブロック崩しにおける、ブロックやパドル、ボールなどが…
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…
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…
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…
keim_at_Siさんの助言を元に、改造しました。 AB・AP BA・BP それ以外の場合は、n=(AB・AP)/(AB^2)⇒色=開始色*(1-n)+終了色*n う〜む、恐ろしいほどスッキリしてしまいました。 線形代数すばらしや…。 // =================================================…
dx=0のときとdy=0のときは別処理にして、 それぞれマイナスのときは、スワップしてフラグを立て、最後に反転させることで対応しました〜。 // 汎用グラデーション作成(開始座標取得ポインタ) int (*GetStartX1)(float a, float b, int j, int x); int GetS…
学校の宿題のグラデーション関数を作成。 開始点と終了点、開始色と終了色を指定して、 直線のグラデーションを作るだけですが、、。 たったこれだけに、5h程かかりました…ふい〜(´Д`; なんというか、数学の力がものすごく不足してますね…。(トホホ…。 /…
勢いに任せて、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++でのシングルトンをJavaと同じように書いてみたら、 コンパイルは通るけど、ビルドで落ちました…(´Д`; 小一時間悩んでも分からなかったので、ネットで調べたらこんなものが…。 http://www.01-tec.com/document/cpp_design_pattern.html#Singleton そう…
ゲームを作るときには、 マップデータ シューティングゲームの敵キャラの移動ルーチンスクリプト 当たり判定 敵のパラメータ サウンドON/OFFなどの設定ファイル といったものを、外部データにすることにより開発効率が上がります。 ということで、マップデー…
今更ながらC++でのクラスの使い方が分かったので、メモメモ。 virtual 関数名 = 0; とすると純粋仮想関数となり、そのクラスでは実装する必要がない。 純粋仮想関数を持つクラスは抽象クラスとなり、インスタンスを行うことができない。 基底クラスで関数にv…
変数の定義はどこでもできるので、 必要なときまでガマンして宣言するようにする。(Lazy Instantiation) それはスコープを明確にするためと、コンストラクタ引数を用意するためである。
複数クラスの共通処理の実体を1つにまとめることができる。 クラスの外からprivateメンバ変数にアクセスすることができる。