Упрощённый вариант использования ландшафтов часть II взаимодействие
Статья: «Упрощённый вариант использования ландшафтов часть II взаимодействие».
Надеюсь вы не пропустили первую часть! В этой части я напишу о взаимодействии с ландшафтом. Мы заставим двигаться камеру по поверхности, ландшафта, и не просто двигаться а облигать все припятствия, и даже падать с них Для начало создайте простой объект камеры. Без лишних наворотов. В создании камеры, пишем: rotxsm=0;//углХ головы rotxygl=0;//углX тела myspeed=0.7;//скорость ходьбы myspeed2=0;//скорость бега(для шифтам) max_range=8000;//расстояние при котором виден ландшафт min_range=2; //тоже расстояние при котором виден ландшафт mouse_speed=0.2;//скорость мыши z=13;//и так понятно view=90;//вид в градусах height=9;//высота MoveCamera();//создание камеры В степи камеры: time_factor=100/max(20,fps);//фактор меняющегося фпс //это вращение камерой при помощи мыши(менять не надо): GetMousePos(); rotx+=(global.mouse_y-display_get_height()/2)*mouse_speed; if(rotx<-60) rotx=-59; if(rotx>60) rotx=59; roty+=(global.mouse_x-display_get_width()/2)*mouse_speed; SetMousePos(display_get_width()/2,display_get_height()/2); MoveCamera();//степ камеры Так, основную часть написали. Теперь само взаимодействие с ландшафтом. Ставим в степ: z=GetTerrainHeightAtPos(terrain,x,y);//вытаскиваем высоту в точки (x,y), на объект ландшафта(terrain) Смотрим- камера стоит прям на ландшафте. Добавим управление: //БЕГ: if(keyboard_check(vk_shift)){ myspeed2=myspeed; }else{ myspeed2=0; } //управление ходьбой if(keyboard_check(vk_up)){//если нажали вперёд Move(0,roty,(myspeed+myspeed2)*time_factor); //идём в сторону которую повёрнуты, на скорости (ходьбы+скорости бега)и умножаем фактор фпс } if(keyboard_check(vk_left)){ Move(0,roty-90,(myspeed+myspeed2)*time_factor); } if(keyboard_check(vk_right)){ Move(0,roty+90,(myspeed+myspeed2)*time_factor); } if(keyboard_check(vk_down)){ Move(0,roty-180,(myspeed+myspeed2)*time_factor); } Всё теперь камера готова! Можно по ходить по ландшафту! Теперь зделаем что-бы камера не лазила по стенам! Для начало добавим в папку скрипты, скрипт rotation. А в него пишем: var curangle, newangle, step, dif; curangle = argument0; newangle = argument1; step = argument2; dif = abs(newangle - curangle) while dif >= 360 dif -= 360 if dif > 180 dif = 360 - dif dif = abs(dif) temp = sin(degtorad(newangle - curangle)) if curangle != newangle curangle += min(step,dif)*temp //by Tetrider rotation. В степ ставим: point1=(z-6); point2=GetTerrainHeightAtPos(terrain,x+sin(degtorad(roty))*-8,y+cos(degtorad(-roty))*-8,0,90,0)-1; point3=GetTerrainHeightAtPos(terrain,x+sin(degtorad(roty+90))*5,y+cos(degtorad(-roty-90))*5,0,90,0); rotxygl=rotation(rotxygl,180-point_direction(0,0,-8,point1-point2),1.3*time_factor); rotz=rotation(rotz,point_direction(0,0,5,point1-point3)-50,0.9*time_factor); if(point_direction(0,0,5,point1-point3)-50>33){//если сильно наклонено тело в лево Move(0,roty-90,1.4*time_factor);//летим в лево } if(point_direction(0,0,5,point1-point3)-50<-33){//если сильно наклонено тело в право Move(0,roty+90,1.4*time_factor); //летим в право } if(180-point_direction(0,0,-8,point1-point2)>43){//если сильно наклонено тело вперёд Move(180-point_direction(0,0,-8,point1-point2),roty,1.4*time_factor); //летим вперёд } if(180-point_direction(0,0,-8,point1-point2)<-43){//если сильно наклонено тело назад Move(180-point_direction(0,0,-8,point1-point2)-180,roty,1.4*time_factor);//летим назад } //падение конечно немного заключено, но для начало пойдёт)))
Вот и всё, ваша камера отлично взаимодействует с ландшафтом. Здесь и плавное движение головой, и всё остальное.