IV. Giao tiếp với các DLL
2. Cách di chuyển camera theo người chơi
2.3. Cách để cho camera tránh chạm vào tường
Ý tưởng là gửi một tia từ người chơi đến vị trí mới của camera, nếu thấy có một chướng ngại vật nằm trên tia này. Khi đó, khoảng cách giữa người chơi và camera cần được thay đổi… bằng khoảng cách giữa người chơi và chướng ngại vật.
Thêm những dòng sau vào hàm update_views:
var dist_total = 300; // thay đổi giá trị này để tiến lại gần hoặc ra xa thực thể var tilt_3rd = 0; function update_views() { ... else {
dist_planar = cos (tilt_3rd) * dist_total;
3rd_person.x = player.x - cos (cam_angle) * dist_planar; 3rd_person.y = player.y - sin (cam_angle) * dist_planar; 3rd_person.z = player.z + sin (tilt_3rd) * dist_total; 3rd_person.pan = cam_angle;
3rd_person.roll = 0; 3rd_person.tilt = - tilt_3rd; }
Chương 4: Cài đặt
Hàm này xác định vị trí của camera một cách hồn tồn giống như cách trên, nó chỉ sử dụng một khoảng cách mới đến người chơi, đó là khoảng cách từ
người chơi đến chướng ngại vật. Nó sẽ thay đổi từ từ để ngăn chặn việc camera nằm bên trong bức tường.
Để đặt camera sau người chơi, chúng ta thay đổi những dòng:
3rd_person.x = player.x - cos (cam_angle) * dist_planar; 3rd_person.y = player.y - sin (cam_angle) * dist_planar;
function update_views() { ... 3rd_person.roll = 0; 3rd_person.tilt = - tilt_3rd; validate_view(); } ... }
hàm trên sẽ được định nghĩa như sau:
var dist_traced;
function validate_view() {
my = player;
trace_mode = ignore_me + ignore_passable; dist_traced = trace (player.x, 3rd_person.x);
if (dist_traced == 0) { return; } // không chạm vào bất kì chướng ngại vật nào
if (dist_traced < dist_total) {
dist_traced -= 5; // Di chuyển ra ngoài bức tường dist_planar = cos (tilt_3rd) * dist_traced;
3rd_person.x = player.x - cos (cam_angle) * dist_planar; 3rd_person.y = player.y - sin (cam_angle) * dist_planar; 3rd_person.z = player.z + sin (tilt_3rd) * dist_traced; }
Chương 4: Cài đặt
3rd_person.x = player.x - cos (cam_angle + player.pan) * dist_planar; 3rd_person.y = player.y - sin (cam_angle + player.pan) * dist_planar;
chúng ta chỉ cần thêm góc quay của thực thể (player.pan) vào cam_angle.