スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

iPhoneアプリアイコンの作り方 (というか、サイトの紹介)

iPhoneアプリを開発する際、アプリのアイコンを作る必要があるのですが、
実はこれ、色々とサイズ指定があるようなのです。
-----------
57×57
114×114
72×72
144×144 
-----------
など。詳細は下記参照。

【参考URL】Technical Q&A QA1686
※どうやら、iPhoneだったらこれ、iPadだったらこれ、というように
端末ごとに適切なサイズで作ってくれと言っているようです。


で、そんな複数のアイコン画像を作ってくれるのが、
Makeappiconというサイトです!
【参考URL】Makeappicon


~やり方~
【1】サイト中央に画像をドロップする、
   または「or click this button to upload」をクリックして画像選択
【2】Baking…の画面が出るので、しばらく待つ
【3】任意の画像を右クリック→「名前を付けて画像を保存」を選択


↓こんな感じで表示されます。
【参考画像】
MakeAppIcon.jpg




実際に自分のアプリにアイコン画像を設定してみた図 ↓
※サイズは144×144にしたら表示されました。

※アイコンをpng以外の画像形式(jpgとか)した場合は、
適切なサイズでもipaファイル作成する際にエラー発生

512×512のpng画像だと、ipaファイルは作成されるものの、
アイコンが真っ白(画像なし)という状態
になりました。

なので、FlashBuilderでアプリ開発をしていて
アイコンがうまく設定されない場合は、
画像形式と画像サイズを修正・確認すると良いかも。

【参考画像】
MyApp1.jpg
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

ジャンプ13号感想

●めだかボックス
言彦を倒したと思ったら、まだ何かありそうですね。

まぁ、このまま終わっても、
ほぼ全員 死んでいる状態なので、
その死んでいる状態から生きている状態にする為の展開だと思う。
(流石に博士が復活して、「俺を倒してみろ」みたいな展開にはならんだろう)

博士の舌には「遺」と書かれている事からして、
「遺言使い」か何かなのだろう。

■どんな能力?
【1】死んだ時に発動。何かを言葉で残す事が出来る。
【2】死んだ時に発動。「スタイル」の能力が、誰かに伝授される。
【3】死んだ時に発動。何らかの「スタイル」の能力が発動する。


こんくらいしか思いつかない。

【1】は、流石に意味が無いので、
【2】か【3】かな、と。

例えば、死んだ際に「童謡使い」が発動し、
生きている状態まで自動的に戻る
、など。

個人的に【3】ではないかと思う。
「童謡使い」が発動して、ひとまず博士が
喋って動ける状態になる
と予想。


●トリコ

nitoro.jpg


こんな感じで、まず敵が死ぬと一瞬思ったのですが、
そんな事はなかった。

ニトロめ、意外と言う事を聞きおる。
「料理人を殺さず捕まえろ」という指示に関してはガン無視してるけど)


で、謎の第三勢力についてですが、
どうも、美食會と美食屋のパワーバランスを調整しているっぽいですね。

美食會と美食屋の力量差をほぼ互角にする事で、
多くの戦死者を出させ、弱り切った所
を、第三勢力が襲う、
という計画でも立てているのかもしれぬ。

もし、そういう展開になるのであれば、
最終的に美食會 And 美食屋 VS 第三勢力 の図式が出来ます。

その際、一龍 と 三虎 が和解するかもしれない。


●食戟のソーマ
何か女性陣が無駄にドロドロとしてたような。
こんなの見たくないよ。
(まぁ不要な「可愛らしさPR」は腹が立つかもしれない。)

で、もう早速 主人公勝ちフラグが立ってますね。
多分 来週あたり何故か全裸になるのでしょう。

個人的に、イクミさんだけではなく、
会場全体が全裸になってしまいそうな気がする。
(司会者とか、イクミさんの料理の匂いだけで影響を受けてたし)


●ニセコイ
大人の階段をのぼっていない事が分かり、
歓喜する小野寺さんが良かった。

まぁ、大人の階段なんて、別にのぼらなくても良いと思います。
どこかのカタカナ2文字くらいの女性も、
大人になるのは悲しいことだとか言って
ましたし。

