あー、9月だー(涙
なんというか、作業の進み具合が一向に好ましくないですわ……^^; プログラム打とうにも、あまりにメンドウでやる気でず… MIDIでBGMをアレンジしようにも、
一向にJazzの作り方が分からず、ノート打っては消しノート打っては消し……あぅあぅ……(涙
んで、本当にやる気がなくなると「東方妖々夢」などのゲームの開始…^^; えぅ〜…………
ちなみにですが、「東方妖々夢」やりまくってたおかげか、ついに隠しモードが出てくれました。
結構あっちこっちで話題になってたのですが、うちでは一向に出現してくれる気配が無かったのです。…しかし、よーーやく出てくれました。
…たまには Normal 以外のレベルもやってみるモンですね。
んで、いざ初プレイ。結果………………開始10秒で死亡。…………開始30秒で全滅。
……えと、某蜂シューじゃないんですが、まさしく「死ぬがよい」って感じでした。^^;
まぁとりあえず、今はボスまでいけるようになりましたが……途中ボム使いまくりなのよね〜……… あぁぁぁぁぁぁ………
あとは、夏コミで買ってきたICONOCLASMさんの「ぴた熱」「ぴた熱II」という作品を遊んでみたり。
遊ぶと同時にヘコむんですけどね…。^^; …というのも……実に音楽がいいんですよ……
なんというか、曲のつくりがキレイなんですよね〜。非常にやわらかいというか……。音色のチョイス・音色の作成も上手いし……ついでに、リバーブもキレイにかかってるし…………。あぁいいなぁ……
……まぁ、私が単純な音楽しか作り出せないというのが根本的な問題としてあったりますが…… あぁ…自分だめぽ……
はぁ……もっとがんばらないとなぁ…………… =■●_
う〜ん…Jazzアレンジが形になってきたような気がしないでもない……。とはいえ、やっぱりどうやってアレンジを進めていけばよいかわからん状況は全く変わってないんですが。^^; あぅ〜…
…と、今日もこれだけで、1日のすべて語ってしまいました。^^; …というわけで、弾幕のお話。 あ、いやゲーム自体の話じゃないデスよ。(笑
東方やって、プログラム的にいろいろと思う事は在るんですが、今回はその中のひとつ「弾幕のプログラミング設計」について、ちょっと考えてみたいと思います。
敵の弾の動くパターンってのは「プレイヤーに一直線」とか「軌跡を描きならが」とか「ランダムに一直線」とか、いろんな動きをします。
こういうすべてのパターンをプログラミングするとき、どういう方法が最適かな〜。と考えるのです。
まぁ、最初に思いつくのが「インターフェース(もどき)を継承する」という形でしょうか。
// EB = Enemy Bullet …あってるか?(爆
class I8EB
{
static list<I8EB*> s_stlBulletList;
protected:
I8EB(); // コンストラクタ内部で、s_stlBulletList に this を登録
public:
virtual ~I8EB();
virtual HRESULT Compute();
virtual HRESULT Draw();
static void CallCompute(); // 登録したオブジェクトの Compute関数を全て呼び出す。
static void CallDraw(); // 登録したオブジェクトの Draw関数を全て呼び出す。
};
// ある方向に一直線
class C8EB_Fix :
public I8EB
{
public:
C8EB_Fix(const D3DXVECTOR2& v2);
~C8EB_Fix();
HRESULT Compute();
HRESULT Draw();
};
// プレイヤーの方向に一直線
class C8FB_FixPlayer :
public I8FB
{
public:
C8EB_FixPlayer(C8Player* pcPlayer);
~C8FB_FixPlayer();
HRESULT Compute();
HRESULT Draw();
};
// 使用する。
HRESULT TestMakeEB()
{
new C8EB_Fix(D3DXVECTOR2(1, 0)); // 右一直線に飛んでく弾
new C8EB_Fix(D3DXVECTOR2(-1, 0)); // 左一直線
new C8EB_Fix(D3DXVECTOR2(0, 1)); // 下
new C8EB_FixPlayer(g_pPlayer); // プレイヤーに向かって。
// (というか、グローバルに在るのかよ。^^;)
return 0;
}
HRESULT TestDrawEB()
{
I8EB::CallCompute();
I8EB::CallDraw();
return 0;
}
単純にしてしまえば、こんな感じになりますか。
ただ、この場合の問題点は「弾幕のパターンが多くなると、作るクラスも必然的に多くなってくる」という点でしょう。
パターンの数だけクラスを作成する必要がありますからね。なもんで、ファイル数がとんでもなく多くなってきます。これでは、管理がちょっとメンドイ。
なもんで「他に良い手はないかなぁ〜」とか思ってみて、次のようなことを思いついてみるわけです。
typedef enum enu8EnemyBulletType
{
EBT_Fix,
EBT_FixPlayer,
EBT_TypeMax
} E8EBT;
class C8EnemyBullet
{
public:
typedef HRESULT (C8EnemyBullet::*tComputeFuncPtr)();
private:
static tComputeFuncPtr s_afnComputeFuncPtr[EBT_TypeMax];
static list<C8EnemyBullet*> s_stlBulletList;
tComputeFuncPtr m_fnComputePtr;
private:
HRESULT ComputeFix();
HRESULT ComputeFixPlayer();
public:
C8EnemyBullet(const E8EBT eType, const D3DXVECTOR2& v2 /* 色々云々*/);
~C8EnemyBullet();
HRESULT Compute(){ return (this->*m_fnComputePtr)(); }
HRESULT Draw();
static int InitStatic();
};
C8EnemyBullet::tComputeFuncPtr C8EnemyBullet::s_afnComputeFuncPtr[EBT_TypeMax];
list<C8EnemyBullet*> C8EnemyBullet::s_stlBulletList;
/////////////////////////////////////
C8EnemyBullet::C8EnemyBullet(const E8EBT eType, const D3DXVECTOR2& v2 /* 色々云々*/)
{
m_fnComputePtr = s_afnComputeFuncPtr[eType];
s_stlBulletList.push_back(this);
}
int C8EnemyBullet::InitStatic()
{
s_afnComputeFuncPtr[EBT_Fix] = ComputeFix;
s_afnComputeFuncPtr[EBT_FixPlayer] = ComputeFixPlayer;
return 0;
}
こうする事と、いくら弾幕パターンが増えようと C8EnemyBullet クラスだけにメンバ関数を増やして、
enu8EnemyBulletType に、パターン名を増やして、InitStatic() でその関数をリスト中に登録してあげるだけで良い事になります。…まぁ、一見激しくメンドウに見えますが
実際は結構良いんじゃないかな〜とか思ってみたり。まぁ、実際にやってみた事は無いので、プログラミングのしやすさが どれぐらいなのかは分かりませんが…^^;
とはいえ、これだと「演出のバリエーション」が増やしづらいという欠点があります。
弾幕自体のテクスチャ(への云々)をメンバに1個持たせるのは必需事項ですが……
もしかしたら、ある弾幕パターン(以降 "弾幕X" とする)は「弾幕発生時に、もう1枚テクスチャを使用し演出をして登場」とか考えられます。この場合、更にそういう情報を格納するメンバ変数が必要になりますが、
"弾幕X" 以外の弾幕パターンの場合は、そういう情報は必要ないわけです。
なもんで、たった1つの弾幕パターンのために、メンバ変数を1個増やすのもどうかな〜って思ってみたり。
…となると、やっぱり、最初の「インターフェースを継承する」って設計のほうがいいのかなぁ……。と、フリダシに戻ってみたりするわけで…。
…プログラミングなんてこんなもんサ。
なんだか最近、生活スタイルがとんでもない事に……。9時就寝17時起床という日々………。ほとんど太陽見てないんですけど。
そんなマズイ生活を送っている今日この頃ですが…緊急事態が発生しました。HDDの空きが足りません!^^;
現状では、40GB+80GB=120GBという構成です。「120GBなんてつかわないだろ〜」とか思っていたんですが、Winodwsに「ディスクの空き領域が足りません」と報告された時にゃぁ、びっくりしましたわ。^^; んで、
各ドライブ(8ドライブある)の空き状態を調査してみたところ、一番空いていたドライブは「空き(GB)/総容量(GB)」として「6.4/23.6」。
一番空いてないドライブは……「0.2/25.0」……ヤヴァイって。^^;
…何でこんなに使ってるんだ?と、当人でも思うわけですが、調べてみると……
…もうだめぽ。
そうか…ネットで拾ってきたムービーが結構食っていたんやねぇ……。ゲームもインストールしすぎだなぁ……ほとんどクリアしてないし。
…つーか、いつの間にメイドさん・巫女さんとかの画像がこんなに増えましたか。
なんというか、日々の1枚1枚拾ってきた積み重ねが物を言うんだなぁ…うんうん(注:プラス思考)
あーっと、自分の名誉のために言っときますが(笑)、プログラミングソース関係(中間ファイル含む)も 約1.6GB あった事をお伝えしておきます。
いろきゅうお兄ちゃんはがんばっているのよぉぉぉぉ〜〜〜〜!!(名誉挽回台無し)
(ちなみに、思わずごにょごにょとお茶を濁してしまう、巨大なファイルもあったりしますがその辺は割愛:笑 ^^;)
さて、明らかにHDDに在ってもどうしようもないファイルがたくさんあることが判明したので、焼きます。 CD−Rに焼きます。おそらく、ファイル総数を合計すると2ケタ台のGB単位を焼く事になるでしょうが、それでもDVD−RじゃなくてCD−Rに焼きます。つーか、DVD−Rもってねぇよぉぉぉ!(涙 …でもいいんです。焼かなきゃいけないファイルの中で、700MBを超えるファイルは存在していない(と思うの)で、地道に焼いていけば言いだけの話です!
ってことで、現在この日記を書いている時も、ヨコでは一生懸命せこせこCD焼いてるサブマシンがいます。 …が、焼きスピードが x4 なため、1枚焼くのに偉い時間かかるんですよね……^^; というのも、 焼きソフトである WinCDR のウラでは、VirtualPC が 一生懸命 VineLinux 2.6 をインストール中なもんで……。 ちなみにこのサブPC、Pen2-400MHz だったり………
………もうだめぽ。
昨日ファイル整理を開始したわけですが、いやはや
やり始めると、とことんファイルの整理に集中しちゃいまして、今日1日ファイルの整理を主体にあれやこれややってた様な気がします。^^; とはいえ、
まだ整理しなきゃいけないファイルってのはたくさん残っているんですけどね…。あと3GBほど。^^;
これが全部圧縮ファイルだからたまらない…。中身をみて何かを判断して仕分けして焼いて〜… って作業工程を踏まないといけませんからねぇ……ちとメンドイ。
で、話はここで大きく入れ替わるのですが、昨日の日記の最後の方に書いたとおり、 VineLinux 2.6R1 をインストールしてみました。Pen2-400上で動くVirtualPCマシンに。 なんで、突然 Linuxなのかというと……
という2つの理由があります。
そもそも、Linux いじれるとネットワーク関係で結構遊べるようになりますからね。
Webサーバー立てて遊ぶときなんかの自由度なんてのは、窓よりLinuxの方があるでしょうし(多分)。
てなわけで、Linuxをいじろうと思った次第であります。
…まぁ、いいかげん窓でhttpサービスするのを卒業したいってのもありますけど。^^;
んで、無事インストールが完了して起動できるようになりました。ログイン画面が出るまで5分ぐらい待ちますケド。
IDとパスいれてログオンしてからも1分ぐらい待たされます。…まぁでも、今は試用してる段階なのでこの程度のスピードであっても問題ないんっすけどね。
…と、ログイン後の処理も終わった様子。
………………
んで、何すればいいんだ?
あくまで窓出身(Win95からの人)。何がどこでどうすればどうなるのかが全くわからん……^^; 学校で、たま〜に使う程度だからなぁ……。 とりあえず、ネットワークがどうなってるかわからんので、適当に VirtualPC のホストPCのIP 192.168.0.1 へ ping を打ってみる……
送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません 送信元 192.168.0.100: 目的のホストへ届きません
……ネットワークがの設定が出来てないご様子。んじゃぁ、とりあえず、ifconfig してLanカードの情報見てみよう。 まぁ、情報見ても対策なんてのはわからんのだろうけど、とりあえずってことで。"ifconfig" っと。(カタカタカタ…ぱんっ)
な、なんだってー!?
ifconfig が無いって……。どうやって情報見ろと? Linux入門者な私は、ifconfig コマンドぐらいしか知らんぞ、おぃ……^^; つーか、これからどうしたらえぇんじゃ……………わ、わかんねぇ……
VineLinux 波乱の開幕のヨカン。=■●_
9月7日に開催される即売会 [ 帝国メイド倶楽部 ] に行った後、アキバに行く予定だからそのとき Linux入門本でも買ってこよう……
う〜ん…どうも最近、日記を書く時間が次の日の06:00ぐらい (つまり、今回は 6日の06:00)という日々が続いてるなぁ……^^; これ、日記っていうんかなぁ………?
さて、今日はずっとMIDIデータ打ち込んでました。具体的にはこんな感じ。
ちまちま…
ちまちま…
ちまちま…
ちまちま…
ちまちま…
ちまちま…
ちまちま…
ちまちm(以下エンドレス)……
メンドイねんっ!!(/´Д`)/⌒┻┻
私は楽器弾けないエセ音楽家ですから^^;、マウスでひとつずつデータを入力していくしかないんですよぅ…。
これがキーボーディストとかだと、演奏した情報を録音(というか"録データ")して、MIDIデータ入力していく方法が取れるのですが……。 あー、マウスだとえらいメンドイ〜。^^;
まぁ、入力方法はコレしかないんだから、一つ一つせこせこ入力していくしないんですけどね………
話は微妙に変わって、今やっているJazzアレンジ。ちょっとノってきました。 MIDIデータ編集していて、なかなか面白くなってきました。 こう面白くなってくると、同時にやる気も出てくるわけで、作業も前よりかはスピードアップしてきます。で、困った事に
ふぃふぽんのソースコードも打ちたくなってきました。
プログラミングと曲アレンジ同時進行は辛いよ……=■●_
あ、ツールチップとかも作らないと………
さて、ネット回ってて知ったのですが、今日は "妹の日" らしいですよッ!! いや〜、実にいい日だ。(笑
折角なので、妹にまつわる話でも。
その昔、ホントに昔…1年以上前の話。大学の友人 こばやかわむぅ氏 と会話していたときの発言。
「いや〜、シスプリってさ、12人も特徴がある子がいれば、野郎は必ずどれかしらにゃ〜引っかかるわなぁ(笑」
…この発言はつまり、こういうことなんだと思います。
using namespace std;
typedef enum eun8MySister
{
MS_Karen, // かれん
MS_Kaho, // かほ
MS_Mamoru, // まもる
MS_Sakuya, // さくや
MS_Hinako, // ひなこ
MS_Marie, // まりえ
MS_Sirayuki, // しらゆき
MS_RinnRinn, // りんりん
MS_Tikage, // ちかげ
MS_Haruka, // はるか
MS_Yotuba, // よつば
MS_Aria, // ありあ
MS_Max, // 妹の人数
} E8MySister;
/*--------------------------------------------*
*
* ここが重要!
*
*--------------------------------------------*/
int DispMySisterCall(const E8MySister eMySister)
{
// ● 各妹たちに分岐する!
switch(eMySister)
{
case MS_Karen: cout << "お兄ちゃん♪" << endl; break; // かれん
case MS_Kaho: cout << "おにいちゃま〜!" << endl; break; // かほ
case MS_Mamoru: cout << "あにぃ!" << endl; break; // まもる
case MS_Sakuya: cout << "お兄様っ!?" << endl; break; // さくや
case MS_Hinako: cout << "おにいたま〜♪" << endl; break; // ひなこ
case MS_Marie: cout << "兄上様っ。" << endl; break; // まりえ
case MS_Sirayuki: cout << "にいさまっ〜★" << endl; break; // しらゆき
case MS_RinnRinn: cout << "アニキ!" << endl; break; // りんりん
case MS_Tikage: cout << "……兄くん…" << endl; break; // ちかげ
case MS_Haruka: cout << "兄君さまっっ!" << endl; break; // はるか
case MS_Yotuba: cout << "兄チャマっ!" << endl; break; // よつば
case MS_Aria: cout << "に〜い〜や〜……" << endl; break; // ありあ
default: // 12人の妹達に引っかからなかった場合
cerr << "おまいは、人間じゃねぇっ!!!" << endl;
*((char*)(void*)0xcdcdcdcd) = 0; // 不正な処理である。(ぉ
}
return 0;
}
こんな感じ。(笑
こうやって、各妹達に分岐するわけです。妹達に分岐しない場合は「不正な処理の発生」っと。(笑
いやぁ、すばらしい…すばらしいよ、シスプリはっ!!(ぉ
そういえば、今日メディアワークスから シスタープリンセス2 PREMIUM FANDISC の広告 兼 予約券 が郵送で届きました。 が、 広告中に白雪がいなかったので買いません。(ぉ …というより、本当は ゲームのシスプリなぞやったことないし、そもそも 激しくシスプリのファンってほどでもないし、根本的にお金無いしってことで、 買いません。 えぇ、買いません。 いや、本当に買わんってば!^^;
てなわけで、妹の話で1日分が過ぎてしまいましたが ^^;、今日はここまで。
明日は 帝国メイド倶楽部 だから早く寝るのだーーー!!
…そういえば、またTOPに書いてあること裏切っちゃったな…^^;
この分の日記は、諸事情により「8日分」に結合されました。というわけで、次のページへGo!