レーザーの質問とボスのアニメーション(?)の質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
康竜

レーザーの質問とボスのアニメーション(?)の質問

#1

投稿記事 by 康竜 » 6年前

ふたつ質問があります。

1つめ

回転レーザーをボスの移動と一緒に動かしたいのですがどうしたらよいでしょうか?
下に移動しながら回転レーザーを使うとして
static double bossy=boss.y;を作ってlazer[k].startpt.yとlazer[k].lphy.conv_base_yに代入しましたが
レーザーの回転位置は動かず、回転レーザーを残してボスだけが下に移動しました。どうしたらよいでしょう?

2つめ

ボスを自機キャラのようにアニメーション(?)させるのに成功し、過去ログを参考にして
右に移動するときは右用の、左に移動するときは左用のアニメーションをさせることにも成功しましたが、
左に移動するときの最後のほうに右用のやつを交互にアニメーションするという事件がおきました。
そして、移動が終わった後のアニメーションが右用のアニメーションのままになってしまいます。どうしたらよいでしょう?

int workX;
workX = boss.dx;//現在の位置をworkXに代入

if( workX < boss.x )// 右へ
boss.img+=4*3;//画像を右向きに
else if( workX > boss.x )// 左へ
boss.img+=4*2;//画像を左向きに
else
boss.img+=4*0;//移動が終わった後の画像

アバター
usao
記事: 1565
登録日時: 6年前

Re: レーザーの質問とボスのアニメーション(?)の質問

#2

投稿記事 by usao » 6年前

えーと,なんというか,
もしあなたが あなたのコードに関しての知識を一切持っていない状態で
この質問文を読んだとしたら 何か有用なことを答えることができると思いますでしょうか?

あなたが書いているプログラム内の変数の意味等は他人には知りようがないわけで
変数名だけ書かれたところで どうしようもないとは思いませんか?


boss.img が一体どんな値で,表示する画像を切り替えることに関して どのように働くのかまるで不明ですけど,
右に行こうが左に行こうが永久に増え続けるように見受けられ,怪しげには感じます.
意図通りの値の遷移を辿るのでしょうか?
(4*3(=12)と,4*2(=8)の公倍数になったとき,「右でも左でも同じ値になる」ようなことが発生しそうですけど)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: レーザーの質問とボスのアニメーション(?)の質問

#3

投稿記事 by softya(ソフト屋) » 6年前

龍神録や過去ログを参考にされていると思いますが、そのリンクを張って頂かないとイメージの共有が難しいかと思いますのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: レーザーの質問とボスのアニメーション(?)の質問

#4

投稿記事 by Tatu » 6年前

usaoさんがアニメーションについて回答しているのでアニメーションから考えることにしましょう。

龍神録プログラミングの館のやり方と同じようにしたいというのであれば9章をもう一度読み返してください。

コード:

ch.img+=4*2;//画像を左向きに
など以外にもch.imgを変更している部分があるはずです。

違っていても構わないというのであれば
画像が
移動なし0、移動なし1、移動なし2、移動なし3、
???0、???1、???2、???3,
左移動0、左移動1、左移動2、左移動3、
右移動0、右移動1、右移動2、右移動3、
という感じだったとして
移動なし、???、左移動、右移動のどれであるかを表す変数Aと
何コマ目かを表す変数Bを組み合わせ、

コード:

boss.img=4*A+B;
というようにすればいいんじゃないでしょうか。

康竜

Re: レーザーの質問とボスのアニメーション(?)の質問

#5

投稿記事 by 康竜 » 6年前

>>えーと,なんというか,
もしあなたが あなたのコードに関しての知識を一切持っていない状態で
この質問文を読んだとしたら 何か有用なことを答えることができると思いますでしょうか?

あなたが書いているプログラム内の変数の意味等は他人には知りようがないわけで
変数名だけ書かれたところで どうしようもないとは思いませんか?

失礼しました。仰る通りです。

>>龍神録プログラミングの館のやり方と同じようにしたいというのであれば9章をもう一度読み返してください。
ch.img+=4*2;//画像を左向きに

