Re: CreateMaskScreen() ;について ( No.1 ) |
- 名前:かたぱると 日時:2008/07/31 16:07
上記の情報だけだと回答しにくいのでとりあえず
・実行OS
・DXライブラリのバージョン
を教えていただけますでしょうか。
あと該当部分のソースを抜粋でいいので
貼り付けていただけますでしょうか。
|
Re: CreateMaskScreen() ;について ( No.2 ) |
- 名前:えっどぅ 日時:2008/07/31 20:16
気が利かず申し訳ないですOTL
OS : XP home Edition
バージョン : SP3
DXライブラリ : BCC用のVer 2.23
だと思います(ぁ
下はソースの一部です。
大分前からCPPを覚えながら作ってるので注役とかが大分変だったりします(汗
よろしくお願いしますmm
↓唯一マスクを描画する処理のあるクラスです。
シューティングで敵を倒す度にこのクラスのインスタンスを生成して双方向リストでつなぎます。
メインループの方でこの双方向リストが存在すれば画面にマスクと元画像を描画します。描画が終わればクラスを解放します。メインループの方も投稿しようとしましたが容量が多いと怒られましたすいません;
//**敵破壊時のエフェクトに関するクラス*******************************
class EnemyDeadEffect{
private:
double effect_p_x;
double effect_p_y;
int Effect_No;//エフェクト番号
int GrHandle_1;
int GrHandle_2;
public:
EnemyDeadEffect *prev;
EnemyDeadEffect *next;
EnemyDeadEffect(double p_x,double p_y,int i){//引数、敵の各中心座標、エフェクト番号
effect_p_x = p_x;
effect_p_y = p_y;
Effect_No = i;
GrHandle_1 = 0;
GrHandle_2 = 0;
}
bool EnemyDeadEffectControl();
void DrawEnemyDeadEffect();
};
//*******************************************************************
//-------------------------------------------------------------------
//-------------------------------------------------------------------
//]解説] 敵破壊時のエフェクト画像の差し替え
bool EnemyDeadEffect::EnemyDeadEffectControl(){
if(GrHandle_1 == effect_set[Effect_No].GrHandle_Interval && GrHandle_2 == effect_set[Effect_No].GrHandle_MAX)
return true;
if(GrHandle_1 == effect_set[Effect_No].GrHandle_Interval){
GrHandle_1 = 0;
GrHandle_2++;
}
else GrHandle_1++;
return false;
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
//]解説] 敵破壊時のエフェクト画像描画
void EnemyDeadEffect::DrawEnemyDeadEffect(){
DrawMask(effect_p_x-effect_set[Effect_No].EFFECT_SIZE_HALF_W,effect_p_y-effect_set[Effect_No].EFFECT_SIZE_HALF_H,effect_set[Effect_No].mask[GrHandle_2],DX_MASKTRANS_WHITE);
DrawGraph(effect_p_x-effect_set[Effect_No].EFFECT_SIZE_HALF_W,effect_p_y-effect_set[Effect_No].EFFECT_SIZE_HALF_H,effect_set[Effect_No].image[GrHandle_2],true);
}
//-------------------------------------------------------------------
EnemyDeadEffect *enemydeadeffectfirst = new EnemyDeadEffect(0,0,0);
EnemyDeadEffect *enemydeadeffectlast = enemydeadeffectfirst;
EnemyDeadEffect *enemydeadeffecttmp = enemydeadeffectfirst;
EnemyDeadEffect *work;
|
Re: CreateMaskScreen() ;について ( No.3 ) |
- 名前:かたぱると 日時:2008/08/04 11:16
どちらかというと
CreateMaskScreen
LoadDivMask
の部分のソースが知りたかったのですが…。
とりあえず自分の環境で試したところ
CreateMaskScreenを行わなかった場合には
DrawMaskの結果は反映されず、
マスク描画は行われませんでした。
勝手にマスク画面が作られるわけではなさそうです。
処理落ちについてですが環境依存になる場合が多そうです。
CreateMaskScreenの説明文にも以下の記述があります
▽引用開始▽
この関数を使用しなければマスク画面を使用できない主な理由には
マスク画面を使用するにはビデオメモリ(VRAM)をグラフィック画面 1つ分、
メインメモリもグラフィック画面一つ分必要とするので、
マスク画面を必要としない場合にもこれだけの資源を占有されてしまうのは
単純にもったいないから、及び、マスク処理というのはかなりのCPUパワーを必要とし、
描画処理に多大な負担を与える事となるので
使用しない時にも常にマスク画面が存在するのは不都合極まりないからです。
△引用終了△
以上の結果を踏まえて、原因と思われそうなのは以下のパターンだと思いますが…。
@EnemyDeadEffect::DrawEnemyDeadEffect()にて
DrawMaskを行っても行わなくても実は同じものが表示されてしまう
マスクデザイン・エフェクトデザインだった
ACreateMaskScreenをループ毎に毎回行っていた
→CreateMaskScreen〜DeleteMaskScreenを毎回やっていた
Bマスク画面を利用した際にメモリやCPUパワーが足りずに処理落ちが起こる
現状で思いつくのはこんなところでしょうか。
|
Re: CreateMaskScreen() ;について ( No.4 ) |
- 名前:管理人 日時:2008/08/04 20:43
かたぱるとさんと被りますが、
マスクはもともと非常に重い処理なので恐らくおかしなぐらい重いのが
正常な状態です。
CreateMaskScreen 関数を呼ばないとマスク処理はできないはずですので、
恐らく軽いときはマスク処理が行われていないはずなのですが・・・
因みにどのようなことにマスク処理を使用されようとしているのでしょうか?
|
Re: CreateMaskScreen() ;について ( No.5 ) |
- 名前:えっどぅ 日時:2008/08/17 21:10
レスが非常に遅くなり申し訳ございません。
画像の透過にマスク処理を使おうとしていました。
マスクを使用していないのに透過されたのは、
マスク画像として使用しようとしていたファイル名を
良く見たらファイル名_aと偶然なっていたため透明情報として読み込まれて透過されたんだと思いますOTL
なので今のところマスクを使う必要はなくなりました。
多分重かった原因はかたぱるとさんのおっしゃられたAに該当すると思います。
繰り返し、レスが非常に遅くなり申し訳ございませんでした。ありがとうございました。
|