しかし、肝心の10年前の約束の相手はいったい誰だったのか。
また、どういう終わり方をするのか想像がつかない

全員ハッピーエンドで終わらせる為には、
もう、一条楽さんが4人に分裂するしかないような気がする。


●暗殺教室
イトナ君はキレてしまったので休学になりました。


しかし、気になることが。
イトナ君は、ようするに殺せんせーを殺害する為に作られた兵器です。

つまり、殺せんせーを殺害できればOKなので、
生徒としての体裁を考えて
休学にする必要があるのか不明
です。
(暴走を傍観しておいて、イトナ君が殺せんせーを殺害できるか
                      確認してても良かった)


建前として、「授業を受けられる精神状態ではない」と言っているが、
本当の理由は、「あのまま暴走すれば、触手が壊死する」といった、
兵器としての観点において、休学を申し出た
のではないか、と思う。


●クロス・マネジ
この漫画は恋愛をメインに描きたいのか、
部活動をメインに描きたいのか、いったい何なのか。

どうも迷走しているような気がするなぁ。

思ったんですが、女性部員から「エロでく」とか言って
虐げられてるからダメ
なんですよ。

着替え中に入ったから全部員からの印象が最悪になった、という展開が
そもそも要らなかった。

普通に「最弱のチームなんだけど、マネージャーよろしくお願いします!」
みたいな展開にすれば良かった
と思う。

そういう仲の良い状態だったら、最近の恋愛のような展開も活きてくると思うし。

現状は、最初毛嫌いしてたのに、なにゆえ恋愛のような感情が生まれてるの?
という印象しか出てこない。

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

ローグライクゲームを作ってみよう!  その7 ~生成システム~

まず、現状報告
--------------------------------------------
・アプリ開発
・3Dゲーム開発
・2D(日本語パズルのやつ)ゲーム開発
・ローグライクゲーム(解説用)開発

--------------------------------------------
上記を同時進行してます。
やる事が沢山あると、作業がなかなか進まないものですね。


とりあえず、ローグライクの解説を始めます。
今回やるのは生成システムです。

DXライブラリだと、画像を読み込ませたらint型のハンドルを取得すると思うのですが、
これ、関数ごとにバラバラに取得してたら管理がゴチャゴチャになります。

(DXライブラリの場合は、DxLib_End()関数で自動で解放処理をやってくれるので良いのですが、
全部DirectXとかで実装しようとすると、間違いなく開放忘れが出てくるだろう。)

なので、今回は
------------------------------------
・オブジェクトの生成
・生成したオブジェクトの管理

------------------------------------
に焦点を絞って解説していきたいと思います。


まず生成について。
-------------------------------------------------------------
【1】IFactoryクラスを定義。 (Factoryクラスのインターフェース)
【2】IFactoryクラスを継承した、Factoryクラスを定義

-------------------------------------------------------------

やるのは上記だけです。簡単ですね。

【1】IFactoryクラスを定義

#pragma once
#include< vector >

enum FactoryID {
FACTORY_TEXTURE,
FACTORY_DRAWER
};

class IFactory {
public:
IFactory();
virtual ~IFactory();
static int Create( FactoryID t_ID, std::vector< int >& t_ParamVec );
virtual int CreateObject( std::vector< int >& t_ParamVec ) = 0;
void ChangeIntToStr( std::vector< char >& t_CharVec, std::vector< int >& t_ParamVec, int t_OffSet, int t_StringNum );
private:

};

int IFactory::Create( FactoryID t_ID, std::vector< int >& t_ParamVec )
{
int result = -1;
CTextureFactory t_TextureFactory;
CDrawerFactory t_DrawerFactory;

switch( t_ID ){
case FACTORY_TEXTURE: result = t_TextureFactory.CreateObject( t_ParamVec );
break;
case FACTORY_DRAWER: result = t_DrawerFactory.CreateObject( t_ParamVec );
break;
default:break;
}

return( result );
}

ここでポイントは2つ。

■一つ目。
IFactoryの方では、CreateObject関数を純粋仮想関数にしています。

つまり、IFactoryクラスを継承してCTextureFactoryクラスを作った場合、
必ずCreateObject関数を定義して、この関数でテクスチャを生成
してね、
と言っている訳です。