など以外にもch.imgを変更している部分があるはずです。

3回読みなおしましたが「ch.img+=4*2など以外にもch.imgを変更している部分があるはずです。」を理解できません…
ch.img=(ch.cnt%24)/6;のことでしょうか…?


では、アニメーションの御指導からお願いします。
龍神録と同じような弾幕STGを作成中です。コードもほとんどいじらず、画像や音楽を変えているのみです。
画像の???の部分はまた別のアニメーションです。弾幕発射時のアニメーションに使うつもりです。

目標は「右に移動する場合に右移動のアニメーション、左に移動する場合に左移動のアニメーション、
移動しない、若しくは移動し終わった場合に移動なしのアニメーションをさせる」ことです。

参考にした過去ログはhttp://dixq.net/forum/viewtopic.php?f=3&t=3829
過去ログでは「workXに現在のボスの位置を代入し、移動した後のx座標と比べて画像を変更している」と理解してますが、
まず間違いないでしょうか?そこで過去ログのコードをそのままコピペしてもなかなかうまくいかず質問させていただきました。

質問後も、いろいろ試行錯誤してやっているのですが、
Tatuさんの仰った「移動なし、???、左移動、右移動のどれであるかを表す変数A」としてmukiを作りました。

そして過去ログのif文を「移動する前のボスのx座標から移動中のx座標を引いてその値が0より上だったら右移動、0より下だったら左移動」という
条件に変えたところある程度うまくいきました。以下がそのコードです。

--boss_shot.cpp--

コード:

void calc_boss(){
	int muki=0;
	double workX;
	workX = boss.x;//現在のボスの位置を代入

	if( workX-boss.dx>0 )// 右へ
		muki=3;//右移動
	else if( workX-boss.dx<0 )// 左へ
		muki=2;//左移動
	else if(boss.dx==0)
		muki=0;//移動なし
	boss.dx=boss.x;
	boss.dy=boss.y+sin(PI2/130*(count%130))*10;
	boss.cnta++;
	boss.img=((boss.cnta%40)/10)+muki*4;
}
 


問題は「ボスが縦に移動するときに移動なしのアニメーションをしてくれない」のです。
boss_shotH.ccpでボスの移動とアニメーションの連動を確認しているのですが、
初期位置(FMX/2,100)「移動なし」
input_phy_pos(FMX/2,400, 100);初期位置から真下に移動※1、「移動なし」
input_phy_pos(20,40, 100);初期位置から真下の位置から画面左上端へ移動「左移動」
input_phy_pos(20,400, 100);画面左上端から画面左下端(真下)へ移動
input_phy_pos(370,400, 100);画面左下端から画面右下端(真右)へ移動「右移動」
input_phy_pos(370,40, 100);画面右下端から画面右上端(真上)へ移動
※1に戻る

「input_phy_pos(20,400, 100);画面左上端から画面左下端(真下)へ移動」のときは移動なしのアニメーションを
するようにしたいのですが、左移動のアニメーションになってしまいます。
「input_phy_pos(370,40, 100);画面右下端から画面右上端(真上)へ移動」のときは移動なしのアニメーションを
するようにしたいのですが、右移動のアニメーションになってしまいます。
真下、真上に移動するときはworkXとboss.dxの値は同じでないといけないのに、そこがうまくいってないということですよね?
しかし、コードをどのように改変すればよいかわかりません。どうしたらよいのでしょうか?

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: レーザーの質問とボスのアニメーション(?)の質問

#6

投稿記事 by Tatu » 6年前

>>康竜さん
>ch.img=(ch.cnt%24)/6;のことでしょうか…?
それのことです。

>「workXに現在のボスの位置を代入し、移動した後のx座標と比べて画像を変更している」
過去ログではその通りです。

移動なしの部分が

コード:

else if(boss.dx==0)
	muki=0;//移動なし
となっていますがボスのx座標が変化しない場合はworkX-boss.dx==0ですね。

右移動でも左移動でもない場合は移動なしなので

