私は今Dixqさんの龍神録の書き方を真似してSRPGを作成しています。
キャラクターの移動範囲を求める関数を作っているのですが、再起でマップチップのリストをそのまま呼び出しているせいなのか、非常に処理が重くなりました。
このままではゲームにならないので何とかしたいのですが、リストを呼ばないことには移動コストなどが取得出来ないのでどうにも出来ず困っています。
基本的に同じものなので一回呼べばそれで済むと思うのですが、一回呼んでそれを使い回すことは出来ないのでしょうか。
解答をよろしくお願いします。
bool CPlayer::CanMoveOrNot(int x,int y,int MoveP,int di,char MovingPath){
//マップチップのリスト取得
list<CMapTip*> ListOfMapTip;
CFacade::Inst()->GetListOfMapTip(ListOfMapTip);
//マップチップのリスト分ループ
for(list<CMapTip*>::iterator it=ListOfMapTip.begin();it!=ListOfMapTip.end();it++){
if((*it)->Position.x==x && (*it)->Position.y==y){
if(MoveP<(*it)->MoveCost){return false;}//移動できなかったら終了
(*it)->CanMove=true;
mvrec[x][y] = MovingPath;
if(di!=3){CanMoveOrNot(x,y-1,MoveP-(*it)->MoveCost,1,MovingPath+'1');}
if(di!=4){CanMoveOrNot(x+1,y,MoveP-(*it)->MoveCost,2,MovingPath+'2');}
if(di!=1){CanMoveOrNot(x,y+1,MoveP-(*it)->MoveCost,3,MovingPath+'3');}
if(di!=2){CanMoveOrNot(x-1,y,MoveP-(*it)->MoveCost,4,MovingPath+'4');}
return true;
}
}
}
void CPlayer::MoveAreaSearch(){
int X = Position.x, Y = Position.y;
int MoveP = JobData.MoveP;
CanMoveOrNot(X,Y,MoveP,1,'1');
CanMoveOrNot(X,Y,MoveP,2,'2');
CanMoveOrNot(X,Y,MoveP,3,'3');
CanMoveOrNot(X,Y,MoveP,4,'4');
}
開発環境
Windows7
Mictrosoft VisualC++2010 HomeEdition
DXライブラリ
今の知識はゲームプログラミングの館を読んだ程度です。
参考にしたサイトhttp://gumina.sakura.ne.jp/CREATION/OLD ... SESS03.htm