■二つ目。
IFactoryクラスには、staticなCreate関数があります。
これは、"何か"のオブジェクトを作成したいときに使います。

"何か"というのが重要です。

つまり、IFactory.hさえインクルードすれば、
テクスチャだろうが描画オブジェクトだろうが生成できる

という事です。

#include"IFactory.h"

int WINAPI WinMain(//省略){
IFactory::Create( FACTORY_TEXTURE, t_ParamVec ); //テクスチャ作成
IFactory::Create( FACTORY_DRAWER, t_ParamVec2 ); //描画オブジェクト作成
}


もし、IFactoryというインターフェースが無ければ、
下記の様に各Factoryクラスのヘッダをインクルードしなければならず、
かなり面倒くさい事になります。

#include"CTextureFactory.h"
#include"CDrawerFactory.h"


int WINAPI WinMain(//省略){
CTextureFactory t_TextureFactory;
CDrawerFactory t_DrawerFactory;

t_TextureFactory.CreateTexture( t_ParamVec ); //テクスチャ作成
t_DrawerFactory.CreateDrawer( FACTORY_DRAWER, t_ParamVec2 ); //描画オブジェクト作成
}


更に、フォルダ構成を変えた場合は、
下記の様にファイルパスを全部書き換えなければならないですし、
【変更前】 #include"CDrawerFactory.h"
【変更後】 #include"../Factory/CDrawerFactory.h"


また、Factoryクラスの名前を変えたら、
その変更も反映させないと行けません。
【変更前】 #include"CDrawerFactory.h"
【変更後】 #include"CDrawerFactory2.h"


なので、絶対不変であるIFactoryインターフェースを定義しておき、

WinMainなどからは、Factoryクラスの内部仕様が変更されようが、
IFactory.hを読み込んでIFactory::Create関数を
呼び出せば、どんなオブジェクトであれ生成出来る
という風にしたのです。

※DxLib.hさえインクルードすれば、
 LoadDivGraph関数だろうがSetWindowSize関数だろうが使える、というのに近い。


次に、オブジェクトの管理。

オブジェクトの管理は、
・Factoryクラスが、対応するManagerにオブジェクトを登録
・Managerクラスはシングルトンパターンになっており、
 プログラムが終了するまで、オブジェクトを保持する。

・任意のタイミングで、オブジェクトを削除したい場合は、
 各Managerクラスの削除関数を呼ぶ。

という風になってます。

※Singletonパターン … 必ずオブジェクトが一つのみ生成される事を保証する。
             2つ以上は生成されない。


Singleton(シングルトン)についてですが、
自分は自作したテンプレートのSingletonクラスを使用しています。

細かい原理の説明はしませんが、
とりあえず、Singletonパターンにしたいクラスがある場合、
------------------------------------------------
【1】CSingleton.hをインクルード
【2】CSingleton<クラス名>を、publicで継承する
【3】CSingleton<クラス名>を、friendに指定する。

------------------------------------------------
とすればOKです。


例:CTestクラスをSingletonパターンにしたい場合。
#pragma once
#include"CSingleton.h"

class CText : public CSingleton< CTest > {
friend class CSingleton< CTest >;
public:
CTest();
~CTest();
int MyFunc();
};

ついでに、使用する場合。
CTest& t_Test = CTest::getInstance();
t_Test.MyFunc();

(getInstance関数で、インスタンスへの参照が返るので、それを受け取る。)


最後に。
今回のソースコードは下記になっています。
だんだん量が増えてきましたね。

■Base
■Factory
┃┣CDrawerFactory.h
┃┣CDrawerFactory.cpp
┃┣CTextureFactory.h
┃┣CTextureFactory.cpp
┃┣IFactory.h
┃┗IFactory.h
■Manager
┃┣CDrawerManager.h
┃┣CDrawerManager.cpp
┃┣CTextureManager.h
┃┗CTextureManager.cpp
■Resource
┃┣CDrawer2D.h
┃┣CDrawer2D.cpp
┃┣CDrawerBase.h
┃┗CDrawerBase.cpp
■Support
 ┗CSingleton.h

