Saturday, May 31, 2014

Pawn Picture Tutorial - Bắt Đầu Với Lập Trình và Các Cấu Trúc Cơ Bản


Chào mừng bạn đến Pawn Picture Tutorial. Điều này sẽ cung cấp cho bạn một sự hiểu biết tốt hơn về lập trình bằng cách liên hệ nó với một số ví dụ thực tế. 


Lưu ý bạn cần phải đọc toàn bộ hướng dẫn này để hiểu làm thế nào để làm việc.

* Xin lưu ý rằng đây là những ví dụ của mã và không có gì sẽ xuất hiện trong trò chơi * 


* Điều này là dành cho mục đích rất cơ bản và có thể có một số điều không hoàn toàn chính xác.

Trước hết, chúng tôi sẽ liên kết một plugin để một nhà kho. Nhà kho có hộp (biến), máy (Hàm), tải và vận chuyển cảng (forwards and returns), và cửa ra vào đến kho khác (natives).



Ghi chú [top]

Điều đầu tiên bạn sẽ cần phải biết về lập trình là ghi chú. Các ghi chú ​​được được bỏ qua bởi chương trình dịch và không có tác dụng gì trong Game cả.


Một ví dụ về một dòng ghi chú:
Code:
//Be careful Michael Jackson hangs around here
Tuy nhiên bạn có thể thêm một số thông tin cần thiết vào
Code:
//Be careful Michael Jackson hangs around here

//As of June 25, 2009 we do not need to worry about Michael Jackson
Ghi chú được đặt vào trong code giúp bất kì ai đó đọc có nó có thể hiểu và nhớ được chương trình làm gì
Thêm ghi chú có thể giúp bạn nhớ được vì sao bạn làm vậy hoặc giúp ai đó có thể hiểu được mã của bạn

Các ngôn ngữ lập trình khác nhau có cách ghi chú khác nhau. Trong Pawn thì có hai cách
  • Ghi chú trên một dòng
  • Ghi chú thành đoạn văn ( Nhiều dòng)

Ghi chú trên một dòng bắt đầu với //. Mọi thứ sau // được bỏ qua. Nó có thể bắt đầu ở một dòng hoặc ở giữa dòng
Code:
//This is a good comment

             //This is also a good comment
Ghi chú thành đoạn văn bắt đầu với /* và kết thúc với */. mọi thứ ở giữa hai kí hiệu đó được bỏ qua.
Code:
/*This comment type can be one line long*/

/*Or it
Can be
Spaced out*/

Biến [top]

Dù sao, bây giờ một số mã thực tế: một biến. Oh không! có một biến! Có trong toán học chúng ta được học về các biến N và X và làm thế nào họ đại diện cho bất kỳ con số nào. 

Bây giờ trong mã, một biến đại diện cho bất kỳ giá trị nào mà bạn gán cho nó. Về cơ bản nó như một cái hộp.


Để tạo một biến mới chúng ta sử dụng cú pháp:
Code:
new variable_name
Nơi variable_name là ... bạn đoán nó, tên của biến. Chúng tôi cố gắng để cung cấp cho một biến một tên tương tự như những gì nó sẽ đại diện, vì vậy nếu chúng ta sẽ có nó đại diện cho bao nhiêu Táo có:

Có những nhân vật nào đó bạn không thể sử dụng trong tên, vì vậy như một quy luật của, chỉ sử dụng chữ cái, số, và _ (gạch dưới) 
Lưu ý rằng chúng ta có thể đặt tên cho nó bất cứ điều gì chúng ta muốn (gần như), miễn là chúng ta sử dụng tên sau này.

  • Lưu ý rằng chúng tôi sẽ phải sử dụng _ thay vì một khoản trống
  • Tên biến không được bắt đầu bằng số

Biến có thể được đặt bất cứ tên gì nhưng chúng tôi khuyên bạn là nên đặt nó sao cho dễ nhớ nhất khi dùng tới 

Bây giờ chúng ta có cái hộp, chúng ta sẽ làm gì với nó ? 

Vâng, chúng ta có thể đặt con số vào hộp, và do đó các biến có một số được gán cho nó (bất cứ điều gì trong hộp). Điều này có vẻ khó hiểu lúc đầu, nhưng cố gắng đọc sau này sẽ rất dễ dàng. 

Khi chúng tôi lần đầu tiên tạo ra một biến, nó được zeroed. Điều đó có nghĩa rằng nó được gán số 0.


