PDA

View Full Version : [Gunny] Tổng hợp nghiên cứu Gunny (không dành cho newbie)



meocon5000
09-03-14, 07:19 PM
Chào các bạn !....
Trong topic này mình sẽ chia sẻ những kiến thức mà mình đã nghiên cứu được về Source Game Gunny trong thời gian vừa qua . Mình mong rằng qua topic này các bạn sẽ có thêm kinh nghiệm, kiến thức cũng như là hứng thú hơn khi nghiên cứu game Gunny.



Topic này gồm có các phần sau:

1.Các yêu cầu cần có khi muốn develope gunny.
2.Các vấn đề liên quan đến code C# đơn giản.
3.Cơ bản về nguyên lí hoạt động của mô hình Client-Server.
4.Các phần chính của source gunny.
5.Một vài ví dụ cơ bản về develope một chức năng trong game.
6.Kinh nghiệm của các pro về develope gunny



Một vài điều mình muốn nói với các bạn:
-Các phần trên sẽ được viết lần lượt vào cuối mỗi tuần (thứ 7 hoặc chủ nhật)
-Box Gunny của chúng ta phát triển được như bây giờ hoàn toàn là do nỗ lực của các bạn thành viên box Gunny chứ không phải riêng gì cá nhân nào !
-Chúng ta đã làm được cho nó phát triển như bây giờ thì tại sao chúng ta lại không cố gắng phát triển nó hơn nữa ?
-Mình tin chắc là các bạn có thể làm được, làm cho box Gunny phát triển vượt trội :)


~Chào thân ái và quyết thắng~

meocon5000
09-03-14, 07:33 PM
1.Các yêu cầu cần có khi muốn develope gunny.
-Phần mềm cần thiết :
+ Microsoft Visual Studio 10 hoặc cao hơn. Link : <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
+ Một bộ source gunny. Link : <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b> ---> Dùng bản base của trminhpc là tốt nhất
+ Đã cài sẵn gunny để test.
+ Tool Decrypt của trminhpc. Link : <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
+ Sothink SWF Decomplier 7.1. Link : <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
-Kiến thức cần thiết :
+ Kiến thức căn bản về C# và C# OOP (Lập trình hướng đối tượng)
+ Biết chút ít về cơ chế Client - Server (Ở phần sau mình sẽ nói kí hơn)
+ Đọc hiểu code c# tốt.
+ Biết chút ít về MSSQL,viết Query,Store Procedure,...

meocon5000
09-03-14, 08:38 PM
2.Các vấn đề liên quan đến code C# cơ bản
-Vì Gunny được code bằng ngôn ngữ C# nên nếu muốn develope ta phải dùng ngôn ngữ C#, sau đây là 1 số vấn đề cơ bản về ngôn ngữ lập trình này.
-Ở đây mình chỉ hướng dẫn các bạn một chút về OOP cần thiết để dev gunny, kiến thức cơ bản về C# bạn đã phải nắm vững


Đầu tiên ta cần phải hiểu : Code là gì?
-Làm sao những chức năng như kho báu,châu báu,cường hóa vật phẩm,... có thể hoạt động được?
-Tại sao NPC có thể di chuyển,tấn công và bị mất máu được?
....
Bạn có bao giờ tự hỏi những điều như trên không ? Câu trả lời là : Do người lập trình code chức năng dựa trên các hàm cơ bản được xây dựng sẵn

a)Lớp và đối tượng trong C#


Lớp là gì?
-Lớp trong C# (hay còn gọi là class) là 1 khuôn mẫu cho đối tượng nào đó.Trong lớp bao gồm các phương thức (Method) và thuộc tính (Properties)
Ví dụ:
-Bạn muốn làm một chiếc bánh quy bơ thì các bạn phải có khuôn làm bánh quy bơ (class BánhQuyBơ)
-Trong class BánhQuyBơ thì phải có các phương thức (method) như Trộn_Các_Thành_Phần,Nung_Bánh,... và các thuộc tính (Properties) như Màu_Bánh,Vị_Bánh,...
Đối tượng là gì?
-Đối tượng là tên gọi trong đó bao gồm các thuộc tính (Properties) và phương thức (Method) của class mà nó được khởi tạo
Ví dụ: Từ class BánhQuyBơ ở trên, bạn có thể tạo nhiều đối tượng như Bánh_Của_Bà,Bánh_Tặng_Mẹ,các đối tượng này sẽ mang các thuộc tính như Bánh_Của_Bà có Màu_Bánh là trắng, Vị_Bánh là vani , còn Bánh_Tặng_Mẹ có Màu_Bánh là hồng, Vị_Bánh là dâu
Cách khởi tạo đối tượng từ lớp
-Để khởi tạo đối tượng từ lớp ta dùng cú pháp sau : [Tên_Lớp] [Tên_Đối_Tượng] = new [Tên_Lớp](Các_Tham_Số_Truyền_Vào);
-Để gán các giá trị cho thuộc tính của đối tượng ta làm theo cú pháp sau : [Tên_Đối_Tượng].[Thuộc_Tính] = [Giá_Trị];
Ví dụ : Để tạo các đối tượng Bánh_Của_Bà và gán các thuộc tính cho nó ta làm như sau :