main.cpp


あ、そうだ。
画像読み込みの補足説明をしておきます。

画像を読み込む場合、ファイル名をint型に変更してパラメータとして渡し、
Factoryクラス内で、また文字列に変換して画像を読み込んでます。


■変換の図
grade.jpg → 103,114,97,100,101,46,106,112,103 → grade.jpg

何でこのようにするかというと、
下記の様に、全部int型のvectorを引数にしてオブジェクトを生成したいからです。
IFactory::Create( FACTORY_TEXTURE, t_Vec );

また、全部int型にしておくと、外部ファイル化して、Loaderクラスを作った時に便利になります。
これについては、次回 解説します。


■サンプルのソースコードについて。
Enter … 描画順変更
「→」キー … 特定の描画オブジェクトを非表示に変更
「←」キー … 特定の描画オブジェクトを表示に変更


上記の動作を行う様にしています。
また、画像を回転、拡大縮小、半透明表示などに対応させています。

※不具合があったら適宜修正します。

【ソースコード】 http://rudora3.web.fc2.com/RogueSample2.zip

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

ジャンプ12号感想

●暗殺教室
おっと、これは良くないですね。

ルールの抜け穴を利用するならまだしも、
露骨なルール無視をしてきました。
( リングの外に足が付いたらその場で死刑、という約束だったというのに。 )

自分(達)で定めたルールを、
自分(達)が守らない
とか、もう意味不。

クラスメイト達は、イトナ君の頭めがけて
対殺せんせー弾とかを撃っても良い
と思う。


●新米婦警キルコさん
なんか、若干方向性が分からなくなってるような気がする。
(物語的な)

やっぱりストーリーの軸はあった方が良いのかなと思う。
事件の発生率、検挙率の目標を決めて、その目標に対する推移を描写する、とか。

日常パートでも良いかな、と思いましたが、
あんまり日常過ぎると警察官という題材が全く無意味になるような気がした。

なので、
-------------------------------
・守るべきものの明示
・犯罪者の登場
・キルコ達が犯罪者に立ち向かう

-------------------------------
という感じにすると良いのかなと。

例:犯罪者が子供たち(幼稚園児)を誘拐。キルコ達が救出に向かう。

あと、せっかくトンファブレードがあるのだから、
必殺技の一つや二つ用意しても良いかなと思う。

トンファブレード奥義 -其の七- :「●●●!!」  とか。

<追記予定!>

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

FlashBuilderで、iPhoneアプリを作成したぞ!

とりあえず、FlashBuilderでiPhoneアプリを作成
することが出来ました!

まぁ、本当にアプリ(ipaファイル)を作成しただけなので、
ゲームとしての体裁もなってない
のですが、

ひとまず実機での動作を確認出来ました!(`・ω・´)

【参考画像】
MyApp.jpg

(自分の端末にインストールして、アプリを実行してみた図)


さて、あとは中身を作りこんでStoreに公開するだけですよ…!

ディベロッパプログラムの購入や証明書の作成(pem形式からp12形式への変換とか)、
プロビジョニングプロファイルの作成 などの解説記事

内容をまとめて書きたいと思います!

もろもろお楽しみに\(`・ω・´)ノ +*

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

ジャンプ11号感想

まさか三連休の最初の日に発売されているとは。

※火曜日にジャンプを探してみたが、
近くのコンビニはジャンプ売り切れ状態でかなり焦った。

博多駅東には、「book select k」という、
(パッと見) 利用者が少ないものの、そこそこ広さのある書店が存在するので、

「ここならあるだろ」と店内を調べてみたら、ありました。良かった。


●ワールドトリガー
まだまだ序盤なので、これからが楽しみです
SFとの事なので、どんなストーリー展開になるのか期待!

※葦原先生は、王道から外れた予想外の展開とかを結構する印象がある為。
 今回もメガネの男性がトリガー使いだったという展開が面白かったです。

●暗殺教室
イトナ君の触手を見て、殺せんせーが第一話以来のド怒り顔に。
過去にいったい何があったのだろう。 バトルの展開とともに考察してみる。


■バトルについて
バトルのルールはこうである
=======================================
1) リングの外に足が付いたら死刑
2) 観客に危害を加えた場合も負け (死刑?)

