IV. Giao tiếp với các DLL
2. Cách di chuyển camera theo người chơi
2.1. Tầm nhìn của người thứ nhất
else // đang ở trên mặt đất {
force.X = 10 * KEY_FORCE.Y; // lực quay force.Y = 0;
force.Z = -0.5 * RESULT; // lực nẩy friction = 0.7; // lực ma sát dưới nền đất }
my.SKILL11 = TIME*force.X + max(1-TIME*friction,0)*my.SKILL11; // tính vận tốc tiến về phía trước
my.SKILL13 = TIME*force.Z + max(1-TIME*friction,0)*my.SKILL13; // tính vận tốc theo phương thẳng đứng
dist.X = TIME * my.SKILL11; // quãng đường tiến về phía trước dist.y = 0;
dist.Z = TIME * my.SKILL13; // quãng đường rơi xuống move_mode = ignore_passable + glide;
ent_MOVE(dist,nullvector); // di chuyển người chơi move_view(); // di chuyển camera theo
wait(1); }
Chương 4: Cài đặt
Hãy đặt viết mã nguồn như sau:
Và gọi hàm init_camera trong hàm main sau khi gọi hàm level_load. Lưu và chạy ứng dụng. Khi đó camera sẽ di chuyển theo người chơi.
Chúng ta đã định nghĩa một khung nhìn mới. Hãy tượng tượng một khung nhìn trong game. Nó chỉ là một cửa sổ. Chúng ta có thể xác định vị trí và kích thướt của cửa sổ bằng cách điều chỉnh các thuộc tính pos_x, pos_y, size_x, size_y.
Như trên, chúng ta đã định nghĩa, góc trên bên trái của khung nhìn trùng với góc trên bên trái của màn hình và có kích thướt của nó cũng bằng kích thướt của màn hình. view 1st_person { layer = 1; pos_x = 0; pos_y = 0; } function init_cameras() { camera.visible = off; 1st_person.size_x = screen_size.x; 1st_person.size_y = screen_size.y; 1st_person.genius = player; 1st_person.visible = on; } function update_views() { 1st_person.x = player.x; 1st_person.y = player.y; 1st_person.z = player.z; 1st_person.pan = player.pan; 1st_person.roll = player.roll; 1st_person.tilt = player.tilt; }
Chương 4: Cài đặt
Hàm update_views, sẽ được cập nhật sau mỗi trạng thái và thay đổi tọa độ x, y, z của camera trong game. Ở đây, chúng ta thay đổi nó đến tọa độ của người
chơi, vì thế làm cho camera ln ln ở bên trong người chơi.
Đoạn mã vẫn chưa được hoàn hảo. Ví dụ, nếu camera được đặt ở điểm trung
tâm của mơ hình người chơi, khơng ở trên đầu, là nguyên nhân làm cho khung nhìn đặt quá gần nền đất. Như vậy chúng ta chưa thể nhìn lên hoặc xuống. Chúng ta định nghĩa thêm một biến ở đầu đoạn mã.
var eye_height = 20;
và thay vì
1st_person.z = player.z;
chúng ta viết lại là:
1st_person.z = player.z + eye_height;
Nó sẽ điều chỉnh camera lên cao hơn 20 quant. Nếu giá trị này chưa được tốt, có thể điều chỉnh lại trong lúc chơi game.
Bây giờ, chúng ta muốn người chơi có thể nhìn lên hoặc nhìn xuống. Để thực hiện được, chúng ta cần các biến sau:
var tilt_1st = 0; var cam_turnspeed = 2; var max_tilt_1st = 40; và thay đổi dòng mã: 1st_person.tilt = player.tilt; thành:
1st_person.tilt = player.tilt + tilt_1st;
Chương 4: Cài đặt
Những hàm này phải được gọi trong lúc chơi game. Ví dụ, chúng ta có thể định nghĩa như thế này:
on_pgup = look_up; on_pgdn = look_down;
Hãy lưu lại và chạy thử. Không tồi, nhưng chưa có tác dụng như mong muốn. Nếu ấn một phím và giữ nó, thì khung nhìn chỉ di chuyển một ít và sẽ khơng thay đổi nữa. Chúng ta phải ấn nó nhiều lần để khung nhìn có thể di chuyển và
điều này quá chậm chạp.
Chúng ta sẽ thay đổi nó như thế nào? Thay đổi định nghĩa on_pageup và
on_pagedown như sau: on_pgup = handle_pageup; on_pgdn = handle_pagedown;
Và định nghĩa 2 hàm sau:
function look_up() {
if (tilt_1st < max_tilt_1st) { tilt_1st += cam_turnspeed; } }
function look_down() {
if (tilt_1st > -max_tilt_1st) { tilt_1st -= cam_turnspeed; } }
Chương 4: Cài đặt
Theo cách này các hàm của chúng ta sẽ được gọi trong mỗi trạng thái trong khi các phím này đang được ấn. Nếu camera quay quá nhanh hoặc quá chậm, có
thể điều chỉnh giá trị cam_turnspeed. Nếu phạm vi của khung nhìn q nhỏ và
để người chơi có thể thay đổi góc nhìn nhiều hơn, hãy thay đổi biến
max_tilt_1st. Giá trị 90 ở đây có nghĩa là: người chơi có thể nhìn thẳng lên
hoặc xuống. Giá trị trên 90 tức là người chơi có thể nhìn ngược ra sau.