三角関数のテーブル化
Posted: 2009年10月13日(火) 18:09
こんにちは。龍神録を参考にPSPにて弾幕シューを再現しようと考えております。
龍神録プログラミングの館でいうと第14章あたりなのですが、敵弾の描画が増えると処理落ちをしてしまいます。
以前質問をした際に皆様のご回答を参考に除算やfloatや画像の処理方法などを変えていき、多少良くなりました。
しかしどうやらshot.c内の以下の計算において三角関数がネックとなっていると思われ、弾が増えると落ちてしまいます。
(試しにsin、cosを1、0にして弾を真下へ撃たせた場合は結構な数が描画できたので、恐らく三角関数がネックとなっていると考えました)
そこで三角関数をテーブル化することで計算を高速化できると聞いたのですが、私プログラミング初心者でして、独自にファイルを追加して計算をさせる方法が思いつきませんでした。
具体的にどのようにすればいいのでしょうか?よろしくお願いします。
ファイル構成などは龍神録さんのサンプルとほぼ同じようになっているので、できればこのサンプルに倣った方法で教えてもらえるとありがたいです。
龍神録プログラミングの館でいうと第14章あたりなのですが、敵弾の描画が増えると処理落ちをしてしまいます。
以前質問をした際に皆様のご回答を参考に除算やfloatや画像の処理方法などを変えていき、多少良くなりました。
しかしどうやらshot.c内の以下の計算において三角関数がネックとなっていると思われ、弾が増えると落ちてしまいます。
(試しにsin、cosを1、0にして弾を真下へ撃たせた場合は結構な数が描画できたので、恐らく三角関数がネックとなっていると考えました)
void shot_calc(int n){ int i,max=0; if(enemy[shot[n].num].flag!=1)//敵が倒されたら shot[n].flag=2;//それ以上ショットを登録しないフラグに変える for(i=0;i<SHOT_BULLET_MAX;i++){//n番目の弾幕データの弾を計算 if(shot[n].bullet.flag>0){//その弾が登録されていたら shot[n].bullet.x+=cos(shot[n].bullet.angle)*shot[n].bullet.spd; shot[n].bullet.y+=sin(shot[n].bullet.angle)*shot[n].bullet.spd; shot[n].bullet.cnt++; if(shot[n].bullet.x<-60 || shot[n].bullet.x>FMX+60 || shot[n].bullet[i].y<-60 || shot[n].bullet[i].y>FMY+60){//画面外に外れたら if(shot[n].bullet[i].till<shot[n].bullet[i].cnt)//最低消えない時間より長ければ shot[n].bullet[i].flag=0;//消す } } } //現在表示中の弾が一つでもあるかどうか調べる for(i=0;i<SHOT_BULLET_MAX;i++) if(shot[n].bullet[i].flag>0) return; //現在表示中の弾が一つもなければ if(enemy[shot[n].num].flag!=1){ shot[n].flag=0;//終了 enemy[shot[n].num].flag=0; } }
そこで三角関数をテーブル化することで計算を高速化できると聞いたのですが、私プログラミング初心者でして、独自にファイルを追加して計算をさせる方法が思いつきませんでした。
具体的にどのようにすればいいのでしょうか?よろしくお願いします。
ファイル構成などは龍神録さんのサンプルとほぼ同じようになっているので、できればこのサンプルに倣った方法で教えてもらえるとありがたいです。