=======================================

まず、このバトルにはいくつか抜け穴がありますね。

例えば、1番目のルールですが、
下記の様なことをしても、ルールには抵触しません。
・リングの外に足ではなく、"頭"を付く
・空中飛行して、リングの外へ出る。
・"リング"の形を変形させて、リングの大きさを変える


「生徒には危害を加えてはいけない」という、
先生をやっていく為のルールも背負っている
殺せんせーとしては、
リング変形が一番有効かもしれません。 ↓

【参考画像】
ansatu.jpg
(殺せんせーなら、マッハで机の並びを変える事ぐらい、朝飯前だろう。)


次に2番目のルールですが、
観客の行動は制限されていないので、下記を行ってもルールに抵触しません。

・観客が、イトナ君を攻撃する
・観客が、殺せんせーをかばう


例えば自立思考固定砲台さんがイトナ君を攻撃したり、
また、別の誰かが殺せんせーの前に立ちはだかり、
イトナ君の攻撃が当たって
しまえば、ルール違反で殺せんせーの勝ちです。

既に圧力光線とかいうチート兵器を相手が使用しているので、
生徒たちが殺せんせーの補佐をしたとしても文句を言われる筋合いは無いでしょう。


■殺せんせーの過去について
=======================================================
・瀕死の人に、「この触手があれば、立派な教師になれる」みたいな事を言われる
・昔は(おそらく)人間だった
・触手により、誰かを殺された?
・救世主となるつもりが、地球を破壊する化け物という存在になってしまった

=======================================================

まだまだ謎が多いですが、
過去に何らかの研究機関に居たのは間違いなさそうである。

【ただの推測】
------------------------------------------------------
【1】月に存在する研究機関に、触手を持った存在(宇宙人?)がやってくる
【2】研究員などが殺される
【3】その宇宙人に対抗すべく、宇宙人から切り落とした触手を、
   瀕死の男性に移植 (=殺せんせー)
【4】宇宙人を殲滅する為、月を丸ごと破壊せざるを得なかった
【5】地球が存在する事により、何らかの不都合が発生するので、
   地球も破壊せざるを得なくなった

------------------------------------------------------

こんな感じなのだろうか?と思った。
そういえば殺せんせーの服の中身ってどうなってるの?という展開がありましたが、

上記の推測が正しいとすると、殺せんせーは、
服の中(胴体)の部分は人間の体になっていて、手足だけ移植された触手になっている
と思われます。



<追記予定!>

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

ローグライクゲームを作ってみよう!  その6 ~描画システム~

今までソースコード一つのみの、サンプルを公開してきたわけですが、
やっぱり複数のソースコードに分割した方が良いと思ったので、

根本の描画システムの構築方法を解説していきます。
※あくまで自分の実装方法なので、参考程度に。


まず、力技で実装した場合、
下記の様なプログラムになっているかもしれません。
while(//省略 ){
MovePlayer();
MoveEnemy();
DrawPlayer();
DrawEnemy();
}
※whileの中が、ゲームループとする。

これは良くない構造です。

■理由
・敵が居なくても、とりあえずMoveEnemy関数 / DrawEnemy関数が呼ばれる
・主人公が居なくても、とりあえずMovePlayer関数 / DrawPlayer関数が呼ばれる
・描画順を制御できない


3番目が特に致命的ですね。

敵⇒主人公 という描画順から、主人公⇒敵という描画順に変更したい!
という場合、まともな対処方法がありません。


※下記の様な実装でごり押しする事も出来ますが、止めた方が良いです。
(中規模、大規模なゲームでは、間違いなくフラグ管理とかがゴチャゴチャになる。)
while(//省略 ){
if( flag == 0 ){
DrawPlayer();
DrawEnemy();
}else{
DrawEnemy();
DrawPlayer();
}
}



という訳で、描画をまずリスト形式にします。
STLにlistというのがあるので、それを使いましょう。
※STL … スタンダードテンプレートライブラリの略。

プログラム内で、唯一の描画リストを定義しておき、
それに登録された描画オブジェクトを描画
という風にします。