Chúng ta có thể thay đổi giá trị của biến với đoạn mã sau:
Code:
variable_name = 3
Và kết quả là nó thay đổi giá trị từ 0 thành 3.

  • Lưu ý rằng = được sử dụng cho việc thay đổi giá trị.
  • Và == được sử dụng để so sánh (kiểm tra) giá trị.
Một biến cũng như một con số vì vậy nếu chúng ta có:
Code:
new variable
Sau đó nếu chúng ta làm thế này variable + 5 thì chúng ta sẽ có 0 + 5 == 5
Nếu chúng ta làm thế này:
Code:
variable = 3
Và sau đó lặp lại: variable + 5 chúng sẽ có: 3 + 5 == 8
Biến chỉ đại diện cho một con số tại một thời điểm

Bạn nên lưu ý rằng bạn không cần phải làm nhiệm vụ đơn điệu này mỗi lần:
Code:
new variable
variable = 3
Bạn có thể khai báo một biến với một giá trị:
Code:
new variable = 3
Trước tiếp tục, chúng ta cần phải biết các loại khác nhau của các biến. Cho đến nay bạn vừa học được về các biến Integer. Có một thuật ngữ toán học, những gì nó có nghĩa là họ có được số nguyên.
  • Ie: ..., -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, ...

Một loại biến được gọi là Boolean hoặc Bool cho ngắn.
Để tạo ra một biến bool chúng tôi sử dụng:
Code:
new bool:variable_name


Biến kiểu bool thì chỉ có hai giá trị True (ĐÚng ) hoặc False (Sai) và không có bất kì giá trị nào khác













Bạn không thể chỉ định một số nguyên cho một boolean, nghĩ về nó như thể nó sẽ không phù hợp trong hộp.

Biến kiểu Integer có thể khai báo theo cách sau
Code:
variable_name = 3
Nhưng các phép toán Boolean chỉ có thể là Đúng hay Sai, chúng tôi không thể gán 3 cho nó. Vì vậy, chúng ta phải làm:
Code:
variable_name = true
hoặc
Code:
variable_name = false
  • Lưu ý rằng kiểu bools mặc định được gán bằng Flase thay vì 0

Nơi bạn sẽ cần một biến bool? Một vài ví dụ sẽ là:
  • Chiếc đèn bật hay chưa?
  • Đó là ban đêm?
  • Người choi có đang đứng hay không?
  • Người chơi có cầm dao hay không?


Loại biến cuối cùng chúng ta sẽ học là Floating Point hoặc Float cho gọn.( Gọi chung là kiểu số thực)
Để tạo ra một biến kiểu số thực chúng ta có cú pháp sau:
Code:
new Float:variable_name



Một vài ví dụ về các giá trị cho kiểu số thực:
  • ..., -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, ...
  • ..., -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, ...
  • 3.567, 2859.92, 28.3
Về cơ bản nó có thể là bất kỳ số thập phân nào.
  • Lưu ý rằng kiểu số thực được gán giá trị mặc định là 0.0


Okay, Đây là tóm tắt chung về biến của chúng ta:
  • Tên biến - Có thể đặt bất cứ tên gì nhưng tốt nhất là nên đặt sao cho gần giống với chức năng của biến
  • Các kí tự trong tên biến: Số, chữ Và dấu gạch dưới.
  • Variables hold numbers. They do nothing but pretend to be the number they are holding.
  • Có 3 loại biến chính: Integers ( Kiểu số nguyên), Bools (Kiểu Luận), Floats (Kiểu số thực)
  • Integers are là những số nguyên. chúng bắt đầu bằng 0
  • Bools là true hoặc false. Chúng bắt đầu mặc định bằng 0
  • Floats là những con số thập phân. Chúng mặc định bắt đầu bằng 0.0


Mảng Và Xâu [top]

Đây là những điều đơn giản để nhớ với các biến. 

Mảng có thể được coi như một hàng hộp nhóm lại với nhau.


Để tạo ra một mảng, chúng ta sử dụng cú pháp tương tự như việc tạo ra một biến:
Code:
new array_name[4]

  • Lưu ý rằng tất cả các hộp có cùng tên
  • Số trong dấu ngoặc vuông là bao nhiêu hộp được tạo ra

