|
แก้ไขครั้งสุดท้ายโดย nooknazha เมื่อ 2018-5-27 20:39
[Renpy] 16. วิธีทำให้ตัวละคร กระพริบตา และ ขยับปากพูด [BlinkAnd Lip Flap]
เป็นการเพิ่มความน่าสนใจให้กับตัวเกมส์อีกอย่างหนึ่งนะค่ะโดยขณะที่ประโยคสนทนา(Text)ของตัวละครกำลังแสดงไปเรื่อยๆปากของตัวละครจะขยับตามไปเรื่อยๆเช่นกัน เมื่อข้อความทั้งประโยคแสดงครบ ตัวละครก็จะหุบปากหยุดขยับปากพูดค่ะ
นอกจากการขยับของปากของตัวละครที่จะสัมพันธ์กับการแสดงข้อความสนทนาแล้ว อีกลูกเล่นหนึ่งที่น่าสนใจ คือการทำให้ตัวละครสามารถกระพริบตาได้ด้วย โดยเราสามารถกำหนดเวลาในการแสดงได้ค่ะ มาดูกันเลยดีกว่า
โค๊ดต้นฉบับ:-
- init python:
-
- # This is set to the name of the character that is speaking, or
- # None if no character is currently speaking.
- speaking = None
-
- # This returns speaking if the character is speaking, and done if the
- # character is not.
- def while_speaking(name, speak_d, done_d, st, at):
- if speaking == name:
- return speak_d, .1
- else:
- return done_d, None
-
- # Curried form of the above.
- curried_while_speaking = renpy.curry(while_speaking)
-
- # Displays speaking when the named character is speaking, and done otherwise.
- def WhileSpeaking(name, speaking_d, done_d=Null()):
- return DynamicDisplayable(curried_while_speaking(name, speaking_d, done_d))
-
- # This callback maintains the speaking variable.
- def speaker_callback(name, event, **kwargs):
- global speaking
-
- if event == "show":
- speaking = name
- elif event == "slow_done":
- speaking = None
- elif event == "end":
- speaking = None
-
- # Curried form of the same.
- speaker = renpy.curry(speaker_callback)
-
- init:
-
- # Create such a character.
- $ girl = Character("Girl", callback=speaker("girl"))
-
- # Composite things together to make a character with blinking eyes and
- # lip-flap.
- image girl = LiveComposite(
- (359, 927),
- (0, 0), "base.png",
- (101, 50), Animation("eye_open.png", 4.5, "eye_closed.png", .25) ,
- (170, 144), WhileSpeaking("girl", Animation("mouth_speak1.png", .2,
- "mouth_speak2.png", .2), "mouth_closed.png"),
- )
-
- # The game starts here.
- label start:
-
- scene black
- show girl
-
- "Not speaking."
-
- girl "Now I'm speaking. Blah blah blah blah blah blah blah."
-
- "Not speaking any more."
-
- 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 เราจะต้องประกาศตัวแปรตัวละครแตกต่างจากการประกาศตัวแปรแบบปกติ(ดูตามภาพประกอบด้านล่างเลยค่ะ)
- init:
-
- # Create such a character.
- $ me = Character('NOOKFUFU2', color="#c8ffc8")
- $ v = Character("วิชชา", color="#00ff2a" ,callback=speaker("viccha01"))
-
- # Composite things together to make a character with blinking eyes and
- # lip-flap.
- image viccha01 = LiveComposite(
- (359, 500), #ระบุพิกัดตำแหน่งเริ่มต้นที่จะวางภาพตัวละครบนหน้าจอเกมส์
- (0, 0), "cha/viccha_bg.png",
- #กำหนดพิกัดตำแหน่งของดวงตาเปิด และดวงตาปิด กำหนดให้ลืมตากี่วินาที ถึงจะกระพริบตา
- (0, 0), Animation("cha/viccha_eye_open1.png", 4.5, "cha/viccha_eye_closed1.png", .25) ,
-
- #กำหนดพิกัดตำแหน่งของปากขยับชึ้น - ลง
- (0, 0), WhileSpeaking("viccha01", Animation("cha/viccha_mouth_open1.png" , .2,
- "cha/viccha_mouth_half1.png", .2), "cha/viccha_mouth_closed1.png"),
- )
- #ที่กำหนดพิกัด ดวงตาและปากให้เป็น 0.0 เพราะต้องการให้ยึดพิกัดเดียวกันกับภาพbgตัวละคร
- init:
- $ move = MoveTransition(0.5)
- label start:
- scene black
- show viccha01
- me "ลองพูดกับฉันหน่อยดิ๊ ปากแกขยับได้ยัง?"
- v "จะให้พูดว่าอะไรล่ะ(ว่ะ)ครับ ก.ไก่ ข.ไข่ บลาๆๆๆ"
- me "อั๊ยยะ ปากเอ็งขยับได้แล้วเว้ย 555"
- me "ไหนลองย้ายไปอยู่ที่ที่ด้านซ้ายของหน้าจอสิ ปากกับตา ย้ายตามไปด้วยป่ะ"
-
- show viccha01 at left
- me "โฮ๊ะ ย้ายตามด้วย แบบนี้แหล่มเลย"
- me "งั้นขออีกรอบ แกลองค่อยๆขยับตัว เลื่อนไปทางขวาให้ดูหน่อยดิ๊"
- show viccha01 at right with move
- v "แบบนี้ใช่ป่ะ"
- me "โอเค. เวิร์ค!!!"
-
- return
คัดลอกไปที่คลิปบอร์ด
(ภาพตัวอย่างการประกาศตัวแปร....)
บันทึกไฟล์ทั้งหมด และลองรันโปรแกรม....
ขอให้สนุกกับการสร้างเกมส์นะค่ะ (จริงๆ ก็รู้ว่ามันไม่สนุกหรอก ต้องเครียด +ต้องเหนื่อย + ต้องอดทน แต่ใจมันรักที่จะทำ ก็ทำใจให้สนุกไว้ดีกว่าเกมส์ของเราจะได้ออกมาดี ^^ )
บทความโดย นุ้ก
ขอจบบทความแค่เพียงเท่านี้ แล้วพบกันใหม่บทความหน้าค่ะ ^^
(ขอสงวนสิทธิ์อนุญาตให้เผยแพร่เฉพาะในเว็บ www.graphicfufu.comเท่านั้น)
|
|