เรียนภาษา Swift กับ ThaiSwiftClass.com ตอน Protocol & Delegates Part 2

มาต่อกันกับเรื่อง Protocol & Delegates นะครับ คราวนี้เรามาเรียนรู้เรื่องการใช้งาน Delegate กันดูนะครับ แล้ว Delegate คืออะไร ลองไปดูความหมายซะก่อน

“Delegate (N) ตัวแทน” 

ครับแปลง่ายๆ Delagate ทำหน้าที่เป็นตัวแทน โดยเราจะสร้าง class ที่ใช้ protocol มาทำการ delegate ให้กับอีก class นึง โดยการที่เราต้องนำ protocol เข้ามาช่วยเพื่อให้แน่ใจว่า method หรือ function ทั้งหมดใน protocol นั้นจะถูกนำไปใช้ทำหน้าที่ delegate อย่างแน่นอน

จากตัวอย่างใน บทที่ผ่านมา “เรียนภาษา Swift กับ ThaiSwiftClass.com ตอน Protocol & Delegates Part 1” เราได้จำลงการใช้ protocol มาใช้ใน class ของนักมวย มาในบทนี้ก็จะยังคงใช้นักมวยเป็นหลัก แต่จะเพิ่มให้นักมวยต่อสู้กันได้ และมีการนับค่าพลังที่เสียไปโดยจะใช้เทคนิคของ delegate มาช่วย

 

Step 1. ประกาศ protocol ชื่อ pcPlayer เอาใว้เก็บ ชื่อ (sName) พลังชีวิต (iHp) และ method สำหรับส่งพลังโจมตี (func dealDamage(ความแรงของการโจมดี) )

ThaiSwiftClass Protocol and Delegates Part 2 1

ThaiSwiftClass Protocol and Delegates Part 2 1

 

Step 2. ประกาศ protocol ชื่อ pcFight มี method เลือกเป้าหมายการโจมตี โดยมี target หรือ เป้าหมายคือ pcPlayer (func action_fight) จะเห็นว่าจากตรงนี้ protocol ทั้งสองมีจุดเชื่อมที่จะสามารถสื่อสารกันได้ละ

ThaiSwiftClass Protocol and Delegate Part 2 pcFight

ThaiSwiftClass Protocol and Delegate Part 2 pcFight

 

Step 3. ต่อมาเรามาสร้าง class สำหรับให้นักมวยออกอาวุธ ไม่ว่าจะเป็น

1. class kick (เตะ) ใช้ protocol pcFight และส่งผลให้เกิดพลังโจมตี 30 หน่วยต่อนักมวยที่เป็นเป้าหมาย

2. class punch (ต่อย) ใช้ protocol pcFight และส่งผลให้เกิดพลังโจมตี 30 หน่วยต่อนักมวยที่เป็นเป้าหมาย

3. class skykick (กระโดดเตะ) ใช้ protocol pcFight และส่งผลให้เกิดพลังโจมตี 30 หน่วยต่อนักมวยที่เป็นเป้าหมาย

 *(target คือ protocol ชื่อ pcPlayer ซึ่งจะสามารถใช้ method dealDamage ได้) 

ThaiSwiftClass Protocol and Delegates Part 2 class conform pcFight

ThaiSwiftClass Protocol and Delegates Part 2 class conform pcFight

 

Step 4. สร้าง class Boxer ซึ่งเป็น class นักมวยโดยจะอ้างอิง properties กับ method จาก protocol pcPlayer

ThaiSwiftClass Protocol and Delegates Part 2  class Boxer

ThaiSwiftClass Protocol and Delegates Part 2 class Boxer

 

ใน  class Boxer นี้จะมี method กับ properties ที่สำคัญคือ

1. var sName เก็บชื่อนักมวย

2. var iHp เก็บค่าพลังชีวิต

3. var take_action ซึ่งทำหน้าที่เป็น delegate หรือเป็นตัวแทนของ protocol pcFight ที่จะทำให้เราสามารถไปเรียก  class kick() , punch() , skykick()  (และยังทำให้ take_action นี่ไปเรียกใช้ dealDamage ของ class Boxer ได้ด้วย ให้เกิดผลการลดพลังกับเป้าหมาย (target) ที่กำหนดได้)