Nếu chúng ta muốn tạo ra một mảng của 10 hộp, chúng tôi sẽ làm:
Code:
new array_name[10]
Khi tham khảo các hộp cá nhân, chúng tôi sử dụng:
Code:
array_name[box_number]
  • Lưu ý rằng hộp đầu tiên được đánh số từ 0, ví dụ hộp đầu tiên: array_name[0], hộp thứ 2: array_name[1], hộp thứ 3:array_name[2], etc.
  • Bạn không thể làm như thế này array_name[-1], không có hộp ở vị trí này.
  • Nếu bạn tạo new array_name[3] thì không có hộp thứ tư, vì vậy bạn không thể truy cập tới array_name[3]
  • Hộp cuối cùng bạn có thể sử dụng là tạo ra với -1. Tức là.
    • array[4] có 4 hộp, 4-1 == 3, Hộp cuối cùng là 3
    • array[11] có 11 hộp, 11-1 == 10, Hộp cuối cùng 10
    • array[32] có 32 hộp, 32-1 == 31, Hộp cuối cùng 31
  • Bạn phải sử dụng số nguyên trong dấu ngoặc vuông.

Nếu chúng ta muốn khởi tạo một mảng với các giá trị, bạn làm như sau:
Code:
new array[5] = {
 10, //this is for the first box
 3,  //second box
 600, //third box
 -5, //fourth box
 20 //fifth and final box. notice it does not have a comma after its value
}
Tại sao lại sử dụng đến mảng? Đây là một ví dụ:
  • Bạn biết rằng có nhiều nhất 32 người chơi trong một Server
  • Hãy cho chúng tôi biết mỗi người chơi giết chết được bao nhiêu người
  • Sau đó chúng ta sẽ tạo ra new kills_array[32] và sử dụng kills_array[id - 1] cho mỗi người chơi
  • Lưu ý rằng chúng tôi  thêm "-1" bởi vì cầu thủ đầu tiên sẽ sử dụng hộp đầu tiên, người thứ hai sử dụng hộp thứ hai, vv
  • Tuy nhiên, hầu hết mọi người không thích sử dụng "-1", vì vậy thay vì chúng ta tạo ra các mảng với những người chơi tối đa +1 == 32 + 1 == 33
  • new kills_array[33] sau đó chúng ta chỉ có thể sử dụng kills_array[ id ]

"Vì vậy, những gì khác về mảng?" bạn có thể hỏi. Vâng, chúng tôi có thể khai báo các loại của các mảng giống như các biến:
Code:
new Float:array[3]
new bool:array[32]
Bây giờ tôi biết câu hỏi tiếp theo của bạn, "Tại Sao...?"

Vâng, đây là một trong những ví dụ phổ biến:
  • Một cầu thủ gốc (vị trí) trong một bản đồ được thể hiện bằng 3 điểm nổi. Là một trong những vị trí X của họ, một là vị trí Y của họ, và bạn đoán nó, cuối cùng là vị trí Z của họ.
  • Trong HalfLife Engine, Tọa độ Z là đọ cao của người chơi trong map.
  • Chúng tôi sau đó sẽ tạo ra:
    Code:
    new Float:Origin[3]
    X == Hộp đầu tiên, Y == Hộp thứ 2, Z == Hộp thứ 3
  • Sau đó chúng ta có thể tăng chiều cao của mình bằng 50 đơn vị:
    Code:
    Origin[2] = Origin[2] + 50.0

Được rồi ... bây giờ vào Strings.

Bạn có thể nhận thấy rằng một loại dữ liệu quan trọng: các ký tự như (chữ cái và các ký hiệu). Chúng được gọi là “strings” tức là chuỗi, và trong Pawn, nó là những số mà dc gọi là kỹ thuật số (Câu này hơi khó hiểu)!. String là một mảng của các số mà dịch để ASCII (Kí tự) biểu tượng. Ví dụ:

// Khai báo Mảng số myString và chứa dữ liệu hay còn gọi là có giá trị là "Hello"
// Nó sẽ có 6 slot. mỗi slot chứa 1 kí tự của chữ Hello (0 là h, 1 là e, 2 là 1,... ,5 là o)
// Slot cuối cùng là dành cho số 0 (tức là slot số 6), để nói với trình dịch pawn đó là một chuỗi.
new myString[] = "Hello"  
Và cách này cũng có thể làm được, nhưng dài dòng và không được dùng nhiều cho lắm:

new myString[6]
myString[0] = 'H'
myString[1] = 'e'
myString[2] = 'l'
myString[3] = 'l'
myString[4] = 'o'
myString[5] = 0  
- Điều đó nói lên Slot cuối cùng của 1 mảng phải là 0, hoặc các kí tự “null” (Null: vô hiệu).
- Và điều này đã cho bạn biết là mảng myString kết thúc ở đâu.