BánhQuyBơ Bánh_Của_Bà = new BánhQuyBơ();//Khởi tạo đối tượng Bánh_Của_Bà
Bánh_Của_Bà.Màu_Bánh = trắng;//Gán giá trị cho thuộc tính Màu Bánh
Bánh_Của_Bà.Vị_Bánh = vani;//Gán giá trị cho thuộc tính Vị Bánh

=>Vậy là bây giờ ta đã có Bánh_Của_Bà với màu trắng và vị vani.


b)Tầm vực của đối tượng trong C#


Tầm vực của class,biến,phương thức và thuộc tính là gì?
-Tầm vực của đối tượng là những từ khóa quy định quyền truy cập của một đối tượng nào vào đối tượng đó
Ví dụ :
-Điện thoại công cộng cho phép ai cũng có thể sử dụng được.
-Điện thoại cá nhân thì chỉ có cá nhân đó mới được quyền sử dụng
-Tài sản kế thừa thì những con cháu trong dòng họ mới có thể dùng được
=>Từ ví dụ trên,ta thấy điện thoại công cộng,điện thoại cá nhân và tài sản thừa kế đều cho phép những ai có quyền dùng và không có quyền dùng, tầm vực trong đối tượng cũng tương tự như vậy.
Vậy làm sao để quy định ai có thể truy cập vào đối tượng và ai không thể ?
-Ta có thể quy định bằng cách dùng những từ khóa : private , public , protected đặt trước đối tượng khi khởi tạo.
Vậy những từ này có ý nghĩa gì ?
-Public : Khi sử dụng class có tầm vực là public thì class đó có thể sử dụng công khai,ở bất cứ đâu,bạn cũng có thể sử dụng các phương thức (method) và thuộc tính (properties) của class đó một cách tự do với điều kiện bạn cũng đặt public ở trước phương thức (method) và thuộc tính (properties) của class đó.
Ví dụ :


public Class Meo // class Mèo được để là public
{
public string Ten; // Biến Tên được để là public
public int Tuoi; // Biến Tuổi được để là public
public string MauLong;// Biến MàuLông được để là public
}
//Bây giờ ta tạo đối tượng của lớp Mèo từ một lớp khác
class Choi
{
Meo conmeo = new Meo();//vì class Mèo là public nên ta có thể tạo đối tượng của nó từ lớp khác
conmeo.Ten = "kitty";//vì biến Tên là public nên ta có thể gọi nó từ đối tượng conmeo ở lớp khác
conmeo.Tuoi = 9;//vì biến Tuổi là public nên ta có thể gọi nó từ đối tượng conmeo ở lớp khác
conmeo.MauLong = "Tam_Thể";//vì biến Màu Lông là public nên ta có thể gọi nó từ đối tượng conmeo ở lớp khác
}


-Private : Từ khóa này không được sử dụng với class mà chỉ có thể sử dụng với biến,phương thức hay thuộc tính.Khi sử dụng từ khóa này thì bạn chỉ có thể sử dụng các phương thức, biến, thuộc tính đó trong class đó mà không thể sử dụng ở class ngoài được.
Ví dụ :
#Bây giờ ta sẽ tạo class mới là class ConMeo
2106
#Sau đó thử tạo đối tượng trong cùng lớp đó
2107
=>Ta không thấy bị lỗi gì từ khóa private cho phép truy xuất từ trong lớp ConMeo.
#Bây giờ thì thử khởi tạo đối tượng của class ConMeo ở ngoài lớp ConMeo (như trong hình là khởi tạo ở lớp ViDu)
2108
=>Ta thấy bị lỗi vì từ khóa private không cho phép truy xuất từ ngoài lớp
-Protected: Từ khóa này cũng tương tự như private nhưng có thể sử dụng ở lớp ngoài được nếu như lớp ngoài đó thừa kế lớp bao bọc từ khóa
Ví dụ:
# Đầu tiên ta tạo 1 class ConNguoi như sau :
2114
#Sau đó thử tạo đối tượng của class ConNguoi ở ngoài lớp khác (lớp ConCho - Lớp này không kế thừa lớp ConNguoi)
2115
=>Ta sẽ thấy bị lỗi
#Sau đó tạo 1 lớp khác (lớp HocSinh) , kế thừa lớp ConNguoi
2116
=>Không bị lỗi vì từ khóa protected cho phép truy cập vào lớp kế thừa (ở đây lớp HocSinh kế thừa từ lớp ConNguoi nên có thể sử dụng các biến của lớp ConNguoi)