【参考画像】
drawsystem1.jpg


で、描画リストで重要になってくるのが、
下記の3つの処理を、具体的にどう実装するのか?です。
--------------------------------------------------
【1】描画オブジェクトの登録方法
【2】描画オブジェクトの削除方法
【3】描画オブジェクトの描画順変更方法

--------------------------------------------------

まず【1】登録。
リストに登録と言っても、
先頭に追加、末尾に追加、リストの途中に追加の3種類があります。

これは、描画オブジェクトに優先度の変数を設けて対応します。

例えばこんな感じ。
class Drawer {
public:
Drawer();
~Drawer();
int GetPriority();
private:
int m_Priority;
};

int AddDrawer( Drawer& t_Drawer )
{
int result = -1;

for( it = m_DrawerList.begin(); it != m_DrawerList.end(); it++ )
{
if( it->GetPriority() > t_Drawer.GetPriority() ){
m_DrawerList.insert( it, t_Drawer );
result = 0;
break;
}
}
//登録されなかったら末尾に追加
if( result == -1 ){
m_DrawerList.push_back( t_Drawer );
result = 0;
}

return( result );
}

※m_Priorityの値が小さいほど優先度が高い、とします。

何気に重要なのが赤字の部分です。
この処理が無いと、正常に描画オブジェクトが登録されません。

正常に登録されないのは下記の2パターンです。

【A】描画リストに、一つも描画オブジェクトが登録されていない場合。
【B】描画リストに登録されているものよりも、優先度が低いオブジェクトを登録する場合。


【A】について。
描画オブジェクトが登録されてなかったら、優先度の比較もクソも無いので、 
for文の処理自体がすっ飛ばされます。
なので、登録処理が行われません。

【B】について。
例えば、優先度1、2、3のオブジェクトが登録済みとします。
そこへ、優先度4のオブジェクトを登録しようとすると、

下記の様にif文の判定が順番に行われるのですが、
全部 成立しないので、結局 登録処理は行われずにfor文を抜けます。

1 > 4  //成立しない
2 > 4  //成立しない
3 > 4  //成立しない

まぁ、という訳で、
for文の方で登録が成立すればresultに0を代入しておき、
その後に、resultが-1のまま(登録が行われなかった)かどうかを判定して、
-1だったら、末尾に追加という処理をしておく必要があるのです。


次に【2】削除。

削除に関しては、これも
何らかの値を用意しておき、それを判別して削除する必要があります。


最初、下記の様に描画オブジェクトIDを用意して、
それを判別して削除してたのですが、


class Drawer {
public:
Drawer();
~Drawer();
int GetPriority();
int GetObjectID();
private:
int m_Priority;
int m_ObjectID;
};

//削除したい描画オブジェクトIDを渡す。
int DeleteDrawer( int t_ObjectID ) {
int result = -1;

for( it = m_DrawerList.begin(); it != m_DrawerList.end(); it++ )
{
//描画オブジェクトIDが一致すれば削除
if( it->GetObjectID() == t_ObjectID ){
m_DrawerList.erace( it );
result = 0;
break;
}
}
return( result );
}


描画リストにオブジェクトが200個登録されている場合、
最悪200回判定をしないといけない(効率が悪い)ので、
やり方を変えました。

~変えた点~
・描画リストに登録するオブジェクトを、参照数計測ポインタに変更
・描画リストに対応する、描画オブジェクト配列を定義
・描画オブジェクトを登録する際は、配列番号を指定
・描画オブジェクトを削除する際は、配列番号を指定
・描画する際に、描画フラグを調べて、フラグによって描画/削除を決定


文章だと分かりにくいですね。

例えば、優先度が4の描画オブジェクトを、
描画オブジェクト番号0番として登録する
とします。

すると下記の様に、描画リストと描画オブジェクト配列の
参照数計測ポインタが、メモリ上の同じ描画オブジェクトを指す
ようになります。

【参考画像】
drawsystem2.jpg

このようにしておけば、
削除する際は、描画オブジェクト配列を介して描画フラグを変更するだけで、
一発でオブジェクトの削除(描画終了フラグのセット)が出来ます。