Bạn không thể làm thế này:


new myString[6]
myString = "Hello"     // Không hợp lệ, vì myString này ko phải là một mảng, mà chỉ là một biến thường
myString[0] = "Hello"  // Cũng không hợp lệ

// Để thêm giá trị cũng như dữ liệu cho 1 mảng ta có thể làm thế này
new goodString[7]
copy(goodString, 6, "Hello")  
- Và cũng xin nói luôn, Copy là một chức năng.

copy(destination[], length, source[])  
- Cho phép ta sao chép dữ liệu từ “destination” tức là nơi đến, “length” tức là số lượng cũng như slots trong đó, “source” là nơi xuất phát.


Hàm [top]

- Pawn cho phép bạn #define (tức là xác định) chức năng, hàm của riêng bạn. Điều này có ích để loại bỏ mã số đó là được sử dụng ở nhiều nơi. Lưu ý rằng tất cả các chức năng phải trả lại một giá trị. Để làm điều này, bạn sử dụng lệnh “return”, mà ngay lập tức dừng chức năng và trả về giá trị của biểu thức thông qua nó. Mã số được thực hiện trong một hàm một lần trả lại được tìm thấy. Dưới đây là một số ví dụ:

// Function này không có Parameter (Tức là thông số), và return thành 1
// Và trong function này. Khi nó được kích hoạt, thì nó sẽ sử dụng print tức là chức năng in ấn hiện chữ ra màn hình. (Đây là ví dụ còn print thì không biết có hay ko)
show()
{
   print("Hello!")

   return 1   // Kết thúc, trả lại giá trị 1
}

// Và cách kích hoạt Hàm này:
show()  
- Và phần này cũng rất quan trọng trong Function. như sau:

// Khai báo một hàm gọi là add_two_numbers. Trong đây nó lấy 2 con số và cộng lại và ra số mới.
add_two_numbers(first, second)
{
   new sum = first + second

   return sum  // Trả lại giá trị
}  
- Sau đó khi bạn sử dụng hàm thì như thế này:

new a,b
a = 5
b = 12
new c = add_two_numbers(a,b)
// Lúc này thì c sẽ = 17 vì số thứ nhất là 5 và số thứ 2 là 12.  
- Bạn không bị giới hạn các kiểu dữ liệu trong thông số khi nhập. Và ở đây tôi lấy Floating Point tức số thập phân làm ví dụ:

// Khai báo một hàm gọi là add_two_floats. Cũng như ở trên nhưng lại là với một số thập phân.
// Cũng là lấy 2 con số + lại và ra kết quả.
Float:add_two_floats(Float:first, Float:second)
{
   new Float:sum = first + second

   return sum
}

new Float:a
new Float:b
a = 5.0
b = 6.3
new Float:c
c = add_two_floats( a+b )
// Và c lúc này sẽ là 11.3, là một số thập phân.  


Natives [top]

Chúng rất giống với Hàm bởi vì đó là cơ bản những gì họ đang có. Natives là những cỗ máy không có trong kho của bạn. 
Bạn có thể nghĩ về họ như các phím tắt dẫn đến máy của nhà kho khác. 

Họ có hình thức giống như một chức năng:
Code:
NativeName(parameter, parameter2)
  • Chúng có thể có tham số
  • Chúng có thể trả về giá trị
  • Bạn không tạo chúng trong code của bạn. chúng tồn tại ở đâu đó.


Forwards [top]

Bây giờ những sẽ là một trong những điều quan trọng mà làm cho code của bạn hoạt động.
Bạn có thể nghĩ về họ như cổng của nhà kho hoặc giao tiếp với thế giới bên ngoài .

Để cho mã của bạn để làm điều gì đó , bạn cần phải được thông báo của một sự kiện .
Một số sự kiện đơn giản hoặc chuyển tiếp cho các trò chơi sẽ là khi một người nào đó sinh ra hoặc chết.
Nhưng chờ đã! Mã của bạn không cho phép bất cứ ai biết rằng nó muốn được thông báo về thông tin đó !

Có hai Forwards cốt lõi mà bạn sẽ cần phải biết về:
  • plugin_init : public này sẽ tự động chạy khi server connect (hiểu nôm na là bạn vừa loading xong)
  • plugin_precache : khi code của bạn được liên hệ để biết những gì nó cần để xây dựng những thứ (Như là models, sprites, và sound)
    • Lưu ý rằng điều này thường được gọi là trước khi plugin_init