c)Hàm (Method)



-Hàm (Method): là một đoạn các lệnh nhỏ để giải quyết vấn đề của chương trình.Trong C#,ta chia hàm (method) ra làm 2 loại là hàm có giá trị trả về và hàm không có giá trị trả về

-Hàm có giá trị trả về : là hàm mà sau khi thực hiện các câu lệnh thì nó sẽ trả về giá trị thuộc kiểu dữ liệu mà các bạn đã quy định cho hàm đó.

-Cách tạo hàm có giá trị trả về : Để tạo hàm có giá trị trả về ta dùng cú pháp sau : [Tầm_vực_của_hàm] [Kiểu_dữ_liệu_trả_về] [Tên_hàm] (Các_Tham_Số) { return [giá_trị_trả_về] };
-Trong đó :

+[Tầm_vực_của_hàm] : tương tự như của class là các từ khóa private,protected và public
+[Kiểu_dữ_liệu_trả_về] : là các kiểu dữ liệu cơ bản như int,float,string,... hoặc là tên Class.
+[Tên_hàm]: là tên của hàm bạn muốn đặt sao tùy bạn
+[Các_Tham_Số] : có thể có hoặc không, là các giá trị do người lập trình truyền vào khi gọi hàm mà hàm cần phải sử dụng để xử lí.
+return [Giá_trị_trả_về] : bạn phải trả về một giá trị tương ứng với kiểu dữ liệu bạn đã đặt ở trên, ví dụ : int thì phải trả về int, string thì phải trà về string.....

Ví dụ :
#Tạo một hàm tính tổng của 2 số nguyên a và b.Hàm này sẽ trả về tổng a + b và chắc chắc tổng sẽ là kiếu nguyên nên ta tạo hàm như sau :
2127
#Sau đó ta gọi hàm trong phương thức Main
2131
#Ta được kết quả sau
2132

=>Hàm TinhTong đã trả về giá trị của tổng 1+2 = 3

-Hàm không có giá trị trả về : là hàm mà chỉ thực hiện câu lệnh ,không có giá trị trả về.

-Cách tạo hàm không có giá trị trả về : Để tạo hàm không có giá trị trả về ta dùng cú pháp sau : [Tầm_vực_của_hàm] void [Tên_hàm] (Các_Tham_Số) { };

-Trong đó :

+[Tầm_vực_của_hàm] : tương tự như của class là các từ khóa private,protected và public
+[Tên_hàm]: là tên của hàm bạn muốn đặt sao tùy bạn
+[Các_Tham_Số] : có thể có hoặc không, là các giá trị do người lập trình truyền vào khi gọi hàm mà hàm cần phải sử dụng để xử lí.
-Ví dụ : Ta sẽ tạo hàm in ra màn hình "Xin chao cac ban".

#Vì hàm này chỉ in ra màn hình nên không có giá trị trả về, ta tạo hàm như sau :
2128
#Sau đó ta gọi hàm In() trong phương thức Main
2129
#Chạy chương trình ta được kết quả sau:
2130


=>Vậy là hàm In() đã in ra màn hình câu "Xin Chao Cac Ban"


d)Thuộc tính (Properties) trong C#