コード:

    if( workX-boss.dx>0 )// 右へ
        muki=3;//右移動
    else if( workX-boss.dx<0 )// 左へ
        muki=2;//左移動
    else
        muki=0;//移動なし
でもよいでしょう。

もし、x座標の移動がほんのわずかである場合は移動なしとみなすのであれば

コード:

    if( workX-boss.dx>0.01 )// 右へ
        muki=3;//右移動
    else if( workX-boss.dx<-0.01 )// 左へ
        muki=2;//左移動
    else
        muki=0;//移動なし
のようにしてみてはどうでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: レーザーの質問とボスのアニメーション(?)の質問

#7

投稿記事 by softya(ソフト屋) » 6年前

引用部分がすごく分かりづらいので、次の書き方を参考になさってください。

>もしあなたが あなたのコードに関しての知識を一切持っていない状態で
>この質問文を読んだとしたら 何か有用なことを答えることができると思いますでしょうか?

>あなたが書いているプログラム内の変数の意味等は他人には知りようがないわけで
>変数名だけ書かれたところで どうしようもないとは思いませんか?

この様に全部の行に引用の>を書いてもらうか
もしあなたが あなたのコードに関しての知識を一切持っていない状態で
この質問文を読んだとしたら 何か有用なことを答えることができると思いますでしょうか?

あなたが書いているプログラム内の変数の意味等は他人には知りようがないわけで
変数名だけ書かれたところで どうしようもないとは思いませんか?
この様にしてもらうと非常に読みやすくなります。
特に>は多くの掲示板でも通用する書き方です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: レーザーの質問とボスのアニメーション(?)の質問

#8

投稿記事 by Tatu » 6年前

No:6で「workX-boss.dx==0ならば移動なしにすればいい」というような書き方をしましたが
実際にはworkX-boss.dxが完全に0になることは期待できません。
そのため、x座標の移動がほんのわずかである場合は移動なしとみなすようにしたほうがよいでしょう。

康竜

Re: レーザーの質問とボスのアニメーション(?)の質問

#9

投稿記事 by 康竜 » 6年前

>引用部分がすごく分かりづらいので、次の書き方を参考になさってください。

わかりました。ご指摘どうもです。

Tatuさんの仰る通りに改変したところうまくアニメーションできました。ありがとうございます。

もうひとつの質問、レーザーについての御指導お願いします。

コード:

//初期座標からで回転レーザーを出しながら真下に移動する
void boss_shot_bulletH011(){
#define TM011 500
#define DIST 30
	int i,k,t=boss_shot.cnt%TM011;
	static int num;
	if(num==0 && t==40){
		for(i=0;i<1;i++){
			if((k=search_lazer())!=-1){
				lazer[k].col      = 0;//弾の色
				lazer[k].knd      = 7;//弾の種類
				lazer[k].angle    = 315*PI/180;
				lazer[k].startpt.x= boss.x+cos(lazer[k].angle)*DIST;//座標
				lazer[k].startpt.y= boss.y+sin(lazer[k].angle)*DIST;
				lazer[k].flag     = 1;
				lazer[k].cnt      = 0;
				lazer[k].haba     = 15;//幅
				lazer[k].state    = 0;//ステータス
				lazer[k].length   = 400;//レーザーのさ
				lazer[k].hantei	  = 1;
				lazer[k].lphy.conv_flag=1;
				lazer[k].lphy.conv_base_x=boss.x;//回転基準位置
				lazer[k].lphy.conv_base_y=boss.y;
				lazer[k].lphy.conv_x=lazer[k].startpt.x;//回転元の位置
				lazer[k].lphy.conv_y=lazer[k].startpt.y;
				input_lphy(&lazer[k],380,360*PI/180);
			}
		}
	}
	if(num==0 && t==100){
		input_phy_pos(FMX/2,400, 100);
	}
	//レーザー計算
	for(i=0;i<LAZER_MAX;i++){
		if(lazer[i].flag>0){
			int cnt=lazer[i].cnt;
			int state=lazer[i].state;
			if(state==0){
				if(cnt>=360 && cnt<=400){
					if(cnt==380)
						lazer[i].hantei=0;
					lazer[i].haba=7*(20-(cnt-380))/20.0;
					if(cnt==400)
						lazer[i].flag=0;
				}
			}
		}
	}
	if(t==TM011-1)
		num=(++num);
}
このコードだとキャラが移動してもレーザーを初期座標に置いてきてしまいます。
そうではなく、レーザーもキャラと一緒に移動させたいのです。
そこで現在のボスの位置を覚えるstatic int bossny=boss.yを作ってlazer[k].startpt.yとlazer[k].lphy.conv_base_yに
bossnyを代入したのですが、同じようにレーザーを置いてきてしまいます。
どうすればよいのでしょうか?

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: レーザーの質問とボスのアニメーション(?)の質問