Nếu chúng ta muốn biết khi một người chơi hồi sinh, sau đó chúng tôi sẽ đăng ký tiếp trong plugin_init sau đó Hàm sẽ được gọi mọi lúc khi nó sảy ra. 
Có nhiều cách khác nhau để đăng ký Hàm vì vậy tôi sẽ không đi vào nó ở đây ngay bây giờ.

Nhìn vào chủ đề này, chúng tôi thấy rằng chúng tôi có thể register the forward với native:
Code:
RegisterHam(Ham_Spawn, "player", "fwHamPlayerSpawnPost", 1)
Tuyệt vời, bây giờ thế giới bên ngoài biết rằng chúng tôi muốn biết khi một cầu thủ được sinh ra, nhưng chúng ta đi đâu để gửi thông tin đó?

Một thông số chung để đăng ký native là một public hàm. Về cơ bản nó là vị trí chúng tôi đang gửi nó đến. 
Nhìn lại bản native
Code:
RegisterHam(Ham_Spawn, "player", "fwHamPlayerSpawnPost", 1)
đối số thứ ba là tên của public Hàm. 

Vì vậy, bây giờ chúng tôi phải tạo ra chức năng như vậy:
Code:
public fwHamPlayerSpawnPost(iPlayer)
{
        if ( is_user_alive( iPlayer ) )
        {
                // player spawned
        }
}
  • Lưu ý rằng Hàm này được khai báo Public để nó có thể Tương tác với thế giới bên ngoài

Một phần khác với hầu hết các Hàm là Sự trả về . Hàm khác nhau trả về các kiểu khác nhau, nhưng bây giờ chúng tôi sẽ chỉ nói về:
  • PLUGIN_HANDLED
  • PLUGIN_CONTINUE
  • PLUGIN_HANDLED_MAIN

Returns cho thế giới biết phải làm gì khi bạn nhận được thông tin.
  • Lưu ý rằng nếu bạn không trả về giá trị, 0 được trả về theo mặc định.

PLUGIN_HANDLED says to stop the information from being sent anywhere else. It will stop it from going to other plugins and stop it from going to the server.
PLUGIN_CONTINUE says to do nothing. Everything will continue as normal, other plugins and the server will get the information.
PLUGIN_HANDLED_MAIN says to stop the information from being sent to the server. It will go to other plugins, but not the server.
  • Lưu ý rằng đây chỉ là một số Hàm. Trong một FakeMeta Hàm, nó sẽ muốn FMRES_ * trả về. Trong một Ham Hàm, nó sẽ muốn HAM_ * trả về.
  • Điều quan trọng là sử dụng trả về giá trị chính xác bởi vì bạn có thể trở lại một cái gì đó ngoài ý muốn. Ví dụ: PLUGIN_HANDLED là giá trị tương tự như FMRES_IGNORED nhưng nếu bạn trả về PLUGIN_HANDLED trong một FakeMeta Hàm, nó sẽ không ngăn chặn nó. Chỉ luôn luôn cố gắng sử dụng lợi nhuận chính xác.
  • Lưu ý rằng một số Hàm (ví dụ plugin_init ()) bỏ qua giá trị trả lại

Structure [top]

Tất cả các mã có một loại cấu trúc để làm theo, bạn không thể đặt code ở bất kì đâu trong chương trình của mình và hy vọng nó làm việc. 
Trong một nhà kho, bạn không thể đặt một cánh cửa trên mái nhà và hy vọng mọi người có thể bước qua nó. Bạn không muốn đặt một ô cửa ở giữa văn phòng của một ai đó. 
Bạn cần phải đặt mã của bạn ở các vị trí chính xác. 

Dưới đây là thứ tự của các hầu hết các plugin được tạo ra:


Large Comment [structure] [top]
Vào đầu của mã một plugin có thể có một nhận xét lớn. Các bình luận thường nói về các plugin, những thay đổi đã được thực hiện, hoặc những thứ khác. Đây chỉ là thân thiện cho những người cố gắng để đọc mã, để họ biết những gì đang đi làm. Tuy nhiên, hầu hết các plugin không chứa này, và chỉ nhảy vào phần tiếp theo.


Includes [structure] [top]
Trước khi bắt đầu viết code,Chúng ta cần phải khai báo các thư viện. Các thư viện chứa các hàm mà chúng ta sử dụng trong việc viết Chương Trình

