お世話になってます.
http://www.play21.jp/board/formz.cgi?ac ... &rln=46714
で,文字列の回転表示が難しいとわかったので,MakeGraphで作成したハンドルにDrawStringで描画した文字列を画像にして取り込み表示させています.
しかし,例えばmain関数で複数のログを追加すると全く表示されなくなってしまいます.
1個だけログに追加した場合ちゃんと表示されます.
これはどういうことでしょうか.
もしわかる方教えてください.
Messageクラス
ログの1つ1つのメッセージ管理クラス
Createメソッドで画像作成
Logクラス
Messageクラスを管理
Updateでログの表示時間を管理し,DrawObjectで描画しています.
継承しているObjectクラスはタスクに追加するための基底クラスです
/**************************************************************************
ログの1メッセージ
**************************************************************************/
class Message
{
private:
int msg_handle;//メッセージ画像のハンドル
int show_time;//表示している時間
std::string msg;
public:
Message(std::string str) : show_time(0)
{
msg = str;
}
//文字列画像の作成
void Create(int font_handle)
{
//画面に文字列描画
DrawStringToHandle(0,0, msg.c_str()
, GetColor(255,255,255), font_handle, GetColor(150,150,150));
//空画像ハンドル作成
msg_handle = MakeGraph(360,15);
//画面に描画している文字列を画像として所得
GetDrawScreenGraph(0,0,360,15, msg_handle);
//文字列隠し
DrawBox(0,0,360,20,GetColor(0,0,0), TRUE);
}
void UpperCount()
{
show_time++;
}
int GetHandle(){return msg_handle;}
int GetTime(){ return show_time;}
std::string GetMessage(){ return msg; }
~Message()
{
//画像の削除
DeleteGraph(msg_handle);
}
};
/**************************************************************************
ログを表示するクラス
**************************************************************************/
//ログの表示限界
#define LOG_MAX 8
//ログの表示限界を超えたときの表示フレーム
#define LOG_TIME 90
#define LOG_OBJ_PRIORITY 200
#define LOG_DRAW_PRIORITY 25
class Log : public Object
{
private:
std::vector<Message> message;//表示するログ
int font_handle;//フォントハンドル
int player_num;//プレイヤ番号
public:
Log()
: Object(LOG_OBJ_PRIORITY, LOG_DRAW_PRIORITY, "Log")
{
//フォントハンドルの作成
font_handle = CreateFontToHandle("HG創英角ゴシックUB" , 15 , 2 , DX_FONTTYPE_ANTIALIASING_EDGE);
}
~Log()
{
message.clear();
}
//メッセージの追加
void SetMessage(std::string str)
{
message.push_back(Message(str));
message.back().Create(font_handle);
}
void SetPlayerNumber(int p)
{
player_num = p;
}
void Update()
{
if( message.size() > 0 )
{
//0番目のログの表示フレーム更新
message[0].UpperCount();
//もじ表示限界個数を超えたならば
if( message.size() > LOG_MAX )
{
//もし表示限界をこえたら
if( message[0].GetTime() > LOG_TIME )
{
//そのログを削除
message.erase(message.begin());
}
}
}
}
void DrawObject()
{
//ログの個数を確認
int temp = message.size();
//もじ表示限界個数を超えているならば
if( temp > LOG_MAX )
{
//表示する個数を表示限界個数にする
temp = LOG_MAX;
}
DrawBox(0,360,130, 720, GetColor(255,255,255), TRUE);
//ログ表示
for( int i=0; i<temp; i++ )
{
/*
DrawStringToHandle( 50 , 250 - (temp-i)*16, message.c_str()
, GetColor(255,255,255), font_handle , GetColor(150,150,150)) ;
//DrawFormatVStringToHandle( 50 + (temp-i)*20 , 250, GetColor(255,255,255)
// , font_handle, message.c_str() , GetColor(150,150,150)) ;
*/
if( player_num == 0 )
{
DrawRotaGraph((temp-i)*15, 560, 1.0, PI/2, message.GetHandle(), TRUE);
//DrawString(50+i*20,100+i*20,message.GetMessage().c_str(), GetColor(255,255,255), GetColor(150,150,150));
}
else
{
DrawRotaGraph(PROGRAM_WIDTH-(temp-i)*15, 180, 1.0, -PI/2, message.GetHandle(), TRUE);
}
}
}
};