4. func action_fight

4.1 จะทำการกำหนดเป้าหมายของคู่ต่อสู้ (target:pcPlayer)

4.2 ให้ take_action ซึ่งเป็นตัว delegate ที่ได้เลือกท่าทางในการต่อสู้เอาใว้แล้ว (จากข้อ 3.) ไม่ว่าจะเป้น kick(), punch(),skykick() ไปเรียก method dealDamage ให้ไปลดค่า iHp ตามจำนวนที่กำหนดใว้แล้วนั่นเอง

5. func dealDamage เพื่อนำค่าพลังชีวิตมาหักลบการพลังโจมตี ถ้าค่า พลังชีวิตหมดก็แสดงว่าแพ้นั่นเอง

6. func currentStat เอาใว้เช็กค่าพลังล่าสุดว่านักมวยแต่ละคนเหลือพลังเท่าไรแล้ว

ThaiSwiftClass Protocol and Delegates Part 2 delegates

ThaiSwiftClass Protocol and Delegates Part 2 delegates

 

ลองนำมาใช้จริงกันดู

Example สร้างนักมวยมา 2 คน

1 .ชื่อ (sName) = KaoSai ให้มีพลังชีวิต (iHp) = 100

2. ชื่อ (sName) = Manny ให้มีพลังชีวิต (iHp) = 120

ThaiSwiftClass Protocol and Delegates Part 2 example of using delegate

ThaiSwiftClass Protocol and Delegates Part 2 example of using delegate

 

แล้วจับนักมวยทั้งสองมาสู้กัน

เปิดฉากด้วย Kaosai เริ่มใช้ take_action ชื่อ skykick ซึ่งจะมีค่าความเสียหาย = 70 หน่วย

ส่งค่าความเสียหายดังกล่าวให้ target หรือคู่ต่อสู้คือ Manny

แล้วก็ให้ Manny ทำการดูค่าล่าสุดซักหน่อย ด้วย func currentStat

ThaiSwiftClass Protocol and Delegates Part 2 skykick

ThaiSwiftClass Protocol and Delegates Part 2 action

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 1

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 1

 

จะเห็นว่า Manny พลังลดไป 70 ตามความแรงของ skykick ทำให้ค่าพลังเหลือเพียง 50 แล้วท่านผู้ชม

จากนั้น Manny โต้กลับด้วยการปล่อยหมัดตรงออกไปใส่ Kaosai

ThaiSwiftClass Protocol and Delegates Part 2 action

ThaiSwiftClass Protocol and Delegates Part 2 action

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 2

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 2

 

Kaosai เตะกลับไปบ้าง

ThaiSwiftClass Protocol and Delegates Part 2 action

ThaiSwiftClass Protocol and Delegates Part 2 action

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 3

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 3

 

Manny เอาคืนด้วยหมัดตรงอีกครั้ง

ThaiSwiftClass Protocol and Delegates Part 2 9

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 5

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 5

 

KaoSai ปิดท้ายด้วยลูกเตะอันทรงพลัง ทำให้ Manny แพ้น๊อกไปเลย

ThaiSwiftClass Protocol and Delegates Part 2 10

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 6

ThaiSwiftClass Protocol and Delegates Part 2 delegate result 6

 

จะเห็นได้ว่าเมื่อเราสร้าง class ให้ทำหน้าที่ delegate ดึงเอาความสามารถมาจาก class อื่นมาช่วยทำให้ประหยัดเวลาไปได้เยอะ แถมเรายังเอา class ดังกล่าวไปใช้ต่อกับอย่างอื่นได้ อย่าง class kick() , punch(), skykick() เราอาจจะไปประยุกต์ใช้กับเกมต่อสู้อื่นนอกจากเกมชกมวยก็ได้ โดยใน class หลักให้เราสร้างตัวแปรที่ทำหน้าที่ delegate หรือเป็นตัวแทนของ class ที่เรียกใช้ protocol มาเชื่อมใว้

 

ยังไงลองเอาไปฝึกเขียนกันดูนะครับ

แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass
 

Leave a Reply