Exemple #1
0
        public ActionShootArrow(int start_wait, RouteAsShoot route_as_shoot, bool is_success)
        {
            this.timer_start_wait = start_wait;
            this.is_success       = is_success;
            this.route_as_shoot   = route_as_shoot;

            model_arrow = ModelManager.RentModel("戦闘/矢");

            var start_x = route_as_shoot.start_x * correct;
            var start_y = route_as_shoot.start_y * correct + 20.0f;
            var start_z = route_as_shoot.start_z * correct;

            var end_x = route_as_shoot.end_x * correct;
            var end_y = route_as_shoot.end_y * correct;
            var end_z = route_as_shoot.end_z * correct;


            route_xz_list      = new List <Point>(route_as_shoot.route_pos_list_xz);
            route_y_list       = new List <Point>(route_as_shoot.route_pos_list_route);
            direction_list     = new List <RouteAsShoot.ExDPoint>(route_as_shoot.direction_list_route);
            correct_time_to_xz = (double)route_xz_list.Count() / shoot_time;
            correct_time_to_y  = (double)route_y_list.Count() / shoot_time;

            // 弓の向きを計算
            // もともとのモデルが -x方向に向いているのでこのような計算になる
            rot_y = (float)(Math.PI - route_as_shoot.direction);
            model_arrow.Rot(0, rot_y, 0);

            start_pos = DX.VGet(start_x, start_y, start_z);
        }
Exemple #2
0
        public override void Update()
        {
            if (timer_start_wait > 0)
            {
                timer_start_wait--;
                return;
            }

            var g3d_map = GameMain.GetInstance().g3d_map;
            var t       = timer; if (t >= shoot_time)
            {
                t = (int)shoot_time - 1;
            }
            var xz_time = (int)(t * correct_time_to_xz);
            var y_time  = (int)(t * correct_time_to_y);
            var now_x   = route_xz_list[xz_time].X * correct;
            var now_y   = route_y_list[y_time].Y * correct;
            var now_z   = route_xz_list[xz_time].Y * correct;

            // 回転で対応するのが難しかったので
            // 矢にモーションを付けて、角度をつけるようにした
            // 時刻0f:90度 → 10f:0度 →20f:-90度
            // と、移り変わるので、角度から目標の時刻を算出する
            var motion_frame_rot = direction_list[y_time].rot * 180.0 / Math.PI;
            var motion_frame     = 0.0f;

            if (motion_frame_rot > 0) // 0度 <  < 90度
            {
                motion_frame = (float)((90.0 - motion_frame_rot) / 9.0);
            }
            else if (motion_frame_rot == 0.0) //  0度
            {
                motion_frame = (float)(10.0);
            }
            else if (motion_frame_rot == -90.0) // -90度
            {
                motion_frame = (float)(20.0);
            }
            else // -0度 <  < -90度
            {
                motion_frame = (float)(10.0 + (-motion_frame_rot) / 9.0);
            }

            model_arrow.Pos(now_x, now_y, now_z);
            model_arrow.Rot(0, rot_y, 0);
            model_arrow.SetMotionDirectFrame(0, motion_frame);
            model_arrow.Update();


            timer++;

            if (timer >= 100)
            {
                is_end = true;
            }
        }