บทความสอนกราฟิก

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3088|ตอบกลับ: 0

[Renpy] 16. วิธีทำให้ตัวละคร กระพริบตา และ ขยับปากพูด [BlinkAnd Lip Flap]

[คัดลอกลิงก์]

272

กระทู้

272

โพสต์

979

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
979
แก้ไขครั้งสุดท้ายโดย nooknazha เมื่อ 2018-5-27 20:39

[Renpy] 16. วิธีทำให้ตัวละคร กระพริบตา และ ขยับปากพูด [BlinkAnd Lip Flap]

เป็นการเพิ่มความน่าสนใจให้กับตัวเกมส์อีกอย่างหนึ่งนะค่ะโดยขณะที่ประโยคสนทนา(Text)ของตัวละครกำลังแสดงไปเรื่อยๆปากของตัวละครจะขยับตามไปเรื่อยๆเช่นกัน เมื่อข้อความทั้งประโยคแสดงครบ ตัวละครก็จะหุบปากหยุดขยับปากพูดค่ะ

นอกจากการขยับของปากของตัวละครที่จะสัมพันธ์กับการแสดงข้อความสนทนาแล้ว อีกลูกเล่นหนึ่งที่น่าสนใจ คือการทำให้ตัวละครสามารถกระพริบตาได้
ด้วย โดยเราสามารถกำหนดเวลาในการแสดงได้ค่ะ มาดูกันเลยดีกว่า
โค๊ดต้นฉบับ:-

  1. init python:
  2.   
  3.     # This is set to the name of the character that is speaking, or
  4.     # None if no character is currently speaking.
  5.     speaking = None
  6.   
  7.     # This returns speaking if the character is speaking, and done if the
  8.     # character is not.
  9.     def while_speaking(name, speak_d, done_d, st, at):
  10.         if speaking == name:
  11.             return speak_d, .1
  12.         else:
  13.             return done_d, None
  14.   
  15.     # Curried form of the above.
  16.     curried_while_speaking = renpy.curry(while_speaking)
  17.   
  18.     # Displays speaking when the named character is speaking, and done otherwise.
  19.     def WhileSpeaking(name, speaking_d, done_d=Null()):
  20.         return DynamicDisplayable(curried_while_speaking(name, speaking_d, done_d))
  21.   
  22.     # This callback maintains the speaking variable.
  23.     def speaker_callback(name, event, **kwargs):
  24.         global speaking
  25.       
  26.         if event == "show":
  27.             speaking = name
  28.         elif event == "slow_done":
  29.             speaking = None
  30.         elif event == "end":
  31.             speaking = None
  32.   
  33.     # Curried form of the same.
  34.     speaker = renpy.curry(speaker_callback)
  35.            
  36. init:
  37.   
  38.     # Create such a character.
  39.     $ girl = Character("Girl", callback=speaker("girl"))
  40.   
  41.     # Composite things together to make a character with blinking eyes and
  42.     # lip-flap.
  43.     image girl = LiveComposite(
  44.         (359, 927),
  45.         (0, 0), "base.png",
  46.         (101, 50), Animation("eye_open.png", 4.5, "eye_closed.png", .25) ,
  47.         (170, 144), WhileSpeaking("girl", Animation("mouth_speak1.png", .2,
  48.         "mouth_speak2.png", .2), "mouth_closed.png"),
  49.         )
  50.   
  51. # The game starts here.
  52. label start:
  53.   
  54.     scene black
  55.     show girl
  56.   
  57.     "Not speaking."
  58.   
  59.     girl "Now I'm speaking. Blah blah blah blah blah blah blah."
  60.   
  61.     "Not speaking any more."
  62.    
  63.     girl "Now I'm speaking once again. Blah blah blah blah blah blah blah."
คัดลอกไปที่คลิปบอร์ด

ขั้นตอนที่ 1.
จากโค๊ดข้างบนเราจะมองเห็นสิ่งสำคัญที่จำเป็นต้องมีนั้นก็คือ  1.ภาพที่ต้องใช้ อย่างน้อย 5 ภาพ ต่อ 1 ตัวละคร โดยในการบันทึกภาพนั้น เพื่อให้ง่ายต่อการกรอกพิกัดตัวเลขเราควรกำหนดให้ภาพดวงตา และปากวางอยู่ในตำแหน่งที่สัมพันธ์กันบนใบหน้าตัวละครทีเดียวเลยและใช้การเปิด-ปิดเลเยอร์ บันทึกภาพทีละส่วนเอาค่ะ