Thuộc tính là gì ?
-Thuộc tính là cách dùng để truy cập đến các biến một cách an toàn. Ví dụ: biến của bạn có phạm vi truy cập là private ,ra ngoài thì ko truy cập được ,nhưng với thuộc tính thì bạn hoàn toàn có thể truy cập biến thông qua thuộc tính
Cách khai báo thuộc tính
-Thuộc tính được khai báo theo cách sau :
public [Kiểu_dữ_liệu_của_biến_cần_truy_cập] [Tên_của_thuộc_tính]
{
get { return [Biến_cần_truy_cập]; }
set { [Biến_cần_truy_cập] = value; }
}
-Trong đó :
+ get : Khi sử dụng thuộc tính để truy cập biến thì phương thức get sẽ trả về giá trị của biến đó
+ set : Khi sử dụng thuộc tính để truy cập biến thì phương thức get sẽ gán giá trị của biến đó bằng giá trị mà bạn gán cho thuộc
tính
Ví dụ :
#Khai báo biến a kiểu private, thuộc tính A dùng để truy cập biến a;
2140
#Gán giá trị cho biến a và sử dụng giá trị của a qua thuộc tính A
2141
#Chạy thử,ta được như sau :
2142
=>Vậy là ta có thể truy cập biến a thông qua thuộc tính A của nó
-Lưu ý:
+Muốn tạo thuộc tính chỉ cho phép đọc giá trị của biến thì ta không cần có có lệnh : set { = value; }
+Muốn tạo thuộc tính chỉ cho phép đọc ghi giá trị của biến thì ta không cần có có lệnh : get { return [biến_cần_truy_cập] ; }


e)Hàm tạo (Constructor) trong C#



Hàm tạo là gì ?
-Hàm tạo (Constructor) : là những hàm đặc biệt cho phép thực thi, điều khiển chương trình ngay khi khởi tạo đối tượng. Trong C#, Constructors có tên giống như tên của class và không có giá trị trả về.
Cách khởi tạo Constructor của một class :
-Hàm tạo được khởi tạo theo cú pháp sau :
public [Tên_class_của_hàm_tạo]([Các_tham_số])
[B]{
[Các_lệnh];
}
Ví dụ :
-Bây giờ ta sẽ tạo một hàm tạo cho class LopHoc,hàm tạo này sẽ có chức năng in ra màn hình chữ "Test"
2149
-Sau đó ta khởi tạo đối tượng của lớp LopHoc trong lớp Main
2150
-Chạy thử chương trình ta được :
2151
=>Vậy ta thấy hàm tạo của class LopHoc đã tự thực hiện khi ta tạo đối tượng của class LopHoc
*Lưu ý : Nếu hàm tạo có tham số thì việc truyền tham số cho hàm tạo được thực khi khởi tạo đối tượng thông qua cách sau : [Tên_class] [Tên_đối_tượng] = new [Tên_Class]([Các_tham_số]);


f)Kế thừa lớp đối tượng trong C#



Kế thừa là gì?
-Kế thừa là sự kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở. Và lớp kế thừa được gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép. Kế thừa giúp tiết kiệm thời gian viết code, tái sử dụng và mở rộng hiệu quả, dễ bảo trì sửa chữa. Có 2 loại thừa kế, đó là đa thừa kế và đơn thừa kế. Trong ngôn ngữ C# thì không hỗ trợ đa thừa kế. Thừa kế có 2 lớp là lớp cha (lớp cơ sở) hoặc lớp con (lớp dẫn xuất)
Ví dụ:
-Hình vuông là thừa kế từ hình chữ nhật bởi nó là trường hợp đặc biệt của hình chữ nhật, nó mang đầy đủ các tính chất của hình chữ nhật. Vì vậy nếu ta có 2 lớp là lớp HinhChuNhat và lớp HinhVuong thì lớp HinhChuNhat sẽ là lớp cha và lớp HinhVuong sẽ là lớp con.
-Để 1 lớp kế thừa từ lớp khác, khi tạo lớp ta làm như sau : [Tầm_vực_của_lớp] class [Tên_lớp_con] : [Tên_lớp_cha]
-Để gọi lại constructor của lớp cha từ constructor của lớp con ta làm như sau : public [Tên_lớp_con](Tham_số_constructor_của_lớp_con) : base(Tham_số_constructor_của_lớp_cha)
Ví dụ :
-Ta sẽ tạo lớp hình chữ nhật với các phương thức tính chu vi và diện tích ;
2156
-Ta tạo tiếp lớp HinhVuong là lớp con của lớp HinhChuNhat
2157
-Giải thích : Vì hình vuông là trường hợp đặc biệt của hình chữ nhật nên hình vuông cũng có chiều dài và chiều rộng nhưng chúng bằng nhau nên ta vẫn coi hình vuông là hình chữ nhật và gọi lại constructor của HinhChuNhat qua từ khóa base
-Tạo các đối tượng của lớp HinhVuong và HinhChuNhat trong phương thức Main, in ra màn hinh chu vi , diện tích của hình vuông và hình chữ nhật.
2158
-Chạy thử ta được :
2159
=>Vậy lớp HinhVuong là lớp con của lớp HinhChuNhat nên vẫn có thể sử dụng các phương thức TinhChuVi() và TinhDienTich() của lớp HinhChuNhat


