Có gì mới?

Chào mừng bạn đến với diễn đàn Tui Học Web

Vui lòng đăng ký hoặc đăng nhập để sử dụng hết các tính năng của forum nhé!
  • Thông báo: Hiện tại do admin không có nhiều thời gian và không thể tiếp tục quản trị và maintain forum, do đó forum sẽ có dự định được đóng lại từ 06/2022, cảm ơn mọi người đã đồng hành cùng forum suốt thời gian vừa qua. Cảm ơn rất nhiều.

Chia sẻ Cái nhìn tổng quan về Game và các thành phần liên quan

Chia sẻ

Cái nhìn tổng quan về Game và các thành phần liên quan​

Oke hello anh em, sau khi mình release bài thứ nhất
Ồ, bạn chưa phải thành viên của forum Đăng nhập hoặc đăng ký ngay.
thì khá nhiều anh em có hứng thú với việc học Hacking Game cơ bản này :daica:
Thế nên hôm nay mình sẽ viết tiếp bài thứ hai, các thành phần cơ bản và cái nhìn chung về một chương trình Game ha.

Trước tiên, chúng ta sẽ tìm hiểu xem thành phần chính của một con game được tạo ra như thế nào?

Các thành phần đó là:
  • Đồ họa
  • Âm thanh
  • Đầu vào (các hành động của người dùng, các thông số đưa vào)
  • Các tính chất vật lý (nói chung game mà đảm bảo tính chất vật lý hơn thì nó sẽ giống thật hơn và đưa lại trả nghiệm hay hơn, dễ nghiện hơn đúng ko :2lol: )
  • Game logic (tính logic của game, ok cái này chắc khỏi phải bàn, ví dụ mà súng bắn ra đạn chứ súng mà bắn ra con gà là hơi sai rồi đó, nhảy trên lầu 10 xuống ko sao hết, hoặc bị bắn bằng khẩu bazoka súng tăng nhưng ko xây xước :v)
Đó là các thành phần của game, nhưng hầu hết các game đều dùng thư viện ngoài để dùng cho việc xuất đồ họa, hiển thị hình ảnh game, các cách để tạo ra các map chẳng hạn. Những cái này được gọi là thư viện (external libraries). Ví dụ như DirectX hoặc OpenGL chẳng hạn, những thư viện rất là nổi tiếng, rồi thì các game engine như Unreal, CryEngine, ... đã cung cấp sẵn các thư viện và các cấu trúc cần thiết để viết game rồi, điều này làm giảm thiểu một lượng lớn thời gian phải ngồi code từng thư viện cho anh em developer.

OKE, vậy hack game chính là làm gì?

Hack game có nhiều cách tiếp cận, ví dụ như hack wall, thằng hacker có thể thấy những thằng player khác chính là sửa đổi cái code chạy thư viện OpenGL hoặc DirectX đó. Mình không nói là toàn bộ game đều dùng hai thư viện này nha a e, rất nhiều game họ tự sử dụng riêng Engine Graphic riêng của mình, nhưng về cái cơ bản nên mình viết cách tiếp cận đơn giản nhất là từ hai cái thư viện phổ biến nhất này.

Hầu hết các kiểu hack game là sửa đổi tính logic của game, ta sẽ thay đổi luồng thực thi của game theo ý của mình. Ví dụ như trong game, nhân vật chỉ được cấp và giới hạn một lượng sát thương nhất định, bạn thay đổi lượng sát thương được cấp đó lên 9999 chẳng hạn, thế là bạn thành bá chủ của cái game cmnr :bacda:

Nói về cấu trúc của game

Game logic thì cũng chỉ là những dòng code, những dòng lệnh được nạp vào CPU mà thôi. Bạn đừng nghĩ nó sâu xa quá :v nó thực sự y chang chẳng khác gì một chương trình chạy trên máy tính, nó có hàm main, có vòng lặp, có các sự kiện, có các hàm để xử lý từng mục đích cụ thể. Và từ đấy, chúng ta rút ra được, hầu hết các game đều có một cấu trúc nhất định:
  • Lúc bạn khởi chạy game, game sẽ nạp và khởi tạo các thông số cần thiết -> chúng ta gọi phần này là phần SETUP
  • Lúc bạnđã vàođược game rồi, vào trận các kiểu rồi, thì lúcđó, bạn có thấy lànếu bạn thua game này, rồi bạn nhấn chơi tiếp, bạn vào game khác, bạn tăng các chỉ số, nâng cấp súng các kiểu, nâng cấp nhân vật, mua skin, sơn súng =)) :bacda: rồi lại vào game,đánh tới lúc thắng, rồi lại out ra, rồi lại vào game mới, rồi lạimột vòng lặp như vậy. Chúng ta gọi đây là phần MAIN LOOP của game :cauvangnhay:
