[Hướng Dẫn] Bài 2: Di chuyển object theo tọa độ

Focker_cFocker_c Posts: 1,577Registered
edited July 2019 in Game Maker: Studio
[Bài 2] Di chuyển object theo tọa độ.
Vâng hôm nay mình tiếp tục khóa học GML với bài thứ 2. Ở bài trước thì mình đã nói là bài này sẽ tiếp tục đi vào cách di chuyển object, nhưng phương pháp viết guide của mình lại rất đặc biệt. Các sẽ học đc nhiều điều qua một bài học chứ ko phải học cái gì, biết cái đấy (Đó là cách học hiện nay từ nhà trường của các bạn, rất thụ động). Và những kiến thức mình liên hệ cho bài học thì cũng đi từ dễ đến khó thôi.
Và đâu tiên cho ngày hôm nay, mình muốn các bạn đi tới cái khái niệm gần gũi nhất của một người lập trình.
Đó là "Biến". T.A: Variable
Viết tắt là "var"
Và đúng cái tên của nó. Biến là đại lượng đúng theo cái tên của nó. Rất biến hóa. Nó tăng giảm đc, thay đổi theo những phép toán khác đc.
Bạn hãy hình dung nó là 1 cục đất sét. Bạn tạo hình dạng cho nó theo ý muốn của mình, thêm đất sét vào, hay véo bớt đất sét đi.
Ví dụ cho dễ hiểu:
| var số lượng đạn còn lại của 1 tên địch (giảm khi thằng cu này bắn súng của nó).
| var số máu của hero trong game (giảm khi bị đánh và tăng khi uống máu).
| var một đoạn chữ trong game mà bạn cần xài liên tục.
| var một sprite mà bạn cần dùng cho object nào đó.
Và thậm chí hspeed và vspeed mà chúng ta học bài trước cũng là biến. Mà mặc định của chúng là bằng 0.
Cái gì cũng có tên của nó ! Vâng ! mỗi var cũng cần có tên của nó.
Như ở ví dụ đầu - cần lập 1 biến là số lượng đạn cho tên địch. Đoạn code, ta viết:
so_dan = 120
Trong đó, "so_dan" là tên của var số đạn (Về việc đặt tên thì các bạn cần phải đặt đúng quy củ, dài thì ko sao, nhưng đúng cách. Ko đc dùng dấu cách. Ko đặt một cái tên tiếng việt. Việc đặt tên sprite, object, room cũng phải thế)
Còn 120 là số đạn đó. Công việc đặt biến lúc đầu này gọi là tạo biến. Bạn phải làm công việc này trong những event "Create" của object. Xin nhắc lại là bạn phải "tạo biến" trước khi dùng vào mục đích gì. Nếu ko, game báo lỗi : "Ko tồn tại Biến đó đâu con giai !"
Và như nói ở trên ta sẽ thử nặn nhào, thêm, véo cục đất sét này nhé.
Khi trong game có event thằng địch này bắn súng, ta sẽ phải kiểm tra. Nếu cái biến "so_dan" mà lớn hơn 0 (tức là còn đạn), thì mới cho "chíu chíu", còn ko là ko cho bắn.
Để đc thế thì khi bắn thì ta phải giảm dần cái "so_dan" kia đi. Giả sử như thằng này là cầm súng ngắm nhá. Bắn từng viên một. "so_dan" sẽ giảm đi 1 mỗi lần nó bắn. Ta có 2 cách làm việc đó.
Cách 1:
so_dan = so_dan - 1
Vâng ! Về mặt toán học, ta hiểu phép tính trên là so_dan mới bằng so_dan hiện tại trừ đi 1 đơn vị. Cũng dễ ^^
Cách 2:
so_dan -=  1
"Ô ! Thế là thế nào ? Đề nghị "thằng" chủ topic xem lại nhá, viết sai phép tính rồi kìa. Sao lại viết dấu trừ đằng trước dấu bằng ?"
Ờ đấy ! Ko sai đâu. Đây là cách làm tắt. Hiệu quả tương đương cách 1. Tức là so_dan mới vẫn bằng so_dan hiện tại trừ đi 1 đơn vị. Mình sẽ hoàn toàn dùng cách 2 trong những bài học tới.

