Thaigraph

 

   

ค้นหา
Thaigraph หน้าฟอรั่ม Ren'Py [renpy] วิธีทำให้ตัวละคร กระพร ...
ดู: 5242|ตอบ: 11
go

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

Rank: 7Rank: 7Rank: 7

โพสต์เมื่อ 30-4-2013 16:36 |แสดงโพสต์ทั้งหมด
[renpy] วิธีทำให้ตัวละคร กระพริบตา และ ขยับปากพูด [Blink And 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 ตัวละคร โดยในการบันทึกภาพนั้น เพื่อให้ง่ายต่อการกรอกพิกัดตัวเลข เราควรกำหนดให้ภาพดวงตา และปาก วางอยู่ในตำแหน่งที่สัมพันธ์กันบนใบหน้าตัวละครทีเดียวเลย และใช้การเปิด-ปิดเลเยอร์ บันทึกภาพทีละส่วนเอาค่ะ

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


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


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



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

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

ขั้นตอนที่ 3.
- เปิดไฟล์ options.rpy ขึ้นมา

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



ขั้นตอนที่ 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
  38.    
คัดลอกไปที่คลิปบอร์ด

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



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




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

บทความโดย NOOKFUFU2

(ขอสงวนสิทธิ์ให้เผยแพร่เฉพาะในเว็บไทยกราฟเท่านั้น!!!)

ไฟล์แนบ: คุณจำเป็นต้องเข้าสู่ระบบก่อนจึงจะสามารถดูและดาวน์โหลดไฟล์แนบได้ หากยังไม่มีแอคเคานต์หรือยังไม่ได้เป็นสมาชิก กรุณาสมัครสมาชิก
บางบทความคุณจำเป็นต้องสมัครสมาชิกแบบ VIP และ SUPERVIP ถึงจะเข้าอ่านบทความได้

Rank: 1

โพสต์เมื่อ 30-4-2013 19:01 |แสดงโพสต์ทั้งหมด
ต้องสนุกสิครับเพราะการสร้างเกมก็เหมือน
เล่นเกมแนวพัซเซิลยังไงยังงั้นล่ะครับ
เพื่อนๆนักสร้างเกมหลายคนคงคิดเช่นเดียวกัน
ขอบคุณกับอีกบทความดีๆครับ

Rank: 1

โพสต์เมื่อ 30-4-2013 21:44 |แสดงโพสต์ทั้งหมด
ขอบคุณมากครับผม กำลังหาวิธีทำให้กระพริบตาได้อยู่เลยครับ
ไม่สิ ให้ถูกต้องคือขอบคุณสำหรับทุกกระทู้ที่ผ่านๆมาเลยครับผม

Rank: 1

โพสต์เมื่อ 4-5-2013 19:48 |แสดงโพสต์ทั้งหมด
ขอบคุณครับ กำลังหา howto อยู่เลย

Rank: 1

โพสต์เมื่อ 9-5-2013 09:31 |แสดงโพสต์ทั้งหมด
มีคำถามเล็กน้อยครับ ส่วนตัวยังไม่มีความรู้ด้านภาษาไพธ่อน แต่ถ้าเข้าใจไม่ผิด ในส่วนของการประกาศตัวละคร เราก็ทำภาพเป็นเซ็ตๆ ทำอารมณ์นึงก็ต้องทำภาพขึ้นเซ็ตนึงเลยสินะครับ

Rank: 1

โพสต์เมื่อ 9-5-2013 12:17 |แสดงโพสต์ทั้งหมด
ใช่ครับ ทำอารมณ์นึงก็ต้องทำภาพขึ้นเซ็ตนึงครับ  

แต่ข้อดีคือเมื่อเตรียมไว้แล้ว คุณใส่ hot key ที่ตั้งชื่อตัวละครไว้ มันจะเรียกใช้งานได้โดยที่ไม่ต้องไปยุ่งแล้วครับ
(เตรียมทำแค่ครั้งเดียวต่อ1อิริยาบทครับ ^^ )


Rank: 7Rank: 7Rank: 7

โพสต์เมื่อ 9-5-2013 13:17 |แสดงโพสต์ทั้งหมด
ตอบกระทู้ Replikia ตั้งกระทู้

ใช่ค่ะ

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

และแต่ละอารมณ์ของตัวละคร ก็จะมีทั้งแววตา ระดับคิ้ว การเผยอขึ้นลงของริมฝีปาก สีของใบหน้า (แดง , ชมพู, ขาวซีด ฯลฯ) รวมถึงลักษณะการยืน การก้ม-เอียงศีรษะ ท่าทางการโพสท่าวางมือ- ยกแขน ที่จะสื่อออกมาไม่เหมือนกัน

สรุปถ้าจะทำแบบละเอียด ตัวละคร 1 ตัว เราต้อง
พเตรียมไว้หลายเซ็ต แยกเป็นเซ็ตและอารมณ์ ยกเว้นบางภาพ เราจะสามารถใช้ดวงตาและปากร่วมกันได้ เช่น เปลี่ยนแค่ท่าทางการยืนให้ต่างออกไป แต่ดวงตากับปากใช้ร่วมกันได้

การมีภาพเยอะๆ ต่อ 1 ตัวละคร
ข้อดี คือ คนเล่นชอบ เข้าใจความรู้สึกขณะนั้นของตัวละครมากขึ้น อินไปกับความรู้สึกของตัวละคร ส่วนข้อเสีย คือ คนวาดเหนื่อย -*-



ตัวอย่างก็ประมาณแบบโค๊ดด้านล่างค่ะ มันจะประยุกต์ได้หลายแบบ ในโค๊ดข้านล่าง เราจะผสมลูกเล่น CTC เพิ่มลงไปด้วย


ctc คืออะไรดูได้จากบทความนี้ค่ะ....  [renpy] วิธีใส่ภาพ animation หลังตัวละครพูดจบ ctc

  1. init:
  2.     # Create such a character.
  3.     $ me = Character('NOOKFUFU2', color="#c8ffc8")
  4.     $ v_normal = Character("วิชชา", color="#00ff2a", ctc="ctc_animation",ctc_position="fixed" ,callback=speaker("viccha_normal"))
  5.     $ v_happy = Character("วิชชา", color="#00ff2a" ,ctc="ctc_animation",ctc_position="fixed",callback=speaker("viccha_happy"))
  6.     $ v_sad = Character("วิชชา", color="#00ff2a" ,ctc="ctc_animation",ctc_position="fixed",callback=speaker("viccha_sad"))
  7.    
  8. #-------------------------------------------[  viccha_normal  ]-----------------------------------------------------
  9.     image viccha_normal = 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.         (0, 0), WhileSpeaking("viccha_normal", Animation("cha/viccha_mouth_open1.png" , .2,
  16.         "cha/viccha_mouth_half1.png", .2), "cha/viccha_mouth_closed1.png"),
  17.         )
  18. #-------------------------------------------[  viccha_happy  ]-----------------------------------------------------

  19.     image viccha_happy = LiveComposite(
  20.         (359, 500), #ระบุพิกัดตำแหน่งเริ่มต้นที่จะวางภาพตัวละครบนหน้าจอเกมส์
  21.         (0, 0), "cha/viccha_bg.png",
  22.         
  23.         (0, 0), Animation("cha/viccha_eye_open1.png", 4.5, "cha/viccha_eye_closed1.png", .25) ,
  24.         
  25.         (0, 0), WhileSpeaking("viccha_happy", Animation("cha/viccha_mouth_open1.png" , .2,
  26.         "cha/viccha_mouth_half1.png", .2), "cha/viccha_mouth_closed1.png"),
  27.         )
  28. #-------------------------------------------[  viccha_sad  ]-----------------------------------------------------

  29.     image viccha_sad = LiveComposite(
  30.         (359, 500), #ระบุพิกัดตำแหน่งเริ่มต้นที่จะวางภาพตัวละครบนหน้าจอเกมส์
  31.         (0, 0), "cha/viccha_bg.png",
  32.         
  33.         (0, 0), Animation("cha/viccha_eye_open1.png", 4.5, "cha/viccha_eye_closed1.png", .25) ,
  34.         
  35.         (0, 0), WhileSpeaking("viccha_sad", Animation("cha/viccha_mouth_open1.png" , .2,
  36.         "cha/viccha_mouth_half1.png", .2), "cha/viccha_mouth_closed1.png"),
  37.         )
  38. #------------------------------------------------[ CTC ]---------------------------------------------------

  39.     image ctc_animation = Animation("menu/ctc_1_1.png", 0.20,
  40.                                                  "menu/ctc_1_2.png", 0.20,
  41.                                                  "menu/ctc_1_3.png", 0.20,
  42.                                                  xpos=0.85, ypos=0.95,
  43.                                                  xanchor=1.0, yanchor=1.0 )
  44. #---------------------------------------------------------------------------------------------------

  45. label start:
  46.     scene black
  47.     show viccha_normal
  48.     v_normal "บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ "
  49.     hide viccha_normal
  50.    
  51.     show viccha_happy
  52.     v_happy "บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ "
  53.     hide viccha_happy
  54.    
  55.     show viccha_sad
  56.     v_sad "บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ บลาๆๆๆ "
  57.     hide viccha_sad
  58.    
  59. return
  60.    