//削除したい描画オブジェクト配列の添え字を渡す。
int DeleteObject( int t_VecNum )
{
int result = -1;

//添え字の値が正しいかチェック
if( t_VecNum >= 0 && ( int )m_DrawerVec.size() > t_VecNum ){
//ポインタがNULLではないことを確認
if( m_DrawerVec[ t_VecNum ] != NULL ){
//描画終了フラグをセット
m_DrawerVec[ t_VecNum ]->SetDrawFlag( DRAW_DELETE );
result = 0;
}
}
return( result );
}

void Draw()
{
for( it = m_DrawerList.begin(); it != m_DrawerList.end(); )
{
//削除フラグが設定されていれば削除
if( it->GetObjectFlag() == DRAW_DELETE ){
it = m_DrawerList.erace( it );
}else{
//そうでなければ描画
it->Draw();
++it;
}
}
}




最後に【3】描画順の入れ替え

描画順を入れ替える場合は、下記の手順を踏みます。
--------------------------------------------------
1)既にリストに登録されている該当オブジェクトを削除
2)再度、優先順位を比較しながら登録

--------------------------------------------------

とりあえず、先ほどの削除と同じように、
フラグを設定 → 描画時にフラグ判別を行い、処理実行
という風にします。

具体的にいうと、下記の様に描画順変更フラグ(DRAW_CHANGE)がセットされていれば、
とりあえず描画 ⇒
該当の優先順位の箇所に登録(ChangeDrawObject関数)⇒
リストから削除

とします。
void Draw()
{
for( it = m_DrawerList.begin(); it != m_DrawerList.end(); )
{
switch( ( *it )->GetObjectFlag() ){
case DRAW_DELETE: it = m_DrawerList.erace( it );
break;
case DRAW_CHANGE: ( *it )->Draw();
ChangeDrawObject( *it );
it = m_DrawerList.erace( it );
break;
default: ( *it )->Draw();
++it;
break;
}
}
}



ただ、この方法には欠点があります。
1)優先度を低くした場合、1フレームだけ、オブジェクトが2回描画される。
2)描画順変更フラグをセットして、実際に描画順が変更されるのは1フレーム後。


まず1)についてですが、
優先順位を1から3に変更したとします。
そして、下記の様に登録されている場合、オブジェクトAが2回描画されます。

オブジェクトA … 優先度1
オブジェクトB … 優先度2
オブジェクトC … 優先度4

A描画 → B描画 → A描画 → C描画


次に、2)について。
描画をする瞬間に優先順位を変更する仕様の為、
優先度変更フラグセット⇒
描画⇒
描画後、適切な優先度の位置へ変更

という風に、ラグが生じます。


という訳で、優先順位変更は描画時に行うものではない
という結論に至りました。


最終的に実装は、
・リストに登録されている参照数計測ポインタを指すポインタを定義
・削除する際、ポインタを通じて、参照数計測ポインタにNULLを突っ込む
・描画する際、描画フラグ判定の前に、オブジェクトがNULLでないか確認


これも図で見た方が分かり易いので、下記をご覧ください。

drawsystem3.jpg
描画リストの参照数計測ポインタを指すポインタを定義します。
(赤い点線。)

削除する際は、そのポインタを用いて、
描画リスト上の参照数計測ポインタにNULLを突っ込みます。

描画オブジェクト配列からの参照は残っているので、
メモリ上のオブジェクトは解放されない点がポイントです。
drawsystem4.jpg

NULL突っ込んだ後は、あとは普通に登録するだけです。
※登録する際の大雑把な流れは、本記事上部参照。

void Draw()
{
for( it = m_DrawerList.begin(); it != m_DrawerList.end(); )
{
//NULLならリストから削除
if( ( *it ) == NULL ){
it = m_DrawerList.erace( it );
}else{
//削除フラグが設定されていれば削除
if( ( *it )->GetObjectFlag() == DRAW_DELETE ){
it = m_DrawerList.erace( it );
}else{
//そうでなければ描画
( *it )->Draw();
++it;
}
}
}
}


現状は上記の様な構造になってます。
その内、また改善版を考えるかもしれませんが、
その際は、また記事にして纏めます。

最後に。

