IV. Giao tiếp với các DLL
2. Cách di chuyển camera theo người chơi
2.2. Quay tự do tầm nhìn của người thứ 3
Bây giờ chúng ta muốn tạo ra một khung nhìn có thể quay của người thứ 3. Có hai cách thực hiện: cách thứ nhất là tạo ra một camera ở bên ngồi người chơi và khơng quay, ngay cả khi nó đi, ln ln đối diện với nó từ một hướng nào
đó. Cách thứ 2 là tạo ra một camera có thể rẽ khi người chơi rẽ, vì thế nó sẽ
ln nằm ở đằng sau người chơi (hoặc trước, hoặc bên cạnh …).
Chúng ta sẽ làm cho camera này có thể rẽ và phóng to thu nho tự do. Để bắt
đầu, chúng ta sẽ tạo ra một khung nhìn của người thứ 3 ln ln đối mặt với
function handle_pageup() { while (key_pgup) { look_up(); wait(1); } } function handle_pagedown() { while (key_pgdn) { look_down(); wait(1); } }
Chương 4: Cài đặt
người chơi từ một hướng và những thay đổi khi muốn khung nhìn quay cùng với thực thể.
Định nghĩa khung nhìn thứ 2 như sau:
Chúng ta chưa làm cho nó có thể nhìn thấy được. Thay vì, chúng ta sẽ có thể thay đổi camera trong lúc chơi game. Chúng ta sẽ định nghĩa thủ tục chuyển đổi camera ngay bây giờ:
view 3rd_person { layer = 1; pos_x = 0; pos_y = 0; }
Thêm dòng sau vào bên trong hàm "init_cameras":
...
3rd_person.size_x = screen_size.x; 3rd_person.size_y = screen_size.y; ...
var cam_mode = 0; // 0 cho người thứ nhất, 1 cho người thứ 3 function toggle_cams()
{
if (cam_mode == 0)
{ // Thay đổi đến người thứ 3 1st_person.visible = off; 3rd_person.visible = on; cam_mode = 1;
} else
{ // thay đổi đến người thứ nhất 3rd_person.visible = off; 1st_person.visible = on; cam_mode = 0; } } on f8 = toggle cams;
Chương 4: Cài đặt
Như vậy, bằng cách nhấn f8 ta có thể chuyển đổi giữa các khung nhìn. Tuy
nhiên, nó chưa có tác dụng, bởi vì các tọa độ x, y, z của người thứ 3 chưa được
định nghĩa. Chúng ta sẽ định nghĩa ngay giờ bằng cách thay đổi hàm
"update_views".
Nhưng chúng ta sẽ định nghĩa một camera quay quanh người chơi như thế nào? Nó nên nằm trên cùng một mặt phẳng, vì thế giá trị z là giống nhau. Nhưng chúng ta sẽ tính giá trị x và y như thế nào? Chúng ta cần một chút toán học. Tưởng tượng người chơi được quan sát từ phía trên. Cách tốt nhất là lấy một tờ báo và đặt một điểm trên nó, ở một nơi nào đó, để chỉ ra vị trí của người chơi
được thấy từ phía trên. Vẽ một đường trịn xung quanh điểm này. Đây là vòng
tròn mà camera sẽ di chuyển trên đó. Vịng trịn này có một bán kính nào đó. Giả sử trên vịng trịn có một điểm là điểm gốc, khi đó chúng ta có thể xác định một điểm P trên vòng tròn bằng một cung giữa đường thẳng vẽ từ gốc đến tâm và từ P đến tâm của đường trịn.
Như vậy, khi có khoảng cách đến người chơi (bán kính của đường trịn) và một góc trong mặt phẳng thì vị trí của camera sẽ được xác định.
Chương 4: Cài đặt
Lưu mã nguồn và chạy nó. Chọn f8 để chuyển đổi giữa các khung nhìn. Nên
xem người chơi trong khung nhìn của người thứ 3. Khi di chuyển, camera sẽ luôn luôn di chuyển cùng khoảng cách với người chơi, và sẽ khơng thay đổi vị trí khi người chơi rẽ. Nếu thay đổi giá trị của biến dist_planar thì camera sẽ tiến lại gần hoặc lùi ra xa. Nếu thay đổi góc cam_angle thì nó sẽ quay xung quanh người chơi, và luôn luôn đối diện với người chơi.
Tuy nhiên vẫn còn vấn đề khi người chơi ở gần các bức tường. Camera sẽ
thường xuyên đi xuyên qua các bức tường, và các chướng ngại vật sẽ chắn tầm nhìn của người chơi. Chúng ta sẽ giải quyết vấn đề này trong phần sau. Bây giờ chúng ta sẽ thay đổi mã nguồn một ít…chúng ta muốn di chuyển camera lên phía trên nhưng vẫn đối diện với người chơi. Và cũng cần phải giữ cùng
var dist_planar = 300; // khoảng cách đến người chơi var cam_angle = 0; function update_views() { if (cam_mode == 0) { 1st_person.x = player.x; 1st_person.y = player.y;
1st_person.z = player.z + eye_height; 1st_person.pan = player.pan;
1st_person.roll = player.roll;
1st_person.tilt = player.tilt + tilt_1st; }
else {
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; 3rd_person.pan = cam_angle; 3rd_person.roll = 0; 3rd_person.tilt = 0; } }
Chương 4: Cài đặt
khoảng cách đến người chơi, vì thế sự di chuyển khơng cịn theo đường trịn nữa mà theo hình cầu.
Chúng ta sẽ thực hiện điều này như thế nào? Hãy tưởng tượng người chơi được nhìn từ bên cạnh. Nếu camera nằm trên mặt phẳng XY của người chơi. Hãy vẽ một đường thẳng từ nó đến người chơi, chúng ta sẽ nhận được một góc giữa
mặt phẳng XY và đường này. Góc này sẽ xác định chính xác vị trí của người chơi.
Hình sau đây sẽ biểu diễn vị trí của camera trong trường hợp này: Lúc này chúng ta cần chỉnh lại mã nguồn như sau:
Chương 4: Cài đặt
Bằng cách thay đổi giá trị của các biến tilt_3rd, cam_angle, dist_total, chúng ta có thể di chuyển camera tự do xung quanh người chơi. Nó sẽ được di chuyển trên một mặt cầu với bán kính có thể được thay đổi bằng cách thay đổi giá trị của biến.