Ta cùng đi vào chi tiết một chút:

Phần SETUP của game sẽ chạy khi nào và nó làm cái gì?
Bạn nghĩ đúng rồi đó, SETUP của game thì đương nhiên là sẽ chạy lúc khởi động game. Nó sẽ nạp tất cả những thứ mà game cần như đồ họa, âm thanh, dữ liệu game như map, các loại súng, các loại nhân vật chẳng hạn,... vào bộ nhớ RAM. Đấy là nguyên nhân anh em chạy game một phát, cái bộ nhớ RAM tọt lên 80->90% :))
Tiếp theo là MAIN LOOP, nó làm nhiệm vụ gì?
MAIN LOOP đảm nhận nhiệm vụ xử lý logic, hiển thị đồ họa, các hành động mà người dùng chọn, các thao tác có thể chọn cho người dùng, menu, game actions, rồi các nhân vật khác, các sự vật, nhân vật, thành phần trong lúc chơi game.

Nhìn theo phương diện code, nó sẽ trông như thế này:

C++:
function main_loop() {
    handle_input();
    update_score();
    play_sound_effects();
    draw_screen();
}

Mỗi function nằm trong mainloop sẽ lại gọi các function nhỏ hơn:

C++:
function handle_input() {
    if( keydown == LEFT ) {
        update_player_position(GO_LEFT);
    }
    else if( keydown == RIGHT ) {
        update_player_position(GO_RIGHT);
    }
}

Code trên thực hiện việc di chuyển nhân vật qua trái rồi lại qua phải tùy thuộc vào phím mà người dùng nhấn :bacda:
Đó là mình nói vậy thôi chứ mỗi game có mỗi cách code khác nhau nhé, mình chỉ minh họa đơn giản để anh em hiểu. Tuy nhiên, về cái thằng MAIN LOOP thì đảm bảo với anh em luôn là hầu hết game đều vậy. :echcuoi:

Về dữ liệu và các lớp trong game (class trong lập trình á anh em)

Các dữ liệu trong game có thể được lưu trữ dưới dạng các giá trị ở trong bộ nhớ, được lưu trong thứ mà chúng ta hay gọi là biến (variable). Chúng có thể là số điểm của người chơi, vị trí của người chơi, góc nhìn người chơi, rồi thì số tiền còn lại của người chơi chẳng hạn. Lúc lập trình game khai báo mấy biến kiểu vậy belike:

C++:
int money = 0;

Khổ nỗi trong game méo phải mỗi một thằng chơi, vậy nó thì nó khai báo kiểu vậy ở server:

C++:
int money1 = 0;
int money2 = 0;
int money3 = 0;
int money4 = 0;

Giờ ví dụ tăng tiền của tất cả player mỗi thằng thêm 1 đô thì làm gì, ta sẽ gọi hàm được định nghĩa như sau:

C++:
function increase_money() {
    money1 = money1 + 1;
    money2 = money2 + 1;
    ...
    // ở đây có bao nhiêu thằng thì viết vô hết.
}
Khổ vler nhỉ, vậy nếu giờ có thêm một player chèn vô nữa thì lại phải sửa code à ? :echboom:
Thôi đéo chơi kiểu đó, chúng ta là con người và chúng ta thông minh hơn :v Do đó mình sẽ kiểu bỏ đống player đó vào một mảng sau đó duyệt từng phần tử của một mảng và thêm mỗi thằng 1 đô vào từng phần tử của mảng đó :3 Dễ hơn rồi phải không, khi 1 player được thêm vào thì mình lại thêm thằng player đó vào trong mảng đó là oke :v