g)Tính Đa Hình trong C#
-Vì phần này rất trừu tượng nên cần phải đọc kĩ và suy ngẫm, thực hành nếu cần thiết



Tính đa hình là gì ?
-Tính đa hình là cơ chế của một số ngôn ngữ lập trình hướng đối tượng , trong đó có C# . Khi các đối tượng khác kiểu nhưng có phương thức trùng tên, cơ chế này cho phép đối tượng gọi đúng phương thức đã cài đặt cho lớp chính của đối tượng đó.
Ví dụ :
-Hình chữ nhật, hình vuông, hình tròn đều thuộc lớp Hình, có cùng phương thức tính diện tích và chu vi nhưng cách tính lại khác nhau. Tính đa hình cho phép khi gọi đối tượng hình chữ nhật và gọi hàm tính diện tích thì hàm tính diện tích này sẽ tính diện tích hình chữ nhật, còn khi gọi đối tượng hình vuông và gọi hàm tính diện tích thì hàm này sẽ tính diện tích hình vuông
-Cách tạo tính đa hình:
-Tính đa hình được tạo bằng cách :
+Ở lớp cha có một phương thức ảo được khai báo bằng từ khóa virtual hoặc abstract
+Ở lớp con định nghĩa lại phương thức của lớp cha bằng từ khóa override
Ví dụ :
-Ta tạo một lớp cha là lớp ConNguoi có phương thức XuatRaThongTin() như sau :
2160
-Tạo lớp ConTrai và ConGai kế thừa từ lớp ConNguoi cũng có phương thức XuatRaThongTin() như sau :
2161
-Tạo các đối tượng của 3 lớp trong phương thức main và gọi phương thức XuatRaThongTin của mỗi lớp:
2166
-Kết quả :
2162
=>Kết quả bình thường,ta chưa thấy tính đa hình đâu cả, nếu ta thay đổi ở chỗ khởi tạo các đối tượng trong phương thức Main như sau:
2163
-Rồi sau đó chạy thử :
2164
=>Kết quả chỉ in ra câu "Day la con nguoi". Vậy làm sao để in ra các câu còn lại ? Ta tạo tính đa hình như sau :
2165
-Chạy thử ta có :
2162
=>Như vậy tính đa hình cho ta gọi đến đúng phương thức của từng lớp ConTrai,ConGai và ConNguoi.


h)List<> trong C#



List là gì ?
-List trong C# là một chuỗi các phần tử có kiểu dữ liệu được quy định sẵn (giống như mảng)
Cách tạo 1 list :
-List được tạo theo cú pháp sau : List<[Tên_class]> = new List<[Tên_class]>();
Các thao tác với List
-Thêm phần tử vào list : [Tên_list].Add([Tên_Phần_tử]);
-Xóa phần tử từ list : [Tên_list].Remove([Tên_Phần_Tử]);
Ví dụ :
-Ta có 1 list kiểu int
2167
-Thêm các phần tử vào list

2168
-In ra màn hình các phần tử list
2169
-Xóa phần tử list
2170
-Kết quả :
2171
2172

meocon5000
16-03-14, 08:21 AM
3.Cơ bản về nguyên lí hoạt động của mô hình Client-Server.



Đầu tiên ta cần hiểu các khái niệm sau :
Client : nghĩa là máy khách
Server : nghĩa là máy chủ
Port : là cổng, ví dụ như 80,8080,....
IP : địa chỉ ip , ví dụ : 127.0.0.1,165.13.212.114,...
Vậy cơ chế hoạt động của mô hình client - server là gì ?
Khi được chạy, server cần được xác định rõ địa chỉ IP và sẽ “lắng nghe” trên một port cụ thể. Server sẽ nằm trong trạng thái này cho đến khi client gửi đến một yêu cầu kết nối (request) . Sau khi được server chấp nhận (accept), một kết nối sẽ hình thành cho phép server và client giao tiếp với nhau. Khi đó server có thể gửi (send) và nhận dữ liệu (receive) từ phía client và ngược lại.
Cơ chế này được thể hiện theo sơ đồ sau :
2181
-Lưu ý : dữ liệu được truyền giữa client và server được truyền theo dạng byte[]

