Phần III - Một chiêu tấn công đơn giản (Phần I)Mở đầuGiờ thì bạn đã quen với sprite và chuyển động, đã tới lúc để đến với phần quan trọng nhất, state. Chính xác thì tất cả những gỉ char của bạn làm sẽ được miêu tả trong file .cns.
1. Thông số của charHãy bắt đầu với việc mở file .cns của bạn lên bằng trình soạn thảo văn bản (trong phần I, bạn đã copy và rename file kfm.cns thành player.cns rồi (thực chất thì do tên char của tôi là player, chứ bạn đổi thành gì cũng đc)). Đầu file .cns bạn sẽ thấy nhóm [Data]. Đây là nơi mọi thông số bắt đầu.
Thông số này sẽ ảnh hưởng đến nhiều khía cạnh cơ bản của char bạn. Đa số các giá trị trong file kfm.cns sẽ hoạt động tốt với hầu hết mọi char, tuy nhiên cũng có một số cái bạn cần đổi, và chúng sẽ được đề cập đến bên dưới. Nhớ rằng trong hệ thống tọa độ, X dương là tới, còn Y âm là lên. Tất cả mọi khoảng cách đều được tính bằng đơn vị pixels, và vận tốc sẽ có đơn vị là pixels/tick (1 game tick là 1/60 giây).
; Trong nhóm Data bạn không cần chỉnh gì cả, vì thế bạn có thể
; giữ y nguyên.
[Data]
life = 1000
attack = 100
defence = 100
fall.defence_up = 50
liedown.time = 60
airjuggle = 15
sparkno = 2
guard.sparkno = 40
KO.echo = 0
volume = 0
IntPersistIndex = 60
FloatPersistIndex = 40
; Có thể có một số thông số trong nhóm này mà bạn muốn đổi.
[Size]
; 2 thông số tiếp theo sẽ quyết định kích cỡ của sprite bạn. Bạn có
; thể giữ nó là 1 để sprite của bạn có kích thước bình thường.
xscale = 1
yscale = 1
; MHãy chỉnh thông số phía dười cho phù hợp. Nó sẽ ảnh hưởng đến khoảng
; cách mà char khác có thể tiến đến bạn. Bấm CTRL-C trong game và quan
; sát thanh phía dưới char
ground.back = 15 ;Phía sau, dưới đất
ground.front = 16 ;Phía trước, dưới đất
air.back = 12 ;Phía sau, trên không
air.front = 12 ;Phía trước, trên không
; Theo tôi nghĩ, height để 60 là ổn. Đừng cho nó
; quá lớn vì như thế đối thủ sẽ khống nhảy qua được đầu bạn.
height = 60 ;Chiều cao tối thiểu để đối thủ nhảy qua đầu bạn
; 3 cái tiếp theo khỏi chỉnh.
attack.dist = 160
proj.attack.dist = 90
proj.doscale = 0
; Chỉnh thông số sau đây để phù hợp với chiều cao của char bạn.
; Nhưng tôi nghĩ trong những trường hợp bình thường, thông số dưới đây ổn.
head.pos = -5, -90 ;Vị trí xấp xỉ của đầu
mid.pos = -5, -60 ;Vị trí xấp xỉ của phần giữa
; 2 cái sau khỏi đổi
shadowoffset = 0
draw.offset = 0,0
; Dưới đây là những thông số về vận tốc. Có thể chỉnh để
; phù hợp với char của bạn
[Velocity]
walk.fwd = 2.4 ;Đi tới
walk.back = -2.2 ;Đi lùi
run.fwd = 4.6, 0 ;Chạy tới (x, y) (y nên là 0)
run.back = -4.5,-3.8 ;Bật (x, y)
jump.neu = 0,-8.4 ;Vận tốc nhảy tại chỗ (x, y)
jump.back = -2.55 ;Tốc độ nhảy lùi (x, y)
jump.fwd = 2.5 ;Tốc độ nhảy tới (x, y)
runjump.back = -2.55,-8.1 ;Tốc độ vừa-chạy-vừa-nhảy (tùy chọn)
runjump.fwd = 4,-8.1 ;.
airjump.neu = 0,-8.1 ;.
airjump.back = -2.55 ;Tốc độ khinh công (tùy chọn)
airjump.fwd = 2.5 ;.
; Sau đây là 1 số thông số linh tinh cho chuyển động. Chỉnh
; nếu thích.
[Movement]
airjump.num = 1 ;Số lần khinh công cho phép (tùy chọn)
airjump.height = 35 ;Khoảng cách tối thiểu với mặt đất khi
;khinh công (tùy chọn)
yaccel = .44 ;Gia tốc thẳng đứng
stand.friction = .85 ;Hệ số ma sát khi đang đứng
crouch.friction = .82 ;Hệ số ma sát khi đang lấy đà/né
Sau khi đã chỉnh xong, chúng ta sẽ sang phần làm chiêu tấn công.
2. Chuẩn bị làm chiều tấn côngNếu file .cns của bạn (từ giờ kêu là player.cns nhé) được copy từ file kfm.cns, thì char của bạn đã có đầy đủ mọi state của con Kung Fu Man. Tất cả mọi việc ta có thể làm là làm cái state đứng-đấm-tại-chỗ của nó vận hành được trên char bạn. Đừng lo về những state khác, bạn có thể chỉnh chúng sau, hoặc nếu lười? Del cmn luôn! :">
State đứng-đấm-nhẹ-tại-chỗ của KFM là state 200, nghĩa là chúng ta sẽ làm việc với nhóm số 200, và một hành động animation với số tương tự.
Bước đầu tiên là làm sprite và hành động animation cho đòn đánh. Ví dụ, bạn thêm vào 3 sprite và tạo lại file .sff. Trong file player.air, làm hành động animation 200. Nếu file .air của bạn được copy từ kfm.air, thì thế cái hành động 200 cũ bằng cái mới. Cái mà bạn mới sửa ấy, nó sẽ giống như sau:
;Đòn đánh mới
[Begin Action 200]
200,0, 0,0, 2
200,1, 0,0, 3
200,2, 0,0, 5
200,1, 0,0, 4
200,0, 0,0, 3
Làm hộp xung đột như tôi đã hướng dẫn trong Phần 2 của bài viết. Trong khung chuyển động sẽ tấn công đối thủ, làm hộp Clsn1 (là cái hộp đánh có màu đó ấy :D). Nên làm luôn cả hộp Clsn2 (là hộp bị đánh có màu xanh) nằm bên trong hộp Clsn1 để trận đấu trở nên công bằng và thực tế hơn.
Đây là ví dụ:
Sau khi đã lưu hộp xung đột vào file .air, mở file player.cns (hoặc file gì mà bạn đặt tên char của bạn). Tìm nhóm [Statedef200], và xóa hết tất cả những gì từ dòng đó cho đến trước [Statedef210], là cái state tiếp theo. Bạn đã xóa thành công state đứng-đấm-nhẹ-tại-chỗ của KFM.
3. Làm stateXóa xong rồi thì làm gì? Để chơi à? Chắc chắn là không! Hãy để cái state tấn công của bạn vào. Để cái code này vào file player.cns của bạn:
; Tất cả mọi State đều phải bắt đầu với nhóm StateDef. Bây giờ, chúng
; ta có một thông số trong StateDef, đó là thông số "anim". Nó ra hiệu
; cho MUGEN chuyển char thành hành động animation trong phần đầu của state
[StateDef 200]
anim = 200
; TNhóm tiếp theo được gọi là bộ điều chỉnh. Ngoài StateDef, một state
; được làm từ một hoặc nhiều bộ điều chỉnh. Bộ điều chỉnh cho char biết
; làm chuyện gì trong thời gian nào. "Làm chuyện gì" là "loại" của bộ điều
; chỉnh, còn "trong thời gian nào" được gọi là 1 điều kiện. Trong
; trường hợp này, điều kiện là "AnimTime = 0", nghĩa là "khi hoạt động
; animation đã kết thục". Loại là "ChangeState", với giá trị = 0 . Vậy bộ
; điều chỉnh này nghĩa là "chuyển về state 0 (state đứng), khi hành động
; animation hiện tại đã kết thúc".
[State 200, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
OK, vậy cái đống lằng nhằng trên này làm gì? Đơn giản là nó chuyển char đến hành động animation 200, chờ cho đến khi hành động đó kết thúc, và chuyển char về state 0, nghĩa là state đứng yên. Thử chạy và cảm nhận. Khi đang đứng yên, bấm nút x để đến state 200.
Giờ thì thấy điều quái dị xảy ra rồi chứ? Dù bạn đã tạo hộp Clsn1, bạn không thể tấn công char khác! Đơn giản tại bạn đã chỉnh thông số "hit" đâu! Vụ đó để sau đi. Giờ chúng ta sẽ tính từng việc một.
Đấm phát... chưa trúng!
Việc cần làm đầu tiên là tránh cho char chơi động tác giả... quá liều. Nói hơi khó hiểu, thử chạy char rồi bấm X, sau đó thử đi hoặc chạy xem nào? Nhìn chẳng thực tế tí nào cả! Khắc phục bằng cách cho thêm dòng "ctrl = 0" vào nhóm StateDef.
[StateDef 200]
anim = 200
ctrl = 0 ;*** Này thì cho dòng này vào này ***
[State 200, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
Tới đây tôi sẽ cho bạn biết một chút khái niệm về
cờ điều khiển. Một cái cờ như thế có thể có hai giá trị,
on (còn được gọi là True) hoặc
off (False). Giờ, khi cờ điều khiển đang trong trạng thái
on, đó là "nhân vật có điều khiển". Sau khi cho dòng ctrl = 0 vào rồi, chạy thử con MUGEN của bạn xem? À, dĩ nhiên là bạn không thể động tác giả một cách ảo tưởng như trước...
bởi vì bạn đâu có cử động được nữa đâu mà đòi động tác giả! Chuyện quái gì vậy?!
4. Xem thông tin debugHãy xem thông tin debug ở đáy màn hình. Không thấy thì bấm CTRL-D.
Thông tin debug của charTôi sẽ giải thích cho bạn từng dòng một
- Dòng đầu tiên bạn không cần quan tâm :-j
- Dòng thứ hai cho biết tên char và số ID (bạn có thể thấy số ID bên cạnh tên char bằng cách bấm Ctrl-C). Còn số trong dấu ngoặc đơn không quan trọng.
- Dòng thứ ba (thông tin về char)
ActionID: Hoạt động animation hiện tại của char
Spr: Số nhóm và hình của sprite đang hiển thị
Elemno: Số đầu là số của yếu tố đang được hiển thị của hoạt động animation. Số sau là tổng số yếu tố
Time: Đây là số tick mà player đã tiêu thụ trong hoạt động. Còn số thứ hai là số tick tổng cộng mà hoạt động đó tiêu thụ. Khi số 1 = số 2 => AnimTime = 0.
- Dòng cuối (thêm cả đống thông tin về char nữa):
State no: Số state mà player đang ở
Ctrl: Gía trị của cờ điều khiển. 0 là
off, 1 là
on Type và MoveType không quan trọng.
Time: Số tick tổng cộng char đã tiêu thụ trong state hiện tại.
Đọc lòi con mắt chưa bạn? Đừng lo, việc chúng ta cần làm hiện tại là giá trị của cờ điều khiển. Xem giá trị của nó ở dòng cuối cùng sau khi bạn đã hoàn thành đòn đánh. Bạn sẽ thấy nó vẫn là 0 ngay cả khi bạn trở về state đứng yên. Bây giờ chúng ta sẽ sửa nó.
[StateDef 200]
anim = 200
ctrl = 0
[State 200, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1 ;*** Thêm dòng này ***
Tác dụng của dòng bạn mới thêm vào là chuyển giá trị của cờ điều khiển thành on lúc nhân vật chuyển về state đứng. Thử chạy MUGEN lại đi. Nó không kẹt nữa đâu.
5. Mở rộng về StateDefsBạn nghĩ thế là xong? Bitch please. Chưa hết vấn đề đâu. Nếu bạn vừa ấn nút tới vừa tấn công, nhân vật của bạn sẽ... moonwalk như Michael Jackson vậy =)). Thêm thông số vào StateDef nào:
[StateDef 200]
anim = 200
ctrl = 0
type = S ;*** Thêm dòng này ***
physics = S ;*** Và dòng này ***
[State 200, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
2 thông số mà bạn vừa thêm vào có tác dụng set char của bạn vào loại state "đứng", và sử dụng nguyên lí vật lí "đứng. Khi đó char của bạn sẽ chịu lực ma sát với mặt đất (chính là thông số stand.friction, hồi nãy trong phần Thông số của char bạn đã chỉnh rồi. Không có những thông số đó, sẽ không có mẫu vật lí nào được sử dụng, và char của bạn sẽ trượt băng nghệ thuật. (như bạn mới vừa thấy)
Nếu bạn chạy MUGEN bây giờ, bạn sẽ thấy char của bạn sẽ dừng di chuyển từ từ khi nó tấn công. Khá, nhưng chưa tốt. Một thông số nữa để dứt điểm việc này:
[StateDef 200]
anim = 200
ctrl = 0
type = S
physics = S
velset = 0,0 ;*** Thêm dòng này ***
[State 200, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
Dòng bạn mới vừa thêm vào sẽ chỉnh vận tốc của char bạn về 0 (trong cả 2 hướng X và Y) khi nó ở state 200. Giờ nếu bạn chạy MUGEN lần nữa, bạn sẽ thấy char bạn đứng yên khi nó đánh, không cần biết trước đó nó chạy lẹ thế nào.
To be continuedBạn đã học được nhiều rồi đấy! Nhưng còn có một vấn đề ở trên, đó là đòn tấn công vẫn chưa trúng được đối thủ. Chúng ta sẽ tiếp tục vấn đề này ở phần 4.