Các thư viện cho phép những gì ? Chúng cho phép chúng ta sử dụng natives từ những nơi khác.
Một vài thư viện có các hàm sẵn sàng cho chúng ta sử dụng.
Hầu hết các plugin sẽ gồm : #include <amxmodx>  vì nó có người natives cơ bản cho việc tạo ra một plugin. 
Thư viện amxmodx bao gồm tập tin cũng chứa các Hàm plugin_init và plugin_precache. 


Defines [structure] [top]
Đây chỉ là giúp đỡ cho mọi người. Chúng giữ các hằng số trong nhiều hàng.
Cú pháp: #define DEFINE_NAME definition
DEFINE_NAME là những gì sẽ được thay thế trong các code.
definition là những gì nó sẽ được thay thế bằng.
  • Lưu ý rằng hầu hết mọi người viết hoa để chỉ ra rằng một cái gì đó không thay đổi.
Vậy nếu chúng ta có : #define MAX_PLAYERS 32
Ở khắp mọi nơi trong các mã có MAX_PLAYERS, nó sẽ thay đổi đến 32.

Một số bổ sung không sử dụng bất kỳ định nghĩa tự thực hiện và chỉ tiếp tục điều tiếp theo.

Global Variables [structure] [top]
Biến toàn cục
Được rồi, bạn cần phải có một sự hiểu biết về các biến và điều này là một chút addon nhỏ. 
Nếu một biến toàn cục là nó có thể được truy cập ở khắp mọi nơi trong nhà kho của bạn. 
Thông thường mọi người đặt một "g" vào đầu tên một biến toàn cục để chỉ ra rằng nó là toàn cục. 
Vì vậy, nếu chúng ta muốn thực hiện một biến toàn cục, chúng tôi sẽ chỉ cần làm:
Code:
new gVariableName
Một số Plugin khong sử dụng biến toàn cục và làm điều tiếp theo

Plugin Loading [structure] [top]
Như đã nói trước, đây là nơi mà plugin_init có hiệu lực. 
Trong hầu hết các trường hợp, bổ sung có plugin_init của họ trong các hình thức:
Code:
public plugin_init()
{
 register_plugin( "Plugin Name", "Plugin Version", "Plugin Author" )

 //Add all extra stuff here
}
Công cụ bổ sung có thể được bất cứ điều gì, chẳng hạn như đăng ký cvars, các sự kiện, hoặc hàm. 

Một phần cốt lõi để một số Plugin được chuẩn bị . Điều này thường được thực hiện trong plugin_precache Hàm. 
Sự chuẩn bị nói cho máy chủ mà chúng ta sẽ sử dụng model, sprites hay sound để chắc chắn rằng các cầu thủ kết nối có những tập tin này. 
Nếu người chơi không có tập tin này, sau đó họ tải về nó. 

Nếu bạn sử dụng  model, sprites hay sound trong plugin của bạn, bạn nên chuẩn bị (precache) nó hoặc người nào khác khi bạn cố gắng sử dụng nó, máy chủ rất có thể sẽ sụp đổ. 
Nó thường được thực hiện ở định dạng này:
Code:
public plugin_precache
{
 //For models:
 precache_model("models/model_name.mdl")

 //For sprites:
 precache_model("sprites/sprite_name.spr")

 //For sounds:
 precache_sound("sound_name.wav")
 // Note that it is recommended that sounds are .wav files
}
  • Lưu ý rằng có thể có các thư mục con trong thư mục gốc Ví dụ:
    Code:
    "models/folder/model.mdl"
  • Lưu ý plugin_precache thường xảy ra trước khi plugin_init
Bây giờ mà plugin của chúng tôi được nạp, chúng tôi thực sự có thể làm một số việc bây giờ.

Functions and Forwards [structure] [top]
Đầu tiên tôi nên đề cập đến điều duy nhất mà serperates Functions and Forwards  là Forwards được công bố công khai và có thể được truy cập bởi các plugin khác / mô-đun. 

Functions chỉ có thể truy cập từ các plugin chúng được tạo ra in Nếu không, họ cư xử chính xác như nhau. 

Tôi sẽ dừng lại đề cập đến chúng serparetly, và thay vào đó chỉ xem chúng như là Function. 
Nếu nó có public ở phía trước, cho rằng đó là một Forwards. 

Function thường được tạo ra trong các định dạng:
Code:
FunctionName(parameters)
{
}
Và họ thực hiện tất cả các mã trong dấu ngoặc đơn. 
Bạn không thể tạo ra một Function trong chức năng khác. 
Nếu bạn tạo một biến bên trong một hàm, nó chỉ có thể truy cập vào chức năng đó.