上記に記載したソースコードは、
大雑把な流れだけ示したものなので、動作しません。(変数定義や、main関数がない)

なので、動作するソースコードを以下に記載します。
下記のソースコードをベースに、ローグライクゲームの開発を進めてみる事にします。

【ソースコード】 http://rudora3.web.fc2.com/RogueSample1.zip
ソースコード一式をUPしました!(`・ω・´)

main.cpp
CSingleton.h
CDrawerBase.h
CDrawerBase.cpp
CDrawer2D.h
CDrawer2D.cpp
CDrawerManager.h
CDrawerManager.cpp


RogueSample1_1.jpg


※Enterキーで描画順変更、
「→」キーで描画オブジェクト削除 という動作になってます。
※拡大・縮小のフラグが用意してありますが、現状設定しても動作に影響しません。
※とりあえず"grade.jpg"という画像を読み込むようにしてます。
※ソースコードは、適宜修正、改良する可能性があります。

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

ジャンプ10号感想

●恋するエジソン
長く続くのかなぁ?というのが率直な感想。


●暗殺教室
遂に本命の暗殺兵器が来ました。

いきなり壁を壊して「勝った」とか言い始める不可解行動を取ってますが、
戦闘力は高そうである。

本命が負けたら、実質 政府側から打つ手は無くなるので、
そう簡単に負けることはないと思う。(物語の展開的に)


●めだかボックス
---------------------------------
げっげっげ
うむ。やはり新しい体は新し良い

---------------------------------
もう…何なのコレ(´・ω・`)
…何なのコレ。

次回の展開が気になる!というより、
素直にハッピーエンドに持って行けば良かったんじゃないか
という印象
が強い。


●トリコ
---------------------------------------
じゃないともう…
ワシ自身でも自分を止められなくなっちまう

---------------------------------------
やばいよ暴走するつもりなのかこの人。

トリコたちが敵との戦いを終えて戻った際、
マンサムがクッキングフェスの会場を粉砕していたみたいな展開にならなければいいけど。
今のところ、誰も止められない一番危険な人物だよ。

(もしそうなったら、「もうやめてハンサム!!」と叫べば止まるかも。
  「ハンサムという単語に反応する」というのは伏線だったんですよ、たぶん。)

<追記予定!>

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

'kernel32.lib' を開くことができません。 というエラーの対処法

プログラミング中に、'kernel32.lib' を開くことができません。
とかいうエラーが出ました。

なんじゃこりゃーと思って調べてみたら、
結構ハマってる人が多い様子。

自分は何とかそのハマリ状態から抜け出すことが出来たので、
その方法を記載してみます。

※Windows8、visual studio 2010を使用。

================================================
【1】プロジェクト>「●●のプロパティ」を選択
【2】構成プロパティ>「リンカ」を選択
【3】全般>「追加のライブラリディレクトリ」の入力欄をクリック
【4】入力欄の「V」マークをクリック、<編集...>を選択
【5】入力欄をダブルクリック、「...」をクリック
【6】kernel32.libが存在するフォルダを指定

※自分のPCは下記のフォルダにありました。
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib
================================================

上記のエラーは、要は
libファイルがそもそも存在しないか、または
libファイルが存在しないフォルダを参照している為に見つからない
と言っているっぽいので、正しいlibファイルの場所を教えてあげれば良い模様。

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

~ 大⑨州東方祭8 参加表明 ~

突然ですが、
大⑨州東方祭8が、
2013/09/15に開催される予定
との事です。

自分は、「みかんこーぼー」というサークルで活動してたりするのですが、
上記のイベントに参加しようと思います。


新作ゲームの構想もあるので、
それを実装して、上記イベントで公開してやる!とか意気込んでいる訳です。

3Dのゲームを予定しているのですが、
画像担当の"乙谷"さんが、テクスチャ用の画像をあまり作ったことが無いとのことで、
そこら辺どうなるか心配ですが、何とかしてみます。

※テクスチャ用の画像 … 3Dモデル(立体)に貼り付けるので、
             元データの画像が、なんか歪んだ状態になる。

お楽しみに!(`・ω・´)

テーマ : ゲーム製作 関連 - ジャンル : ゲーム



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。