#10

投稿記事 by Tatu » 6年前

input_lphy()を用いる場合は
ボスの移動時に
lazer[k].lphy.conv_base_x
lazer[k].lphy.conv_base_y
lazer[k].lphy.conv_x
lazer[k].lphy.conv_y
がボスの座標の変化と同じように変化するようにすればいいようです。

ボスの座標の変化と同じように変化させるには
1フレーム前のボスの座標を記憶し、今のボスの座標との差をとって
その差だけ
lazer[k].lphy.conv_base_x
lazer[k].lphy.conv_base_y
lazer[k].lphy.conv_x
lazer[k].lphy.conv_y
を変化させればよいです。

コードとしては

コード:

void boss_shot_bulletTest(){
//初期座標からで回転レーザーを出しながら真下に移動する
const int TM011=500;
const int DIST2=120;
    int i,k,t=boss_shot.cnt%TM011;
    static int num;

	static double boss_pre_y=boss.y;
	double dy;

	dy=boss.y-boss_pre_y;
	boss_pre_y=boss.y;

    if(num==0 && t==40){
        for(i=0;i<1;i++){
            if((k=search_lazer())!=-1){
                lazer[k].col      = 0;//弾の色
                lazer[k].knd      = 0;//弾の種類
                lazer[k].angle    = 315*PI/180;
                lazer[k].startpt.x= boss.x+cos(lazer[k].angle)*DIST2;//座標
                lazer[k].startpt.y= boss.y+sin(lazer[k].angle)*DIST2;
                lazer[k].flag     = 1;
                lazer[k].cnt      = 0;
                lazer[k].haba     = 15;//幅
                lazer[k].state    = 0;//ステータス
                lazer[k].length   = 400;//レーザーのさ
                lazer[k].hantei   = 1;
                lazer[k].lphy.conv_flag=1;
                lazer[k].lphy.conv_base_x=boss.x;//回転基準位置
                lazer[k].lphy.conv_base_y=boss.y;
                lazer[k].lphy.conv_x=lazer[k].startpt.x;//回転元の位置
                lazer[k].lphy.conv_y=lazer[k].startpt.y;
                input_lphy(&lazer[k],380,360*PI/180);
            }
        }
    }
    if(num==0 && t==100){
        input_phy_pos(FMX/2,400, 100);
    }
    //レーザー計算
    for(i=0;i<LAZER_MAX;i++){
        if(lazer[i].flag>0){
            int cnt=lazer[i].cnt;
            int state=lazer[i].state;
            if(state==0){
				lazer[i].lphy.conv_base_y+=dy;
				lazer[i].lphy.conv_y+=dy;
                if(cnt>=360 && cnt<=400){
                    if(cnt==380)
                        lazer[i].hantei=0;
                    lazer[i].haba=7*(20-(cnt-380))/20.0;
                    if(cnt==400)
                        lazer[i].flag=0;
                }
            }
        }
    }
    if(t==TM011-1)
        num=(++num);
}
あと、康竜さんのやり方でうまくいかなかった理由などについて自分なりにまとめてみました。
見たい場合は以下のスポイラーを開いてみてください。
► スポイラーを表示

康竜

Re: レーザーの質問とボスのアニメーション(?)の質問

#11

投稿記事 by 康竜 » 6年前

>tatuさん

レーザーのほうも無事成功いたしました。
アニメーションでも大変お世話になりました。丁寧なご指導ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る