(คลิกที่ภาพเพื่อดูแบบขนาดเต็ม)

Blink_And_Lip_Flap_01.png

ขั้นตอนที่ 2.
- เพื่อให้แน่ใจว่าประโยคแสดงข้อความของตัวละครจะไม่วิ่งเร็วเกินไปจนตัวละครขยับปากตามไม่ทัน เราควรเซ็ตค่าความเร็วในการแสดง Text ให้อยู่ในระดับที่ไม่เร็วเกินไป และไม่ช้าเกินไป โดยให้เข้าไปที่เมนู"Preferences"

Blink_And_Lip_Flap_06.png
- ที่ "Text Speed" ซึ่งก็คือส่วนที่ใช้กำหนดความเร็วในการแสดงText เราควรกำหนดให้อยู่ในระดับประมาณภาพด้านล่างค่ะ(ถ้ากำหนดให้แแสดงเร็วเกิน ตัวละครจะไม่ขยับปากพูด (เพราะมันพูดตามไม่ทัน)ได้แต่กระพริบตาปริบๆ ทำตาบ๊องแบ๋วจ้องเรา )

Blink_And_Lip_Flap_07.png
*** ค่าต่างๆที่เราเซ็ตไว้ใน  "Preferences"จะมีผลต่อการทำงานในครั้งต่อๆไป และจะมีผลเมื่อเราทำการพับลิชไฟล์ไปให้ผู้เล่น ลองเล่นด้วย ยกเว้นแต่เราจะทำการลบความจำทั้งหมดทิ้งค่าทุกค่าที่เซ็ตไว้ ถึงจะกลับไปเป็นค่าเริ่มต้นใหม่ ดูบทความอธิบายเพิ่มเติมได้ที่บทความนี้ค่ะ  [renpy] วิธีDelete Persistent (ลบความจำเกมส์)   

(วิธีที่จะทำให้   "Text Speed" คงค่าตามที่กำหนดไว้หลังจากลบความจำเกมส์และ พับลิชไปแล้ว คือก่อนที่เราจะพับลิชเกมส์ไปให้ผู้เล่นๆ ทดลองเล่นเราควรลบความจำทั้งหมดของเกมส์ทิ้งไป( Delete Persistent) จากนั้นค่อยจึงเข้ามาที่หน้าเมนูเกมส์(main menu) อีกครั้ง (ห้ามคลิกปุ่ม "start")ให้เข้าไปที่หน้า "Preferences" และเซ็ตค่าที่"Text Speed" ให้เรียบร้อยแล้วก็ให้กดปืดหน้าจอทันที แล้วค่อยทำการพับลิชไฟล์เกมส์)

ขั้นตอนที่3.
- เปิดไฟล์ options.rpyขึ้นมา
- นำโค๊ดครึ่งท่อนบนมาวางไว้ที่บรรทัดล่างสุด วิธีนี้จะทำตามหรือไม่ก็ได้เพราะบางคนก็เอาโค๊ดทั้งหมดไปยัดที่ไฟล์ script.rpy ทีเดียวเลยก็ได้เหมือนกันแต่ที่ข้าพเจ้าแนะนำให้ใช้วิธีแยกกันเพราะ โค๊ดนี้เป็นโค๊ดตายตัวเราแทบไม่จำเป็นต้องเข้าไปแก้ไขอะไรหรือยุ่งอะไรกับมันอีก  เพราะฉะนั้นแยกมันมาอยู่ในส่วนของ options.rpy จะดูเป็นสัดส่วนกว่า  (หรือจะสร้างเป็นไฟล์ใหม่ขึ้นมาเลยก็ได้ ทำได้ทุกวิธีค่ะ)
Blink_And_Lip_Flap_02.png
ขั้นตอนที่ 4.
- คราวนี้ก็มาในส่วนของไฟล์script.rpy กันบ้าง ถือเป็นไฟล์สำคัญ ที่เราจะต้องเข้าไปยุ่งวุ่นวายกับมันแทบจะตั้งแต่ต้นจนจบการสร้างเกมส์

