Пример #1
0
void NPC::refresh_move_interval(void)
{
	if(get_move_speed() >= 25)
	{
		double x_interval, y_interval, s_interval;

		double time_speed = get_move_speed(); 					// 每毫秒移动多少像素
		double frames_speed = time_speed/interval; 			// 每帧移动像素

//		x_interval = (1000.0 / interval) * ceil(grid_width / round(frames_speed)); // x向移动一格所需毫秒
//		y_interval = (1000.0 / interval) * ceil(grid_height / round(frames_speed)); // y向移动一格所需毫秒
//		s_interval = (1000.0 / interval) * ceil(grid_s / round(frames_speed)); // 斜向移动一格所需毫秒

		x_interval = (1000.0 / interval) * (10 / frames_speed); // x向移动一格所需毫秒
		y_interval = (1000.0 / interval) * (grid_height / frames_speed); // y向移动一格所需毫秒
		s_interval = (1000.0 / interval) * (grid_s / frames_speed); // 斜向移动一格所需毫秒
		if (x_interval/1000 < 0 || x_interval * 1000 <= 0) {
			MSG_USER_TRACE("ERROR_9 error speed:%d x_interval:%ld", get_move_speed(), x_interval);
			return ;
		}

		if (y_interval/1000 < 0 || y_interval * 1000 <= 0) {
			MSG_USER_TRACE("ERROR_9 error speed:%d y_interval:%ld", get_move_speed(), y_interval);
			return ;
		}

		if (s_interval/1000 < 0 || s_interval * 1000 <= 0) {
			MSG_USER_TRACE("ERROR_9 error speed:%d s_interval:%ld", get_move_speed(), s_interval);
			return ;
		}

		move_interval[0].set(x_interval/1000, x_interval * 1000);
		move_interval[1].set(y_interval/1000, y_interval * 1000);
		move_interval[2].set(s_interval/1000, s_interval * 1000);
	}
	else
	{
		move_interval[0] = Time_Value::zero;
		move_interval[1] = Time_Value::zero;
		move_interval[2] = Time_Value::zero;
	}
}
Пример #2
0
void Waver::move(Map *map)
{
    switch(m_action) {
        case Still:
            set_action(Move);
            break;

        case Move:
            face_reference(get_attribute("turn_width"));
            animate_move();
            if (m_dir == Right) {
                set_vx(get_move_speed(map));
            }
            else {
                set_vx(-get_move_speed(map));
            }

            m_wave_index += get_attribute("frequency");
            if (m_wave_index >= c_num_steps) {
                m_wave_index = m_wave_index - c_num_steps;
            }
            set_vy(get_attribute("amplitude") * m_wave_y[m_wave_index] / 16);
            Body::move(map);
            break;

        case Hit:
        case HitPerish:
            set_ay(0);
            set_vy(0);
            process_hit();
            Monster::move(map);
            break;

        default:
            break;
    }
}
Пример #3
0
void MummyDragon::move(Map *map)
{
    Monster::move(map);

    switch(m_action) {
        case Still:
            set_action(Move);
            break;

        case Move:
            if (m_is_flying) {
                set_speed(0, m_fly_speed);
                if (m_fly_timer.check(m_fly_time) ||
                    m_y < m_top || m_y > m_bottom) {
                    m_fly_timer.reset();
                    m_is_flying = false;
                }
            }
            else {
                if (get_left() < m_left || get_right() > m_right) {
                    swap_move_dir();
                    if (m_turn_counter.expired(get_attribute("num_turns"))) {
                        m_fly_time = 600;
                        if (m_y < m_top + 100) {
                            m_fly_speed = get_attribute("fly_speed");
                        }
                        else {
                            m_fly_speed = -get_attribute("fly_speed");
                        }
                        m_is_flying = true;
                    }
                    else {
                        m_attack_timer.enable(true);
                    }
                }

                if (m_dir == Right) {
                    set_speed(get_move_speed(map), 0);
                }
                else {
                    set_speed(-get_move_speed(map), 0);
                }
            }

            animate_move();

            if (m_attack_timer.expired(get_attribute("attack_timer"))) {
                m_attack_timer.enable(false);
                set_attack();
            }
            break;

        case Attack:
            fire();
            break;

        case Hit:
            m_fly_time = get_attribute("fly_time_after_hit");
            m_fly_speed = -get_attribute("fly_speed");
            m_is_flying = true;
            break;

        default:
            break;
    }

    unsigned n = m_bullets.size();
    for (unsigned i = 0; i < n; i++) {
        m_bullets[i]->move(map);
    }
}