ページ 1 / 1
ショットの描画について
Posted: 2008年8月02日(土) 18:16
by クロウ
龍神録プログラミングの館をもとにシューティングを作っているのですが、ショットを撃つ角度に合わせて弾の角度を変えて描画するようにしたところ、すでに撃たれたショットまで今のショット角度で描画されてしまいます。
void graph_cshot(){
double canon[CSHOT_MAX];//そのときの弾の角度を記憶する用
for(int i=0;i<CSHOT_MAX;i++){
canon = ch.Canon_Angle;//弾の角度を記憶
if(cshot.flag>0){
DrawRotaGraphF(cshot.x+FIELD_X,cshot.y+FIELD_Y,1,canon,img_cshot[cshot.knd],TRUE);
}
}
}
自分では撃たれた直後のショットの角度を記憶してその角度で描画する。次のショットが撃たれたらその角度を記憶してその角度で描画するようにしたつもりです。
すでに撃たれたショットの角度を描画したのちはその角度を固定して飛んでいき、次に撃たれたショットの角度に影響されずに描画する方法がありましたらお願いします。
Re:ショットの描画について
Posted: 2008年8月02日(土) 18:35
by array
//通常ショット登録
void ch0_shot_pattern(){
int k;
for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
if((k=serch_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x;
cshot[k].y=ch.y+cshot0pos_y;
cshot[k].power=23;
cshot[k].knd=0;
}
}
se_flag[2]=1;//発射音オン
}
//低速通常ショット登録
void ch1_shot_pattern(){
int k;
for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
if((k=serch_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x/3;//低速中なら位置を中心側へ
cshot[k].y=ch.y+cshot0pos_y/2;
cshot[k].power=23;
cshot[k].knd=0;
}
}
se_flag[2]=1;
}
//自機ショット描画
void graph_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot.flag>0){
DrawRotaGraphF(cshot.x+FX+dn.x,cshot.y+FY+dn.y,1,cshot.angle,img_cshot[cshot.knd],TRUE);
}
}
}
ウイルスバスターの弊害で、シフトが反応しないので確認できないのですが
いじるなら赤の部分だと思いますけど、どうだろ。頑張ってみてください^^
補足----------------
上記の内容をみるとch.Canon_Angleにすでに角度が用意されてるみたいなので
cshot[k].angle=-PI/2;
を
cshot[k].angle = ch.Canon_Angle;
にしても良いかも知れません。
ch.Canon_Angleの内容が分からないので何とも言えませんが。
Re:ショットの描画について
Posted: 2008年8月02日(土) 19:09
by array
cshot.cpp --------
の3行目くらいに
int cshot0pos_x[4]={-10, 10,-30, 30};
int cshot0pos_y[4]={-30,-30,-10,-10};
があったので
int cshot0pos_x[4]={-10, 10,-30, 30};
int cshot0pos_y[4]={-30,-30,-10,-10};
int cshot0pos_angle[4]={-10,10,-20,20};
を作ってあげて、
//通常ショット登録
cshot[k].angle=-PI/2+PI/180*cshot0pos_angle;
//低速通常ショット登録
cshot[k].angle=-PI/2;//(そのまま)
とすれば大丈夫じゃないですか?
低速ショットは試せませんが、通常ショットなら想定の角度をつけて飛んで行きましたよ。
低速通常ショットは、直線で飛ぶイメージなのですがどうでしょうか。
その他の変更点------
graph.cpp --------
//自機ショット描画
DrawRotaGraphF(cshot.x+FX+dn.x,cshot.y+FY+dn.y,1,cshot.angle+PI/2,img_cshot[cshot.knd],TRUE);
Re:Re:ショットについて
Posted: 2008年8月03日(日) 16:30
by クロウ
早速の返信ありがとうございます。
試してみたところ、うまくいきました。低速移動は作っているシューティングでは使わないので大丈夫です。
ch.Canon_Angleというのはバルカンの角度で、自機が上下するとバルカンが傾いて発射角度も変わるというものです。例を挙げるとメタルスラッグのスラグフライヤーという戦闘機のような感じです。
別スレを立てた方がいいのかもしれないのですが、規約の方に「一スレにつき質問は一つ」という項目はなかったようですので、再び質問させていただきます。
arrayさんのコードですと、今のところ4発は同時に発射されています。
これをバルカンに近くするために、発射のテンポを少しずらすようにしたいのです。
つまり、一発目が発射されたら少し遅れて2発目を少し角度をずらして発射、少し遅れて3発目、4発目、そして元の角度で1発目と繰り返すように発射です。
cshot[k].angle=-PI/2+PI/180*cshot0pos_angle; の部分を
k%4の条件でifで区切ったらどうなのかと試しましたが、それでも駄目でやはり4発が同時に発射されてしまいます。
どうすればタイミングをずらして発射させることができるのかお願いします。
Re:ショットについて
Posted: 2008年8月03日(日) 17:46
by array
> どうすればタイミングをずらして発射させることができるのかお願いします。
-cshot.cpp
//ショット登録部
void enter_shot(){
//ショットボタンが押されていたら
if(CheckStatePad(configpad.shot)>0){
ch.shot_cnt++;
if(ch.shot_cnt%3==0){//3カウントに1回
if(CheckStatePad(configpad.slow)>0)//低速移動中なら
ch1_shot_pattern();
else
ch0_shot_pattern();
}
}
else
ch.shot_cnt=0;
}
でどうでしょうか。
ペースについては、バルカンの角度の変化速度が分からないので言いようがないです。
ちなみに前のスレでgifアニメあげてたあれですよね。まぁなんにしろ角度の変化量を計算して発射ペースをキッチリ合わすなり、適当な値に変えてそれっぽく動作させてみてはどうでしょうか。
Re:ショットについて
Posted: 2008年8月07日(木) 19:34
by クロウ
返信が遅れてしまいすみません。
現在のショット部分のコードはこうなっています。
//自機ショットの登録可能番号を返す
int serch_cshot(){
for(int i=0;i<CSHOT_MAX;i++){//画面内に繰り出せるショットの個数より少ない
if(cshot.flag==0)//ショットフラグが立つ
return i;
}
return -1;
}
//通常ショット登録
void ch0_shot_pattern(){
int k;
for(int i=0;i<cshot0num[ch.power<200?0:1];i++){
if((k=serch_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
//3発ごとに角度が違う
switch(k%3){
case 0:
cshot[k].angle=-PI/2+ch.Canon_Angle;//発射角度
break;
case 1:
cshot[k].angle=-PI/2-0.05+ch.Canon_Angle;//少し傾ける
break;
case 2:
cshot[k].angle=-PI/2+0.05+ch.Canon_Angle;
break;
}
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x+55;
cshot[k].y=18+ch.y+cshot0pos_y+tan(ch.Canon_Angle)*30;
cshot[k].power=1;//ショットの攻撃力
cshot[k].knd=0;//ショットの種類
}
}
se_flag[2]=1;//発射音オン
}
//ショット登録部
void enter_shot(){
//ショットボタンが押されていたら
if(CheckStatePad(configpad.shot) > 0 ){
ch.shot_cnt++;
if(ch.shot_cnt%3==0){//3カウントに1回
ch0_shot_pattern();
}
}
else
ch.shot_cnt=0;
}
//ショットの移動計算
void calc_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot.flag==1){
int dranx=cshot.spd+11/2,drany=cshot.spd+55/2;
cshot.y+=cos(cshot.angle)*cshot.spd;
cshot.x-=sin(cshot[i].angle)*cshot[i].spd;
cshot[i].cnt++;
if(cshot[i].x<-dranx || cshot[i].x>FIELD_MAX_X+dranx ||
cshot[i].y<-drany || cshot[i].y>FIELD_MAX_Y+drany)//画面から外れたら
cshot[i].flag=0;
}
}
}
この状態で、3発が同時に発射されています。