คัดลอกไปที่คลิปบอร์ด
ชื่อ ภาพ .png บางอารมณ์จะซ้ำกันเพราะยังไม่ได้วาดไว้ -*- เอาแค่ให้มันผ่าน error ไปได้ก่อนถ้าขยันแล้วค่อยไล่วาดมาใส่ชื่อใหม่ทีหลัง


Rank: 1

โพสต์เมื่อ 16-5-2013 21:51 |แสดงโพสต์ทั้งหมด
ตอบกระทู้ NOOKFUFU2 ตั้งกระทู้

ขอบคุณมากครับผม พึ่งมีเวลาได้เข้ามาเอง ไว้จะลองไปทำดูครับ

Rank: 1

โพสต์เมื่อ 2-7-2013 19:01 |แสดงโพสต์ทั้งหมด
ขอบคุณค่ะ

Rank: 1

โพสต์เมื่อ 22-2-2015 14:50 |แสดงโพสต์ทั้งหมด
ผมทำเป๊ะแล้วอ่ะงับ แต่เวอร์ชั่นที่ผมใช้ตอนนี้เป็น 6.18 อ่ะ TT
คุณต้องเข้าสู่ระบบก่อนจึงจะสามารถตอบกลับ เข้าสู่ระบบ | สมัครสมาชิก


Thaigraph

GMT+7, 22-9-2019 00:23 , Processed in 0.340115 second(s), 20 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc. Thai Language by DiscuzThai! Team.

Top 10 Best Sellers in Clothing for 2017 Top 10 Best Sellers in Clothing Best Sellers in Clothing
Top 10 Best Sellers in Books reviewer 2017 Top 10 Best Sellers in Books Best Sellers in Books