Показать сообщение отдельно
Старый 04.03.2007, 05:35   #4
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Re: Обзор камеры и хотьба

Устанавливаешь пивот на уровне головы игрока
Камеру ставишь позади игрока и крепишь к пивоту

Сам алгоритм такой:
Вычисляешь углы поворота для пивота камеры:
;Накапливаем углы через скорость перемещения мыши
;Уменьшаем скорость мыши умножением на коэффициент меньше единицы
ПоворотПоY = ПоворотПоY + MouseXSpeed() * ЧувствительностьМыши
ПоворотПоX = ПоворотПоX + MouseYSpeed() * ЧувствительностьМыши

;Сдвигаем мышь в центр экрана для того чтобы указатель мыши не
;достиг края экрана, иначе мышь остановится и скорость измерятся
;не будет соотвественно :)
MoveMouse(ПоловинаШириныЭкрана, ПоловинаВысотыЭкрана)

;Ограничиваем "переполнение" переменных и заодно устанавливаем макс. обзор камеры.
If (ПоворотПоY > 360) Then ПоворотПоY = 0
If (ПоворотПоY < 0) Then ПоворотПоY = 360
If (ПоворотПоX > 55) Then ПоворотПоX = 55
If (ПоворотПоX < -35) Then ПоворотПоX = -35

;Поворачиваем пивот камеры по вычисленным углам
RotateEntity(ПивотКамеры, ПоворотПоX, ПоворотПоY, 0)
Макс. обзор (вверх\вниз) можно сделать другим, но этот по-моему наиболее соотвествует "ГТАшному"

Далее нужно сделать движение игрока
If MouseDown(2) Then
    ;Сдвигаем тело игрока вперед
    MoveEntity(ТелоИгрока, 0, 0, СкоростьПеремещения)

    ;Узнаем координаты тела игрока
    ТелоИгрокаX = EntityX(ТелоИгрока)
    ТелоИгрокаY = EntityY(ТелоИгрока)
    ТелоИгрокаZ = EntityZ(ТелоИгрока)

    ;Позиционируем пивот камеры на место тела игрока (точнее его головы)
    ;в данном случае высота игрока 2 метра :) поэтому сдвигаем пивот от
    ;центра тела игрока вверх на 2 единицы
    PositionEntity(ПивотКамеры, ТелоИгрокаX, ТелоИгрокаY + 2, ТелоИгрокаZ)

    ;Проверяем разницу углов поворота тела игрока и пивота камеры
    ;Таким образом определяем скорость направления тела игрока
    ;на направление камеры - если игрок только начинает движение и
    ;камера направлена в сторону, то игрок будет направляться медленно,
    ;иначе - быстро
    ;Оператор Int нужен чтобы отбросить дробную часть полученого
    ;значения для "сглаживания" погрешности
    If Int(EntityYaw(ТелоИгрока) - EntityYaw(ПивотКамеры)) = 0 Then
        СкоростьНаправления = 1
    EndIf

    ;Направляем тело игрока по вектору Игрок-Камера, т.е. по направлению
    ;камеры, с заданной скоростью
    ;Но т.к. камера находится сзади, то вектор вычисляем не от игрока к
    ;камере, а наоборот от камеры к игроку
    AlignToVector(ТелоИгрока, ТелоИгрокаX - EntityX(Камера, 1), 0, ТелоИгрокаZ - EntityZ(Камера, 1), 3, СкоростьНаправления)

Else 
    ;Если игрок не перемещается - ставим небольшую скорость
    ;направления, чтобы в начале перемещения игрок направлялся плавно
    СкоростьНаправления = 0.1
EndIf
Вот собственно и все, надеюсь поймешь
Смотри аттач с исходником, но там комментариев нет.

ЗЫ
А чего у вас со смайликами?
(Offline)
 
Ответить с цитированием