meocon5000
16-03-14, 09:01 AM
4.Các phần chính của source gunny
-Source Gunny (DDTank) đầy đủ gồm 4 solution : CenterServer,GameServer,FightingServer,Request nhưng chúng ta chỉ bàn chủ yếu về GameServer



-Trong GameServer bao gồm các project sau :
+ Bussiness : Quan trọng, dùng để thực thi query, truy xuất dữ liệu từ database.
+ Game.Base : Quan trọng, đây là phần cơ bản của game về client,server,packet,... nhưng bạn muốn develope chức năng thì không cần quan tâm cái này cho mấy
+ Game.Logic : Quan trọng, đây là phần chính của phó bạn, PVP,chứa các action của NPC,effect,...
+ Game.Server : Rất quan trọng,hầu hết các chức năng của gunny đều nằm ở đây, bạn sẽ phải tập trung chủ yếu vào phần này.
+ Game.Service : Không cần để ý đến.
+ Game.Tools : Không cần để ý đến.
+ SqlDataProvider : Quan trọng,chứa các field của các table trong database, dùng để truy xuất database
=>Vậy ở đây ta chỉ cần để ý đến Bussiness,Game.Server và SqlDataProvider để develope chức năng gunny.
-Bussiness : Cần để ý những file có phần Bussiness . Vd: DragonBoatBussiness,PlayerBussiness,... trong đó chứa các hàm truy xuất, thực thi với database theo từng chức năng .
-Game.Server : Để ý kĩ những forder sau :
+GameObject : Trong này có file GamePlayer.cs, bao gồm các thuộc tính,sự kiện,các hàm của chức năng,...
+GameUtils : bao gồm các class để xử lí từng chức năng của player,bao gồm 2 hàm chính là LoadFromDatabase() và SaveToDatabase()
+Packet : các class PackageType ở ngoài quy định các gói tin phải chuyển đến client của từng chức năng.

Client : Trong đây là những file chính dùng để xử lí từng chức năng, các file này lấy các hàm ở GameUtils,GamePlayer,GameClient,....
Server : --AbstractPacketLib : Có chứa các hàm để gửi packet về client

+Manager : bao gồm các class, mỗi class có hàm Init() dùng để chạy khi start server, hàm Reload để chạy lại và các hàm khác.
+Room : Bao gồm các chức năng của phòng , mọi loại phòng,các hàm xử lí phòng....
-SqlDataProvider : +Data : bao gồm các class chứa các Field của table trong Database, dùng để truy xuất dữ liệu của các Field để xử lí.

trong0981
28-04-14, 01:11 PM
Mình có kinh nghiệm nhỏ đóng góp vào cùng chung vui nhóe. meocon5000 nếu thấy được thì add vô bài viết sau nếu nhé :D

* Yêu cầu trước khi tiến hành dev source Gunny:

1. Đọc và hiểu source code nó đang thực thi cái gì. Ít nhất là nhìn vô một chức năng nào có sẵn trong source phải hiểu cách người khác họ viết như thế nào.
2. Source client (2.png) là cần thiết. Ít nhất phải đọc sơ qua về tài liệu action script 3, như vậy bạn có thể hiểu được các chức năng nó chạy luân phiên nhau ra sao. Đến khi dev chức năng mới cũng dễ hiểu client nó nhận và gửi cái gì tới server.
3. Đọc kỹ các bài viết của meocon ở trên :D

* Cách thức dev một chức năng đơn giản.

Để gia nhập vào làng dev gunny, các bạn là newbie thì cố gắng làm cái gì dễ dàng một chút. Ít nhất là xác định nó chạy ở phần nào trong source. Tránh các chức năng khó như skill guild, boss guild, niên thú hay bla bla vì nó liên quan tới game.logic và script và cần kinh nghiệm dev cao. Mình có thể ví dụ các chức năng khá dễ như là thuyền rồng, kim tự tháp, vv...