C++:
int money[10] = { 0 };
int current_players = 4;

function increase_money() {
    for(int i = 0; i < current_players; i++) {
        money[i] = money[i] + 1;
    }
}

Đấy, nếu một thằng player được thêm vào mình sẽ cho current_players tăng thêm một, và thế nó chạy thôi.
Xong cái vấn đề tăng rồi, thì giờ làm sao để quản lý tốt cho code, rồi không nhẽ giờ mình chỉ lưu được mỗi đống tiền đó cho player rồi thì thôi à ? Còn vị trí, sức mạnh, một tỷ cái chỉ số của nhân vật, rồi thì các thông số khác ảnh hưởng tới nhân vật nữa, trời địu :3 Làm sao giờ ?

Vì cái lí do này mà OOP ra đời. Lập trình hướng đối tượng ra đời.

C++ OOP cho player belike:


C++:
class Player {
    int money;
    string name;

    function increase_money() {
        money = money + 1;
    }
}

Một game thì có cả đống class khác nữa, mỗi class đại diện cho một thực thể trong game, do đó, code dễ quản lý và luồng thực thi cũng mạch lạc hơn.

Bộ nhớ trong game​

Game có cả tỷ tấn data, mình méo thể nói hết trong một bài viết bằng hạt cát này được. Anh em cứ hiểu là những cái tài nguyên này nó sẽ nằm trên đĩa cứng lúc anh em tải về. Qua công đoạn SETUP của game thì nó mới dần dần được tải vào RAM. Không phải nó tải hết một lần đâu nhé, nó cần cái gì thì nó tải cái đó, kiểu vậy.
Hầu hết việc load dữ liệu là ta hiểu là tải nó lên nhưng thực chất trong bộ nhớ, các yêu cầu này được xử lý bằng câu lệnh mov =)) mỗi nó thôi, mov thì có nhiều loại nhưng mình viết chung là MOV, ví dụ như thêm một đô vào số tiền của player như mình nói ở trên:
Mã:
function increase_money:
    mov eax, 0x12345678
    add eax, 1
    mov 0x12345678, eax

Địa chỉ 0x12345678 là địa chỉ chứa số tiền hiện tại của player mình muốn cộng tiền cho nó. Mình đưa địa chỉ này vào trong thanh ghi eax sau đó mình cộng nó lên một :v sau đó mình lại đưa giá trị của eax vào trong vùng nhớ tại địa chỉ 0x12345678.

Nhưng đối với class thì sao, class Player chẳng hạn, thì nó sẽ có offset ở trong bộ nhớ, và nó belike:
Mã:
function increase_money:
    mov ebx, 0x12345670
    mov eax, ebx + 8
    add eax, 1
    mov ebx+8, eax

Cái địa chỉ của class phụ thuộc vào CPU và phần SETUP của game nữa.

Mô hình game​

Đa số mô hình game mà anh em biết hầu hết là Client - Server, kiểu một server sẽ đảm nhiệm việc nhận và xử lý yêu cầu từ client gửi lên, ví dụ bạn bắn một viên đạn vào thằng nào đó, nó sẽ gửi lên server vị trí mà viên đạn bạn bắn ra, rồi server sẽ tính vị trí mà viên đạn xuất phát cũng như là đích mà nó bay tới, nó sẽ so sánh với vị trí hiện tại của thằng mà bạn định bắn hoặc bất cứ thằng nào ở trong cái map đó, nếu trùng là viên đạn đó coi như trúng thằng nào rồi đó. Có khi bạn nhe cò bắn cói, nhe gà bắn vịt :v Ở trong game anh em chắc cũng ko ít gặp :v

  • Client: Là bản game mà bạn đang chạy, nó gồm code xử lý logic, gồm các thông số cơ bản của game.
  • Server: Nơi chứa logic thực sự của game, các thông số nhân vật mang tính quyết định như số tiền, các vũ khí đã nâng cấp, số kim cương còn lại =)), server sẽ đảm bảo là bản game bạn đang chạy có phải là bản copy thực sự hợp lệ hay không, kiểm tra tính logic của game trong suốt quá trình bạn chơi.
 

Bài viết và chủ đề liên quan

shape1
shape2
shape3
shape4
shape7
shape8
Bên trên