IV. Giao tiếp với các DLL
b. Rơi từ trên xuống
Trong khi sự di chuyển theo chiều ngang của người chơi chủ yếu được tác dụng từ các lực do người sử dụng ấn phím, thì sự di chuyển theo chiều dọc là do tác dụng của trọng lực tác dụng vào người chơi. Nếu người chơi đang đứng
ở trên mặt đất, nó sẽ khơng cần di chuyển theo chiều dọc. Nhưng nếu người
chơi bỗng nhiên rơi vào khơng trung – như nếu nó tiến đến một vực thẳm, thì nó nhất định phải rơi xuống. Để xác định người chơi có ở trạng thái này hay khơng, cần phải xác định người chơi cách đất bao nhiêu. Chúng ta sẽ sử dụng lệnh trace:
Chương 4: Cài đặt
Lệnh trace trả về khoảng cách đến chướng ngại vật đầu tiên mà một tia giữa 2
điểm (2 vector được đưa). Chúng ta đang sử dụng điểm trung tâm của người
chơi (my.x) là điểm thứ nhất, và điều chỉnh điểm temp để nó là điểm thứ 2 nằm phía dưới người chơi khoảng 4000 quant. Bằng cách sử dụng chế độ use_box, chúng ta đang sử dụng tia truy tìm có một bề dày là vỏ bao bên ngồi người chơi, thơng thường có đường kính là 32 quant – nó cũng trả về khoảng cách
đến điểm dưới cùng của hộp bao bên ngoài người chơi, không phải là trung tâm
action move_me {
while (1) {
force.PAN = -10 * KEY_FORCE.X; // tính lực quay
my.SKILL14 = TIME*force.PAN + max(1-TIME*0.7,0)*my.SKILL14; // tính vận tốc quay
my.PAN += TIME * my.SKILL14; // quay người chơi force.X = 10 * KEY_FORCE.Y;
my.SKILL11 = TIME*force.X + max(1-TIME*0.7,0)*my.SKILL11; // tính vận tốc tiến về trước
dist.X = TIME * my.SKILL11; // quãng đường đi được về phía trước dist.Y = 0;
vec_set(temp,my.x);
temp.z -= 4000; // một vị trí nằm dưới người chơi 4000 quants
// chọn các chế độ truy tìm các thực thể và bề mặt từ vị trí của người chơi
trace_mode =
ignore_me+ignore_sprites+IGNORE_MODELS+USE_BOX; dist.z = -trace(my.x,temp); // trừ khoảng cách theo chiều dọc move_mode = ignore_passable + glide;
ent_MOVE(dist,nullvector); // di chuyển người chơi move_view(); // di chuyển camera
wait(1); }
Chương 4: Cài đặt
của người chơi. Nếu chúng ta xem điểm dưới cùng của hộp bao bên ngoài là chân của người chơi, thì lệnh trace sẽ tính chân người chơi đang cách mặt đất là bao nhiêu. Nếu chân của nó đang ở dưới nền đất, lệnh trace sẽ trả về kết quả âm. Vì thế dist.z được gán bằng phủ định của khoảng cách trả về từ lệnh trace. Theo phương pháp này, người chơi có thể đi bộ giữa những vùng có độ cao khác nhau, như lên hoặc xuống cầu thang. Chú ý để cho đơn giản chúng ta dùng vector khoảng cách tương đối (dist) để di chuyển người chơi theo hướng
Z. Thông thường ở đây, nên sử dụng khoảng cách tương đối. Nhưng người chơi
sẽ điều chỉnh đến các độ cao khác nhau ngay lập tức. Cách di chuyển này rất không tự nhiên. Để cho sự di chuyển được tự nhiên hơn, chúng ta sẽ tìm các lực tác động đến người chơi theo hướng thẳng đứng:
- Khi người chơi là một chiếc máy bay thì lệnh trace trả về một giá trị lớn hơn 0 - chỉ những lực hấp dẫn và ma sát mới tác dụng lên nó. Lực hấp dẫn ở đây là trọng lực mà chúng ta đã đề cập, nó kéo người chơi xuống phía dưới.
- …cho đến khi người chơi tiến đến mặt đất hoặc chìm vào nó - lệnh trace sẽ trả về một giá trí nhỏ hơn hoặc bằng 0. Trong trường hợp này thì lực
đàn hồi sẽ tác động. Đây là loại lực mới, nó càng mạnh khi người chơi
càng chìm sâu trong nền đất. Nó tạo ra cho người chơi một gia tốc
hướng lên. Hơn nữa gia tốc của người chơi sẽ tăng đáng kể khi người
chơi tiến vào mặt đất.
Sử dụng kĩ thuật này, và tùy theo trung tâm của thực thể người chơi, mà chân của thực thể có thể đi xuyên qua bề mặt rắn, không thể qua được. Trong thế giới thực loại bề mặt này dĩ nhiên không bao giờ đi qua được, nhưng với
đầu gối của người chơi, nó sẽ tạo ra cùng tác dụng. Vì thế sự xuất hiện của lực đàn hồi là kết quả từ việc nhún của đầu gối - nếu người chơi là một động cơ –
Chương 4: Cài đặt
lực ma sát trên nền đất bằng lực ma sát được tạo ra bởi lực nhún của người chơi hoặc bộ giảm xóc của xe.
var friction; action move_me {
while (1) {
force.PAN = -10 * KEY_FORCE.X; // tính lực quay
my.SKILL14 = TIME*force.PAN + max(1-TIME*0.7,0)*my.SKILL14; //
vận tốc quay
my.PAN += TIME * my.SKILL14; // quay người chơi vec_set(temp,my.x);
temp.z -= 4000; // một vị trí nằm dưới người chơi 4000 quants
// chọn các chế độ truy tìm các thực thể và bề mặt từ vị trí của người chơi
trace_mode =
ignore_me+ignore_sprites+IGNORE_MODELS+USE_BOX; result = trace(my.x,temp); // subtract vertical distance to ground if (RESULT > 5) // có phải đang ở trong không gian?
{
force.X = 0; // khơng có lực đẩy force.Y = 0;
force.Z = -5; // trọng lực
friction = 0.1; // lực ma sát của khơng khí }
Chương 4: Cài đặt
Bằng cách sử dụng lệnh if với kết quả truy tìm được, chúng ta có thể xác định người chơi đang ở trong khơng khí hoặc cách mặt đất 5 quant. Trong trường
hợp đầu tiên, các lực được tạo ra từ bàn phím sẽ khơng có tác dụng, mà người chơi sẽ rơi xuống dưới tác dụng của trọng lực. Trong trường hợp sau, xuất hiện lực đàn hồi tương ứng với độ sâu khi thực thể chìm vào mặt đất, sẽ đẩy người chơi ra khỏi mặt đất. Chúng ta đang sử dụng nhiều skill của thực thể, skill13 sẽ lưu vận tốc theo phương thẳng đứng hiện tại của thực thể.