Phép tính như vậy mình tự gọi là phép tịnh tiến (dựa vào tính chất của nó)
Các phép tịnh tiến biến tương tự như thế:
n += 1
=> tăng n lên 1.
n /= 2
=> n mới bằng n cũ chia 2.
n *= 3
=> n mới bằng n cũ nhân 3.
Xong phần liên hệ của bài này. Các bạn đã biết về biến , tạo biến , các phép tịnh tiến biến.
OK ! Nhiều bạn bắt đầu 1 câu hỏi: "mẹ ! cái thằng chủ top hấp vờ lờ. biến với bắn thì liên quan gì đến di chuyển?"
Có chứ ^^ Các bạn cần biết điều "chốt" của bài hôm nay. Đó là tọa độ của object cũng là var. Ko phải 1 mà là 2 var. Các bạn hình dung rằng trong game 2d thì tất cả đều nằm trên 1 cái mặt phẳng dẹp nép (để làm mất cái sự "dẹp nép" thì người ta phải xài những tài nguyên bóng bẩy, giả 3d. RPG Maker làm khá đạt điều này). Mà đã là mặt phẳng thì để xác định đc vị trí của object xem nó đang đang ở đâu, ta cần đến "tọa độ". Tọa độ có 2 var như đã nói 1 là tọa độ x (tăng giảm theo chiều ngang), tọa độ y (tăng giảm theo chiều dọc). Giống như cái trục số các bạn học trên lớp vậy:

toadoxy_zpsa32c0a28png

Nhìn qua trục số, ta thấy object đi từ trái qua phải nếu có tọa độ x tăng lên. Ngược lại tọa độ x mà giảm đi thì object đi từ phải qua trái.
Tọa độ y cũng tương tự. Nhưng lưu ý rằng, x và y mà âm tức là ra ngoài tầm nhìn room rồi đó. Điểm tọa độ (0;0) là điểm góc trên cùng, bên phải của room.
Để chuyển object luôn ra một vị trí trong room. Ta cho tọa độ x,y của object bằng tọa độ cần chuyển tới.
Ví dụ:
x = 100
y=200
Khi này object chứa đoạn code trên sẽ được move ngay lập tức tới điểm tọa độ (100;200) trong room.
Ở bài 1, tôi lấy vị dụ tại event [Keyboard - Left] (Phím mũi tên trái), ta cho hspeed=-3 phải ko ạ? Khi này tốc độ ngang sẽ là 3(Tốc độ thì ko thể âm, dấu "trừ" là để chỉnh hướng) và đi theo hướng trái.
Ở bài này, tôi sẽ thay đoạn code hspeed=-3 bằng đoạn:
x = x - 3
Tức là tôi chuyển object tới một vị trí mới mà có tọa độ x bằng tọa độ x hiện tại - 3. Vị trí mới này sẽ ở bên trái vị trí cũ. Và nếu người chơi cứ ấn phím
liên tục thì việc làm chuyển object sang bên tráinhư trên sẽ đc làm liên tục. Qua đó, tạo đc một cảm giác là object đang di chuyển liên tục về bên trái. Đó là cách làm của bài này.
Và như đã nói, ta có cách viết tắt lại:
x -= 3
Tương tự ta làm với các phím khác: phải, lên, xuống. Sau đó hãy test thử xem đã đúng chưa. Nếu chưa đc thì download cái example gmk của mình ở dưới để làm mẫu.
Điểm mình lưu ý khác với bài trước là ở bài này, ta ko cần phím [No Key]. Lý do là việc chuyển vị trí chỉ đc thực hiện liên tục khi mà người chơi giữ phím liên tục, buông nút ra thì thôi. Còn về xài speed, một khi ấn nút là kích hoạt rồi, biến speed được đặt bằng 1 đại lượng rồi, buông nút ra thì giá trị của speed vẫn thế, cho nên cần [No Key] để cho speed=0.

File example GMK cho bạn:
Download
File exe:
Download
(Mình thêm chức năng là khi ấn phím cách thì đưa object về vị trí tọa độ (100;200), cách làm thì cũng hướng dân, hoặc xem example).

Comments

Sign In or Register to comment.