- ในไฟล์script.rpy เราจะต้องประกาศตัวแปรตัวละครแตกต่างจากการประกาศตัวแปรแบบปกติ(ดูตามภาพประกอบด้านล่างเลยค่ะ)

  1. init:
  2.   
  3.     # Create such a character.
  4.     $ me = Character('NOOKFUFU2', color="#c8ffc8")
  5.     $ v = Character("วิชชา", color="#00ff2a" ,callback=speaker("viccha01"))
  6.   
  7.     # Composite things together to make a character with blinking eyes and
  8.     # lip-flap.
  9.     image viccha01 = LiveComposite(
  10.         (359, 500), #ระบุพิกัดตำแหน่งเริ่มต้นที่จะวางภาพตัวละครบนหน้าจอเกมส์
  11.         (0, 0), "cha/viccha_bg.png",
  12.         #กำหนดพิกัดตำแหน่งของดวงตาเปิด และดวงตาปิด กำหนดให้ลืมตากี่วินาที ถึงจะกระพริบตา
  13.         (0, 0), Animation("cha/viccha_eye_open1.png", 4.5, "cha/viccha_eye_closed1.png", .25) ,
  14.         
  15.         #กำหนดพิกัดตำแหน่งของปากขยับชึ้น - ลง
  16.         (0, 0), WhileSpeaking("viccha01", Animation("cha/viccha_mouth_open1.png" , .2,
  17.         "cha/viccha_mouth_half1.png", .2), "cha/viccha_mouth_closed1.png"),
  18.         )
  19.         #ที่กำหนดพิกัด ดวงตาและปากให้เป็น 0.0 เพราะต้องการให้ยึดพิกัดเดียวกันกับภาพbgตัวละคร
  20. init:
  21.     $ move = MoveTransition(0.5)

  22. label start:
  23.     scene black
  24.     show viccha01
  25.     me "ลองพูดกับฉันหน่อยดิ๊ ปากแกขยับได้ยัง?"
  26.     v "จะให้พูดว่าอะไรล่ะ(ว่ะ)ครับ ก.ไก่ ข.ไข่ บลาๆๆๆ"
  27.     me "อั๊ยยะ ปากเอ็งขยับได้แล้วเว้ย 555"   
  28.     me "ไหนลองย้ายไปอยู่ที่ที่ด้านซ้ายของหน้าจอสิ ปากกับตา ย้ายตามไปด้วยป่ะ"
  29.    
  30.     show viccha01 at left
  31.     me "โฮ๊ะ ย้ายตามด้วย แบบนี้แหล่มเลย"
  32.     me "งั้นขออีกรอบ แกลองค่อยๆขยับตัว เลื่อนไปทางขวาให้ดูหน่อยดิ๊"

  33.     show viccha01 at right with move
  34.     v "แบบนี้ใช่ป่ะ"
  35.     me "โอเค. เวิร์ค!!!"
  36.    
  37. return
คัดลอกไปที่คลิปบอร์ด

(ภาพตัวอย่างการประกาศตัวแปร....)
Blink_And_Lip_Flap_03.png

บันทึกไฟล์ทั้งหมด และลองรันโปรแกรม....
Blink_And_Lip_Flap_04.png

Blink_And_Lip_Flap_05.png

ขอให้สนุกกับการสร้างเกมส์นะค่ะ (จริงๆ ก็รู้ว่ามันไม่สนุกหรอก ต้องเครียด +ต้องเหนื่อย + ต้องอดทน แต่ใจมันรักที่จะทำ ก็ทำใจให้สนุกไว้ดีกว่าเกมส์ของเราจะได้ออกมาดี ^^ )

บทความโดย นุ้ก
ขอจบบทความแค่เพียงเท่านี้ แล้วพบกันใหม่บทความหน้าค่ะ ^^
(ขอสงวนสิทธิ์อนุญาตให้เผยแพร่เฉพาะในเว็บ www.graphicfufu.comเท่านั้น)
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|GraphicFUFU

GMT+7, 2024-12-22 21:27 , Processed in 0.082202 second(s), 21 queries .

Powered by Discuz! X3.4 R20180101, Rev.59

© 2001-2017 Comsenz Inc.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้