Statements and Loops [structure] [top]
Có một số loại câu lệnh rẽ nhánh và các vòng lặp, và đây là phổ biến hơn.
  • if( ){ }
  • if( ){ }else{ }
  • switch( ){ case CONST:{ } case CONST2:{ } default:{ } }
  • for( { }; ( ); { } ){ }
  • while( ){ }
  • do{ } while( )

Các phần chính của các cấu trúc rẽ nhánh và các vòng lặp là điều kiện () và hành động {}.
  • if : Cấu trúc : Nếu điều kiện đúng thì thực hiện câu lệnh. Eg:
    Code:
    if( variable == 1 )
    {
      //if variable == 1 execute this code
    }
  • if...else : Cấu trúc : Nếu điều kiện đúng thì thực hiện câu lệnh thứ nhất ngược lại thì thực hiện câu lệnh thứ 2. Ví dụ:
    Code:
    if( variable == 1 )
    {
      //if variable == 1 execute this code
    }
    else
    {
      //if variable != 1 execute this code
    }
  • switch : Cấu trúc : Thực hiện các hành động tương ứng. Có thể có bất kỳ số lượng các trường hợp và "default:" là không cần thiết. ví dụ như:
    Code:
    switch( variable )
    {
     case 0:
     {
      //if variable == 0 execute this code
     }
     case 1:
     {
      //if variable == 1 execute this code
     }
     default:
     {
      //if variable is not any of the preceding cases execute this code
     }
    }
  • for : Vòng Lặp : Thực hiện các hành động đầu tiên khi bắt đầu. Kiểm tra giữa điều kiện, nếu đúng nó dừng vòng lặp. Ở cuối hành động cuối cùng, nó thực hiện các hành động thứ hai. ví dụ như:
    Code:
    for( new variable; variable < 5; variable++ )
    {
     //this code will be executed with the following values for variable: 0, 1, 2, 3, 4
    }
  • while : Vòng Lặp : Kiểm tra điều kiện, nếu đúng nó thực hiện các hành động. Eg:
    Code:
    while( Function() )
    {
     //this code will be executed until Function() returns false
    }
  • do...while : Vòng Lặp : Thực hiện các hành động ít nhất một lần, nó lặp đi lặp lại hành động cho đến khi có điều kiện là sai. ví dụ như:
    Code:
    do
    {
     //this code will be executed at least once, and more until Function() returns false
    }
    while( Function() )
  • Tính năng bổ sung cho các vòng lặp:
    • break : Dừng vòng lặp
    • continue : đi vào trình tự tiếp theo của một vòng lặp
  • Cẩn thận không để bị mắc kẹt trong một vòng lặp vô hạn!


Brackets [structure] [top]
Kiểu Của Dấu Ngoặc:
  • Ngoặc Nhọn: { }
  • Ngoặc Vuông: [ ]
  • Ngoặc Tròn: ( )
Trước hết, bạn cần phải chắc chắn rằng bạn có một kết hợp chặt chẽ các dấu ngoặc đóng và mở.

Trong hầu hết các điều kiện khi dấu ngoặc vuông và ngoặc tròn được mở thì đồng thời phải đóng chúng trên cùng một dòng.
Mặt khác, Dấu ngoặc nhọn được sử dụng cho nhiều dòng

Ngoặc Nhọn có thể được sử dụng để đại diện cho một chiều dài của mã mà cần phải được thực thi.
Theo mặc định, trình biên dịch giả định rằng sẽ chỉ có một dòng mã để thực thi. Tuy nhiên, để thực hiện nhiều hơn một, bạn có thể sử dụng Ngoặc Nhọn.
ví dụ như:
Code:
if( variable )
 Function();
 //Function is the only part within the if statement
 Function2();
 //Function2 is not within the if statement
Code:
if( variable )
{
 Function();
 //Function is in the if statement
 Function2();
 //and so is Function2
}