Với các chức năng chỉ có tác dụng ở ngoài phòng chờ, nghĩa là giống kiểu minigame thôi ko liên quan khi vào trận đấu (battle) thì sẽ dễ dàng dev hơn. Các bạn chỉ cần code trong Game.Server là ổn. thường thì ở trong Game.Server/Packets/Client. nhưng với các chức năng liên quan tới cả ngoài lẫn trong trận đấu thì sẽ khó hơn. Có thể ví dụ như là Chúc phúc thần gà. Gia hạn hoặc free làm mới pet, free mở cb thì ở ngoài trận đấu (xử lý ở Game.Server) nhưng như Rơm cứu sinh thì lại nằm trong Game.Logic. với game.logic chạy được ở fight lẫn road. Khi vô trận đấu PVE thì sẽ xử lý ở road => ko cần gửi info tới fight đỡ phức tạp nhưng cần khởi tạo ref (IGamePlayer) để game.logic có thể đọc thông tin chúc phúc của người chơi (phát hiện còn rơm cứu sinh hay ko).

Khi dev các bạn phải dựa 80% vào client và 20% còn lại tư duy để code sao cho hợp lý. Tốt nhất xử lý 90% trên ram (bộ nhớ đệm) và 10% trên sql. Khi cần thiết như lưu lại dữ liệu, lấy dữ liệu mới đọc từ SQL và NÊN đọc 1 lần và lưu lại khi cần thiết. Không nên đọc ghi liên tục mỗi khi nhận packet từ client. Như thế về lâu dài sẽ rất lag và gây ra nhiều lỗi bug không mong muốn.

Có 1 điều nữa các bạn nên tránh khi dev là nên nhớ. Client giới hạn gì thì server nên check lại lần nữa. bởi vì client giới hạn chỉ đối với người chơi bình thường. còn với mấy người chơi cheater với buger chúng nó làm mọi thứ để lách luật. vì thế. check càng kỹ càng tốt để tránh khỏi bị bug sau này. Có một điều là nhiều developer mắc phải khi mở server miễn phí điển hình là dragon boat (thuyền rồng) là MaxValue (giá trị tối đa) khi tính toán vượt quá mức chứa của từng kiểu (type). Ví dụ INT thì chỉ chứa ko quá 2 tỷ. Một vài hàm tính toán nhân chia cộng trừ vượt quá khiến vượt quá mức giới hạn của hàm khiến biến thành chỉ số âm => lỗi game.

meocon5000
29-04-14, 01:38 PM
6.Kinh nghiệm của các pro về develope gunny.

-Đóp góp của bạn trong0981



* Yêu cầu trước khi tiến hành dev source Gunny:

1. Đọc và hiểu source code nó đang thực thi cái gì. Ít nhất là nhìn vô một chức năng nào có sẵn trong source phải hiểu cách người khác họ viết như thế nào.
2. Source client (2.png) là cần thiết. Ít nhất phải đọc sơ qua về tài liệu action script 3, như vậy bạn có thể hiểu được các chức năng nó chạy luân phiên nhau ra sao. Đến khi dev chức năng mới cũng dễ hiểu client nó nhận và gửi cái gì tới server.
3. Đọc kỹ các bài viết của meocon ở trên

* Cách thức dev một chức năng đơn giản.

- Để gia nhập vào làng dev gunny, các bạn là newbie thì cố gắng làm cái gì dễ dàng một chút. Ít nhất là xác định nó chạy ở phần nào trong source. Tránh các chức năng khó như skill guild, boss guild, niên thú hay bla bla vì nó liên quan tới game.logic và script và cần kinh nghiệm dev cao. Mình có thể ví dụ các chức năng khá dễ như là thuyền rồng, kim tự tháp, vv...

- Với các chức năng chỉ có tác dụng ở ngoài phòng chờ, nghĩa là giống kiểu minigame thôi ko liên quan khi vào trận đấu (battle) thì sẽ dễ dàng dev hơn. Các bạn chỉ cần code trong Game.Server là ổn. thường thì ở trong Game.Server/Packets/Client. nhưng với các chức năng liên quan tới cả ngoài lẫn trong trận đấu thì sẽ khó hơn. Có thể ví dụ như là Chúc phúc thần gà. Gia hạn hoặc free làm mới pet, free mở cb thì ở ngoài trận đấu (xử lý ở Game.Server) nhưng như Rơm cứu sinh thì lại nằm trong Game.Logic. với game.logic chạy được ở fight lẫn road. Khi vô trận đấu PVE thì sẽ xử lý ở road => ko cần gửi info tới fight đỡ phức tạp nhưng cần khởi tạo ref (IGamePlayer) để game.logic có thể đọc thông tin chúc phúc của người chơi (phát hiện còn rơm cứu sinh hay ko).

