合計 昨日 今日

太鼓の鉄人のヒットの登録処理を一度に全部しない理由

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: sakurasaku
[URL]
Date: 2017年11月06日(月) 16:41
No: 1
(OFFLINE)

 太鼓の鉄人のヒットの登録処理を一度に全部しない理由

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//ヒットしたかどうかを判定する
void hit_bullet(){
    int i,j,k,knd;
    double x,pre_x,x0,x1;
    double line_x[3]={PERFECT_X,GOOD_X,BOO_X};
    hit_dat_t hit_dat[HIT_DAT_MAX];
    memset(hit_dat,0,sizeof(hit_dat_t)*HIT_DAT_MAX);
 
    for(i=0;i<BULLET_MAX;i++){//弾分ループ
        if(bullet[i].flag==1){//弾が存在していて
            knd=-1;
            pre_x=bullet[i].x+bullet[i].spd;
            x=bullet[i].x;
            for(j=0;j<3;j++){
                x0=HIT_X-line_x[j];
                x1=HIT_X+line_x[j];
                if(x<x0 && x0<pre_x || x<x1 && x1<pre_x || x0<x && x<x1 || x0<pre_x && pre_x<x1){//距離ヒット以内なら
                    knd=j;
                    break;
                }
            }
            //距離OKでその時たたいていたら
            if(knd!=-1 && (ch.don==1  && bullet[i].knd==0 || bullet[i].knd==1 && ch.ka==1)){
                if((k=serch_hit_dat(hit_dat))!=-1){
                    enter_hit_dat(k,i,knd,bullet[i].x,hit_dat);
                }
            }
        }
    }
    int num=0;
    for(i=0;i<HIT_DAT_MAX;i++){//ヒットした分
        if(hit_dat[i].flag==1){//数える
            num++;
        }
    }
    if(num>0){//ヒットしたもんがあったら
        /*ここでヒットしたデータをkndごとにソートする*/
        /*今回はここは省略し、単にHIT_Xに近い物をヒットとする*/
        for (i = 0; i < num - 1; i++) {
            for (j = i + 1; j < num; j++) {
                if (fabs(hit_dat[i].x-HIT_X) > fabs(hit_dat[j].x-HIT_X)) {
                    hit_dat_t t;
                    t=hit_dat[i];   hit_dat[i]=hit_dat[j];  hit_dat[j]=t;
                }
            }
        }
        i=hit_dat[0].id; knd=hit_dat[0].knd; x=hit_dat[0].x;
        //登録処理
        if((k=serch_kekka())!=-1){
            enter_kekka(k,knd,x,HIT_Y-40);
            add_score(knd);
        }
        bullet[i].flag=0;
    }
    //効果音を鳴らす
    if(ch.don==1)
        se_flag[0]=1;
    if(ch.ka==1)
        se_flag[1]=1;
}


再び質問すみません。上のコードの
コード[C++]: 全て選択
1
2
3
4
5
6
7
        i=hit_dat[0].id; knd=hit_dat[0].knd; x=hit_dat[0].x;
        //登録処理
        if((k=serch_kekka())!=-1){
            enter_kekka(k,knd,x,HIT_Y-40);
            add_score(knd);
        }
        bullet[i].flag=0;

の部分で、ヒットの登録処理を0番目のものしかしていない理由はなんなのでしょうか。

Name: Dixq (管理人)
(管理人)
[URL]
ウィザード(1,488,004 ポイント)
Date: 2017年11月07日(火) 22:50
No: 2
(OFFLINE)

 Re: 太鼓の鉄人のヒットの登録処理を一度に全部しない理由

これも10年前のコードなので予測ですが、
一番近くにある譜面データのみを計算対象としているのだと思います。
そうならそのようなメソッドを分かり易く作れよという突っ込みがありそうですが・・。
ヒット有効範囲内に2つ譜面があったとき、両方を採用すると判定をどうしていいかわからないので、
よりピッタリに近い方を採用しているのだと思います。
ビーマニとかの難しい速い曲とかを想像してもらったら分かる通り、
ヒット有効範囲に複数譜面が存在することがあると思いますが、その時はよりピッタリに近い方を入力対象に採用しているはずです。

昔の自分のコードは見たくないですね。。。。

Name: sakurasaku
[URL]
Date: 2017年11月10日(金) 21:39
No: 3
(OFFLINE)

 Re: 太鼓の鉄人のヒットの登録処理を一度に全部しない理由

なるほど、そういうことだったんですね。本当にありがとうございます。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[17人]