White-Space and Indentation [structure] [top]
White-Space (khoản trống,dấu tabs, Dòng mới) không có hiệu lực thực hiện, nhưng rất nhiều ảnh hưởng tới việc đọc các mã.
Cho thụt đầu dòng, một quy luật chung của ngón tay cái là, giữa mỗi cặp dấu ngoặc thêm một tab khác. Bạn có thể sử dụng các tab hoặc dấu cách, nhưng miễn là họ đều giống nhau.
Code:
Function()
{
 new variable, variable2

 if( variable )
 {

  //added a tab for new curly brackets

  if( variable2 )
  {

   //added another tab

  }

 }
}
Điều này giúp giữ mã của bạn có thể đọc được. Mỗi khi bạn thấy một người nào đó với mã đó không phải là thụt vào đúng cách, một con mèo chết. 
Nếu bạn cố gắng để biên dịch mã của bạn và nó không có thụt đầu dòng thích hợp, nó sẽ cung cấp cho bạn một cảnh báo cho"loose indentation" (thụt đầu dòng lỏng lẻo).



Tips and Tricks for Getting Started [top]

! (not):
Dấu chấm than có thể được thay thế bằng các từ không. 
Ví dụ, nếu bạn có
Code:
if( !is_user_alive(id) )
Nó có nghĩa là: nếu người chơi không còn sống. 
Ngoài ra, điều này có thể được áp dụng cho các biến. Nếu bạn có:
Code:
if( !variable )
Nó có nghĩa là: nếu biến được zeroed

Operator shortcuts (Các phép toán rút gọn):
Code:
//Nếu bạn phải làm một cái gì đó như thế này
variable = variable + other_variable
//bạn có thể rút ngắn mã của bạn để
variable += other_variable
//này làm việc với tất cả các phép toán khác (+,-,*,/,etc.)
Increase/Decrease by one:
Code:
//Nếu bạn thấy mình thêm hoặc trừ đi một, bạn có thể sử dụng phím tắt này
variable++ //tăng lên một
variable-- //giảm xuống một
To clear a string:
Code:
string_name[0] = '^0'
Natives với định dạng mở rộng
Một số natives  yêu cầu định dạng thêm, phổ biến nhất là:
  • format
  • formatex
  • log_amx
  • client_print
Khi định dạng một chuỗi:
  • %d and %i : thay thế với tham số số nguyên tương ứng
    %f : thay thế với tham số float tương ứng
    %s : thay thế với tham số chuỗi tương ứng

Sử dụng set_task
Nếu bạn cần một cái gì đó xảy ra sau khi một số lượng thời gian, sử dụng set_task .
Code:
// Các thông số trong hàm:
// * Float:time - Khoảng thời gian hẹn giờ thứ hai. (minimum 0.1 seconds)
// * function[] - Một chuỗi có chứa các chức năng công cộng để chạy trên bộ đếm thời gian.
// * id - Một id duy nhất để gán cho các nhiệm vụ.
// * parameter - Một mảng chứa dữ liệu để gửi cho các Hàm hẹn giờ.
// * len - Kích thước của mảng để gửi cho các chức năng hẹn giờ.
// * flags - Một trong những mục:
// -- "a" - Lặp lại nhiệm vụ một số quy định của thời gian
// -- "b" - Nhiệm vụ vòng lặp vô hạn
// -- "c" - làm nhiệm vụ vào thời gian sau khi một timeleft bản đồ
// -- "d" - làm nhiệm vụ trên thời gian trước khi một timeleft bản đồ
// * lặp lại - Nếu flags là "a", xác định số lần lặp lại nhiệm vụ.
set_task ( Float:time, const function[], id = 0, parameter[]="", len = 0, flags[]="", repeat = 0 )
  • Lưu ý rằng các Function được gọi là cần phải được khai báo là public.
  • Cố gắng hiểu this thread


Other Help [top]

Introduction to Pawn - an introduction to the Pawn language

Introduction to AMXX Scripting - an introduction to creating plugins

Pawn Tutorial - an introduction to Pawn for more advanced users

Programming for starters - another basic tutorial for learning Pawn

Beginner Scripting Tutorial - a small tutorial for creating your first plugin

Selective Introduction to AMXX scripting - covers some things for making a plugin

Scripting Tutorial - old tutorial with an example .sma

Video Guide for Local Compiling - a guide to compiling on your computer

Compiling Errors - a list of errors one may encounter while compiling

Tutorial for Half-Life Position, Velocity, and Angles

List of CS/CZ/DOD Events/Messages - list of forwards for CS/CZ/DOD

Good Programming Habits - habits that coders should try to follow

Code Styling - more styling that coders should try to follow

Entities: what they are and how to use them - guide to entities (objects in the game)

Messages (Temp Entities, Game Events, etc.) - introduction to messages (effects)

Cvar Information - information about cvars and how to use them in your code

0 nhận xét:

Post a Comment