- Khi dev các bạn phải dựa 80% vào client và 20% còn lại tư duy để code sao cho hợp lý. Tốt nhất xử lý 90% trên ram (bộ nhớ đệm) và 10% trên sql. Khi cần thiết như lưu lại dữ liệu, lấy dữ liệu mới đọc từ SQL và NÊN đọc 1 lần và lưu lại khi cần thiết. Không nên đọc ghi liên tục mỗi khi nhận packet từ client. Như thế về lâu dài sẽ rất lag và gây ra nhiều lỗi bug không mong muốn.

- Có 1 điều nữa các bạn nên tránh khi dev là nên nhớ. Client giới hạn gì thì server nên check lại lần nữa. bởi vì client giới hạn chỉ đối với người chơi bình thường. còn với mấy người chơi cheater với buger chúng nó làm mọi thứ để lách luật. vì thế. check càng kỹ càng tốt để tránh khỏi bị bug sau này. Có một điều là nhiều developer mắc phải khi mở server miễn phí điển hình là dragon boat (thuyền rồng) là MaxValue (giá trị tối đa) khi tính toán vượt quá mức chứa của từng kiểu (type). Ví dụ INT thì chỉ chứa ko quá 2 tỷ. Một vài hàm tính toán nhân chia cộng trừ vượt quá khiến vượt quá mức giới hạn của hàm khiến biến thành chỉ số âm => lỗi game.

-Special Thanks to Trong0981 (SnapeNguyễn) \:D/

meocon5000
15-06-14, 02:12 PM
5.Một vài ví dụ cơ bản về develope một số chức năng trong game


Đây là video hướng dẫn dev chức năng rương gà , đây là 1 chức năng khá đơn giản , các bạn xem và làm theo nhé !
Phần 1 :

<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Phần 2:

<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Phần 3:

<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>

meocon5000
15-06-14, 06:37 PM
Up nào !!! Up nào !!! 30 charrrrrrrrrrrr

gon1702
06-09-14, 05:54 PM
Dear mèo con!
Bạn có thể làm tut hướng dẫn qua về việc fix lỗi mật đạo thần bí không. Mình đang build bản gunny II 2.5 mà tìm hoài không thấy hướng dẫn về việc này. Cảm ơn bạn nhé

manhkst123
16-12-14, 09:47 PM
Sao topic ít người tham gia vậy.Hi meocon5000 mình là newbie.
Theo như yêu cầu bạn nêu ra thì mình đáp ứng được các phần như sau:
+ Microsoft Visual Studio 12.
+ Tool Decrypt của trminhpc.
+ Sothink SWF Decomplier 7.1
+ Kiến thức căn bản về C#
+ Biết chút ít về cơ chế Client - Server
+ Đọc hiểu code c# tốt.
+ Biết chút ít về MSSQL,viết Query,Store Procedure,...

Vậy mình có thể học dev Gunny được không.:P

huyvannet
17-12-14, 09:54 AM
Sao topic ít người tham gia vậy.Hi meocon5000 mình là newbie.
Theo như yêu cầu bạn nêu ra thì mình đáp ứng được các phần như sau:
+ Microsoft Visual Studio 12.
+ Tool Decrypt của trminhpc.
+ Sothink SWF Decomplier 7.1
+ Kiến thức căn bản về C#
+ Biết chút ít về cơ chế Client - Server
+ Đọc hiểu code c# tốt.
+ Biết chút ít về MSSQL,viết Query,Store Procedure,...

Vậy mình có thể học dev Gunny được không.:P

Biết được chừng đó thì chả mấy mà Dev được rồi, lôi source free trên 4rum về đọc hiểu rồi mần thôi. :D

manhkst123
17-12-14, 05:21 PM
Mình nên dev từ bản gunny mấy là chuẩn hiện nay

vinh8c058
19-03-15, 05:55 PM
nên dev từ 2 chấm nếu newbie 4 chấm nếu là học hỏi đk nhìu 6 chấm thì pro cmnr

akasuki
19-07-18, 05:28 PM
Ai còn video không ạ cho mình xin với để tham khảo :D

trong0981
20-07-18, 11:30 PM
Ai còn video không ạ cho mình xin với để tham khảo :D

còn *beep* nhé bạn :)). đào mộ vcl ra. 8-}

akasuki
18-03-19, 07:32 PM
còn *beep* nhé bạn :)). đào mộ vcl ra. 8-}

Em cần để tìm hiểu làm việc socket cả tạo tên lớp trong source như nào để flash nhận đúng :3
Bác cho em xin fb với được không ạ ? :3

Huuhoi
24-04-20, 07:18 PM
bác làm lại video đi ạ? chứ die hết video rồi