การพัฒนาเกม

คำถาม & คำตอบสำหรับนักพัฒนาเกมมืออาชีพและเป็นอิสระ

1
รูปร่าง (สี่เหลี่ยม) ทำงานในต้นไม้สี่ทิศได้อย่างไร
ฉันถูกบอกว่าต้นไม้รูปสี่เหลี่ยมเป็นโครงสร้างข้อมูลที่เหมาะสำหรับเกมของฉัน แต่ฉันมีปัญหาในการทำความเข้าใจว่ารูปร่างทำงานอย่างไรภายในต้นไม้รูปสี่เหลี่ยม ฉันทำสิ่งนี้ใน JavaScript แต่ฉันคิดว่าคำถามเหล่านี้สามารถใช้ได้กับต้นไม้สี่ต้นในภาษาใด ๆ ผมคิดว่าผมเข้าใจส่วนใหญ่วิธีการขั้นพื้นฐาน (x, y) จุดและแทรกจุดงานในต้นไม้รูปสี่เหลี่ยมและที่ฉันสามารถทำมันบนกระดาษ นี่คือJSfiddleของการทดสอบของฉันกับจุด นอกเหนือจากกรณีหนึ่งการทดสอบของฉันกับคะแนนทำงานตามที่คาดไว้ แต่ความสับสนของฉันเริ่มต้นเมื่อรูปร่างเช่นสี่เหลี่ยมมีส่วนร่วม เมื่อคุณดึงข้อมูลจากต้นไม้รูปสี่เหลี่ยมด้วยรูปร่างมันจะตรวจสอบแต่ละจุดของรูปร่างและโหนดใดที่มันตกลงไป และการแทรกรูปร่างยังทำงานได้อย่างไรเมื่อมันยอมรับพารามิเตอร์ (x, y, width, height) สำหรับแต่ละรูปร่าง มันใช้ความกว้าง / ความสูงจากจุดเริ่มต้นในการคำนวณจุดมุมอื่น ๆ ซึ่งจะถูกแจกจ่ายไปยังโหนดที่เหมาะสม? หากรูปร่างที่แทรกเข้าไปมีสี่โหนดข้อมูลของรูปร่างนั้นจะถูกบันทึกลงในทั้งสี่โหนดหรือไม่ และเมื่อวิธีการดึงข้อมูลยอมรับรูปร่างเป็นพารามิเตอร์ (x, y, ความกว้างความสูง) สิ่งที่เกิดขึ้นจริง? มันเป็นครั้งแรกหรือไม่ที่จะเห็นว่ารูปร่างของโหนดนั้นจะขยายไปถึงถ้ามันถูกแทรกเข้าไปแล้วดึงวัตถุทั้งหมดของโหนดเหล่านั้นหรือไม่? ฉันมีJSfiddle ทำงานกับรูปร่างแต่ฉันสับสนอย่างมากกับผลลัพธ์ของการทดสอบของฉัน ฉันได้รับวัตถุที่ซ้ำกันที่ถูกส่งคืน! ตัวอย่างเช่นสี่เหลี่ยมจัตุรัสสีแดงนั้นเทียบเท่ากับพารามิเตอร์ที่ฉันกำลังเข้าสู่วิธีการดึงของฉัน ฉันคิดว่าเนื่องจากสี่เหลี่ยมสีแดงนี้ครอบคลุมทั้งสี่โหนดมันควรส่งคืนวัตถุทุกชิ้นในต้นไม้รูปสี่เหลี่ยม! แต่มันไม่ได้และฉันมีปัญหาในการหาเหตุผลเข้าข้างตนเองว่ามันจะกลับมา ฉันมีการทดสอบอื่น ๆ อีกจำนวนมากที่แสดงความคิดเห็นอยู่ในขณะนี้ แต่คุณสามารถยกเลิกการแสดงความคิดเห็นและเรียกใช้พวกเขาเพื่อดูผลลัพธ์ที่สับสนมากขึ้น! ถ้าฉันต้องการส่งคืนคะแนนทั้งหมดในต้นไม้รูปสี่เหลี่ยมฉันจะทำอย่างไร วิธีการดึงข้อมูลโดยใช้รูปร่างขนาดทั้งหมดของขอบเขต? ตัวอย่างเช่นดึง (0, 0, canvas.width, canvas.height)? ห้องสมุด …

1
พื้นผิวของแผ่นสไปรต์ยกขอบของพื้นผิวที่อยู่ติดกัน
ฉันมีชุดสไปรต์แบบกำหนดเอง (openGL 2.0) ซึ่งใช้แผ่นงานสไปรต์ง่าย ๆ (พื้นผิวของฉันถูกจัดเรียงในแนวนอนติดกัน) ตัวอย่างเช่นนี่คือแผ่นทดสอบสไปรต์ที่มีพื้นผิวที่เรียบง่าย 2 แบบ: ตอนนี้สิ่งที่ฉันทำเมื่อสร้างวัตถุ openGL sprite ของฉันคือการระบุจำนวนเฟรมทั้งหมดในแอตลาสและเมื่อวาดให้ระบุเฟรมที่ฉันต้องการวาด จากนั้นจะหาตำแหน่งที่จะจับพื้นผิวจาก: การหารหมายเลขเฟรมที่ต้องการด้วยจำนวนเฟรมทั้งหมด (เพื่อรับค่าพิกัดซ้าย) จากนั้นทำการดำน้ำ 1 ตามจำนวนเฟรมทั้งหมดและเพิ่มผลลัพธ์ลงในพิกัดด้านซ้ายที่คำนวณข้างต้น ดูเหมือนว่าจะใช้งานได้ แต่บางครั้งฉันก็มีปัญหา พูดเช่นฉันต้องการวาด X ด้านล่างและฉันได้รับ ........... ฉันเคยได้ยินเกี่ยวกับการใส่ 'padding' ของ 1 px ระหว่างแต่ละพื้นผิว แต่บางคนสามารถอธิบายได้อย่างแม่นยำว่ามันทำงานอย่างไร ฉันหมายความว่าถ้าฉันทำสิ่งนี้มันจะสลัดการคำนวณออกไปเพื่อให้ได้พื้นผิว หากฉันรวมการซ้อนทับในพื้นผิวที่หยิบง่าย (ดังนั้นเทพดาจะถูกวาดด้วยเส้นขอบที่ว่างเปล่า) ดังนั้นถ้าเป็นเช่นนั้นจะทำให้เกิดปัญหากับการตรวจจับการชนกันหรือไม่ (เช่นสไปรต์อาจปรากฏขึ้นเพื่อชนกันเมื่อใช้กล่องที่มีขอบเขตเมื่อชิ้นส่วนโปร่งใสชนกัน) จะขอบคุณถ้ามีคนอธิบาย

6
ฉันจะรับพิกัดพิกเซลเป็น hex บนแผนที่ฐานสิบหกที่ใช้อาร์เรย์ได้อย่างไร
ฉันกำลังพยายามสร้างพิกเซลเพื่อประสานการทำงานของแผนที่ฐานสิบหก แต่ฉันไม่ได้คณิตศาสตร์อย่างถูกต้องทุกอย่างที่ฉันพยายามทำดูเหมือนจะผิดเพี้ยนไปเล็กน้อย โดย 'ตามอาร์เรย์' ฉันหมายถึงวิธีการสั่งซื้อ hexes ดูรูป ผลลัพธ์ที่แม่นยำที่สุดที่ฉันได้รับคือด้วยรหัสต่อไปนี้ แต่มันยังคงปิดอยู่และยิ่งแย่ลงยิ่งมีค่ามากขึ้น: public HexCell<T> coordsToHexCell(float x, float y){ final float size = this.size; // cell size float q = (float) ((1f/3f* Math.sqrt(3) * x - 1f/3f * y) / size); float r = 2f/3f * y / size; return getHexCell((int) r, (int) q); …

3
คำแนะนำเกี่ยวกับการเชื่อมโยงระหว่างระบบคอมโพเนนต์ของเอ็นติตี้ใน C ++
หลังจากอ่านเอกสารเกี่ยวกับระบบส่วนประกอบของเอนทิตีฉันตัดสินใจใช้ของฉัน จนถึงตอนนี้ฉันมีระดับโลกซึ่งมีเอนทิตีและผู้จัดการระบบ (ระบบ), คลาสเอนทิตีซึ่งมีส่วนประกอบเป็น std :: map และระบบไม่กี่ระบบ ฉันถือเอนทิตีเป็น std :: vector ในโลก ไม่มีปัญหาจนถึงตอนนี้ สิ่งที่ทำให้ฉันสับสนคือการวนซ้ำของเอนทิตีฉันไม่สามารถมีความคิดที่ชัดเจนดังนั้นฉันยังไม่สามารถใช้ส่วนนั้นได้ ทุกระบบควรมีรายการขององค์กรที่พวกเขาสนใจหรือไม่? หรือฉันควรทำซ้ำผ่านเอนทิตีในระดับโลกและสร้างการวนซ้ำแบบวนซ้ำเพื่อทำซ้ำผ่านระบบและตรวจสอบว่าเอนทิตีมีส่วนประกอบที่ระบบสนใจหรือไม่ ฉันหมายถึง : for (entity x : listofentities) { for (system y : listofsystems) { if ((x.componentBitmask & y.bitmask) == y.bitmask) y.update(x, deltatime) } } แต่ฉันคิดว่าระบบ bitmask จะปิดกั้นความยืดหยุ่นในกรณีที่ฝังภาษาสคริปต์ หรือมีรายการท้องถิ่นสำหรับแต่ละระบบจะเพิ่มการใช้หน่วยความจำสำหรับคลาส ฉันสับสนมาก

2
วิธีที่ดีที่สุดในการอัปเดตเครื่องแบบ shader คืออะไร?
อะไรคือวิธีที่ได้รับการยอมรับมากที่สุดในการรักษาเมทริกซ์ของ shader ให้ทันสมัยและทำไม? ตัวอย่างเช่นในตอนนี้ฉันมีShaderชั้นเรียนที่จัดเก็บด้ามจับไปยังโปรแกรมและชุดเครื่องแบบ GLSL ทุกครั้งที่ฉันขยับกล้องฉันจะต้องผ่านเมทริกซ์มุมมองใหม่ไปยัง shader จากนั้นวัตถุทุกอย่างในโลกที่แตกต่างกันฉันจะต้องผ่านเมทริกซ์โมเดลไปยัง shader สิ่งนี้ จำกัด ฉันอย่างรุนแรงเนื่องจากฉันไม่สามารถทำอะไรได้หากไม่สามารถเข้าถึงวัตถุ shader นั้นได้ ฉันคิดว่าจะสร้างShaderManagerชั้นเรียนเดี่ยวที่รับผิดชอบการถือร่มเงาที่ใช้งานอยู่ทั้งหมด จากนั้นฉันก็สามารถเข้าถึงสิ่งนั้นได้จากทุกที่และวัตถุในโลกไม่จำเป็นต้องรู้เกี่ยวกับสิ่งที่ shaders กำลังใช้งานอยู่เพียงเพื่อให้พวกเขาShaderManagerรู้เมทริกซ์ที่ต้องการ แต่ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดและอาจมีปัญหาบางอย่าง จะเกิดขึ้นจากการใช้วิธีการนี้
10 opengl  shaders  glsl 

4
ฉันจะจัดการรูปแบบแป้นพิมพ์ที่แตกต่างได้อย่างไร
สมมติว่าฉันมีเกมที่ใช้ตัวควบคุม WASD ในเค้าโครง QWERTY พยายามที่จะใช้การควบคุมเหล่านี้ในพูดเค้าโครง Dvorak ไม่เหมาะ (เทียบเท่า<A:Hกับ QWERTY) เห็นได้ชัดว่าฉันต้องการใช้ปุ่มทางกายภาพเหมือนกับที่ QWERTY ใช้ ( ,aoeบน DVORAK) ฉันคิดวิธีแก้ปัญหาที่เป็นไปได้สองสามข้อ: บังคับให้ผู้ใช้ใช้ QWERTY เห็นได้ชัดว่าไม่เหมาะโดยเฉพาะอย่างยิ่งสำหรับผู้ใช้ต่างประเทศ เปลี่ยนทางลัดตามเค้าโครงแป้นพิมพ์ (WASD ->, aoe) บังคับให้ฉันทำแผนผังเลย์เอาต์สำหรับแต่ละเลย์เอาต์ที่รองรับ (อัตโนมัติ) ง่ายที่สุดสำหรับผู้ใช้หากมีทางลัดมากกว่า WASD บังคับให้ผู้ใช้กำหนดทางลัดด้วยตนเอง ยืดหยุ่นมากขึ้น น่ารำคาญหากมีทางลัดมากมาย สามารถใช้ร่วมกับตัวเลือกที่สอง ใช้รหัสฮาร์ดแวร์ สอดคล้องกันทั่วคีย์บอร์ด? จัดการกับสิ่งนี้ได้อย่างไร
10 keyboard 

3
การควบคุมแหล่งที่มาสำหรับจัดเก็บทุกสิ่งในโครงการเกมหรือไม่
เป็นเรื่องปกติที่จะจัดการไม่เพียง แต่ซอร์สโค้ด แต่เนื้อหาพื้นผิวศิลปะไฟล์เอกสาร ฯลฯ ภายใต้ที่เก็บ git สำหรับการควบคุมเวอร์ชันหรือไม่? ตัวอย่างเช่นฉันต้องการกลับไปใช้พื้นผิวแบบเก่า หากเป็นการปฏิบัติที่ไม่ดีมากคุณใช้เครื่องมือใดในการควบคุมเวอร์ชันของเนื้อหาและเนื้อหาอื่น ๆ

2
คุณจะแยกการวางแนวจากเมทริกซ์การแปลงได้อย่างไร?
ฉันมีเมทริกซ์การแปลง 4x4 M และฉันต้องการค้นหารูปร่างของทรงกลมเมื่อเปลี่ยนโดย M (ทรงกลมอยู่ที่จุดกำเนิดและมีรัศมี 1) ฉันรู้ว่าฉันสามารถหาจุดศูนย์กลางได้โดยการคูณ M ด้วย (0,0,0,1) อย่างไรก็ตามรัศมีกลายเป็นปัญหาเนื่องจาก M สามารถบีบและหมุนทรงกลมได้ ฉันจะทราบรัศมีใหม่ของทรงรีที่เกิดขึ้นได้อย่างไร มีวิธีใดบ้างในการค้นหาการปฐมนิเทศ? โดยเฉพาะอย่างยิ่งฉันจำเป็นต้องรู้ขนาดของทรงกลมที่มีขอบเขตซึ่งจะล้อมรอบทรงกลมที่ถูกเปลี่ยนรูป กล่าวอีกนัยหนึ่งค่าสูงสุดคืออะไร | M * V - M * (0,0,0,1) | โดยที่ V คือเวกเตอร์หน่วย (จุดบนทรงกลมดั้งเดิม)

3
การนำทางอัตโนมัติที่สง่างาม
ฉันกำลังมองหาข้อมูลเกี่ยวกับวิธีที่ผู้คนใช้การทำให้เป็นอัตโนมัติในเกมแบบเรียงต่อกัน จนถึงตอนนี้ฉันมักจะพูดโพล้เพล้ด้วยประโยค "hardcoded" if ... else ... "และตอนนี้ฉันตัดสินใจแล้วว่าถึงเวลาที่จะหาคำตอบที่ดีกว่านี้แล้ว ฉันไปค้นหาบนอินเทอร์เน็ตเพื่อดูตัวอย่างการใช้งานอัตโนมัติและการอภิปรายหัวข้อ แต่ฉันมีบทความสามบทความเท่านั้น: http://www.codeproject.com/Articles/106884/Implementing-Auto-tiling-Functionality-in-a-Tile-M http://blog.rpgmakerweb.com/tutorials/anatomy-of-an-autotile http://web.archive.org/web/20130927193449/http://www.squidi.net/mapmaker/musings/m091016.php (โดยเฉพาะอย่างยิ่งสุดท้ายคือครอบคลุมและเป็นประโยชน์มาก) ฉันได้ดูการใช้งานต่างๆและเอกสารประกอบของห้องสมุดที่นำมาใช้เช่น flixel: http://www.flixel.org/features.html#tilemaps น่าเศร้าที่วิธีแก้ปัญหาทั้งหมดที่ฉันสามารถหาได้นั้นเป็นวิธีการที่ได้รับการปรับแต่งและส่งเดชตรงตามที่ฉันเริ่มต้นและแทบไม่เคยครอบคลุมกรณีที่เป็นไปได้ทั้งหมด ฉันกำลังมองหาตัวอย่างอันงดงามของการติดตั้งระบบอัตโนมัติที่ฉันเรียนรู้ได้

12
ฉันจะป้องกันกลโกงการปรับเปลี่ยนหน่วยความจำได้อย่างไร
ปัจจุบันมีโปรแกรมแก้ไขหน่วยความจำมากมายที่มีอยู่ในปัจจุบัน ( Cheat Engine & co) มีวิธีที่มีประสิทธิภาพเพื่อให้ตัวแปรคงจริงอย่างต่อเนื่อง? ฉันมีสองแนวคิด: ทำให้เธรดแยกการอัพเดตตัวแปรคงที่ให้เป็นค่าคงที่เช่น 200 ทุก ๆ นาที ปัญหา: หนึ่งสามารถแก้ไขค่าที่สอง เก็บค่าไว้บนเซิร์ฟเวอร์ ปัญหา: ฉันต้องการให้ปริมาณการใช้เครือข่ายต่ำที่สุด ฉันต้องการกลไกนี้สำหรับค่าคงที่และตัวแปรอนุญาตให้มีค่าบางช่วงเท่านั้น มีวิธีที่ดีกว่าในการทำเช่นนี้?
10 anti-cheat 

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

1
วิธีการเปลี่ยนสีของพิกเซลพื้นหลัง
ฉันกำลังเขียนเกมและแก้ไขแผนที่โดยใช้ Java และ jMonkeyEngine ในเครื่องมือแก้ไขแผนที่ฉันมีแปรงทำโดย wireframed sphere ปัญหาของฉันคือ: ฉันต้องการให้มันปรากฏทุกที่ดังนั้นฉันต้องการกลับสีของพิกเซล "หลัง" แปรงนี้ ฉันอยากจะทำมันด้วย fragment shader (GLSL) แต่ฉันไม่รู้วิธีรับสีของพิกเซลนี้

3
ฉันจะซิงค์สถานะเกมแบบผู้เล่นหลายคนได้อย่างมีประสิทธิภาพกว่าการอัพเดทแบบเต็มได้อย่างไร
ฉันเคยทำการเข้ารหัสเครือข่ายเกมมาก่อน แต่ส่วนใหญ่ใช้ TCP สำหรับเกมโดยไม่ต้องใช้เวลาจริง ฉันกำลังทำงานกับเกม 2D Java ที่มีผู้เล่นหลายคนบนเครือข่าย เพื่อการเรียนรู้ฉันต้องการทำสิ่งนี้ด้วยตัวเองโดยไม่มี API เครือข่ายที่มีอยู่ ฉันจะแสดงสถานะเกมที่ส่งถึงลูกค้าจากเซิร์ฟเวอร์ได้อย่างมีประสิทธิภาพได้อย่างไร มีมากที่สุดที่เห็นได้ชัด แต่อาจน้อยกว่าวิธีที่มีประสิทธิภาพซึ่งจะสร้างบางประเภทของวัตถุบริบทเกมของรัฐที่มีสถานที่ตั้งของผู้เล่นแต่ละรัฐนิเมชั่น ฯลฯ และส่งออกที่ผู้เล่นแต่ละคนคือการปรับปรุงทุก ดูเหมือนจะไม่ยากอย่างยิ่งที่จะใช้งาน แต่อาจมีขนาดใหญ่เกินไปที่จะบรรลุสิ่งที่ใกล้เคียงกับการโต้ตอบแบบเรียลไทม์ (แน่นอนว่าประสบการณ์ของฉันเกี่ยวกับสิ่งนี้ จำกัด ดังนั้นฉันอาจไม่ถูกต้อง) มีวิธีที่มั่นคงที่คุณเคยใช้มาก่อนในการส่งการเปลี่ยนแปลงในสถานะและมีความแตกต่างมากพอในการปฏิบัติงานที่มีค่างานพิเศษหรือไม่

2
วิธีการใช้ปฏิสัมพันธ์ระหว่างชิ้นส่วนเครื่องยนต์?
ฉันต้องการถามคำถามเกี่ยวกับวิธีการแลกเปลี่ยนข้อมูลระหว่างชิ้นส่วนกลไกเกม เครื่องยนต์ถูกแยกออกเป็นสี่ส่วน: ลอจิก, ข้อมูล, UI, กราฟิก ในตอนแรกฉันทำการแลกเปลี่ยนนี้ผ่านธง ตัวอย่างเช่นถ้าวัตถุใหม่จะถูกเพิ่มในข้อมูลธงในชั้นเรียนของวัตถุจะถูกกำหนดให้เป็นisNew trueและหลังจากนั้นส่วนกราฟิกของเครื่องยนต์จะตรวจสอบธงนี้และจะเพิ่มวัตถุลงในโลกของเกม แม้ว่าด้วยวิธีนี้ฉันต้องเขียนโค้ดมากเพื่อประมวลผลค่าสถานะของวัตถุแต่ละชนิด ฉันคิดว่าจะใช้ระบบเหตุการณ์บางอย่าง แต่ฉันไม่มีประสบการณ์เพียงพอที่จะรู้ว่านี่จะเป็นทางออกที่ถูกต้องหรือไม่ ระบบเหตุการณ์เป็นแนวทางที่เหมาะสมหรือฉันควรใช้อย่างอื่นหรือไม่ ฉันใช้ Ogre เป็นเอ็นจิ้นกราฟิคถ้ามันสำคัญ
10 c++  architecture 

2
อะไรทำให้เป็นหน้าจอในเกม C64 ทั่วไป
ฉันกำลังพยายามหาพื้นฐานของการพัฒนาเกม C64 ที่ผ่านมา BASIC และฉันสามารถใช้คำแนะนำในสิ่งที่พื้นฐานมาก แต่สำคัญ: อะไรคือสิ่งที่อยู่บนหน้าจอจริง ๆ แล้วจะวาดอย่างไร? ดูที่Katakis / Denaris : มีอย่างน้อย 9 อย่างบนหน้าจอ: แถบคะแนนด้วยแบบอักษรที่แตกต่างกัน ตัวเรือเอง ดาวเทียมที่ติดอยู่กับเรือสามารถถอดออกได้ ขีปนาวุธอาวุธรอง ขีปนาวุธอาวุธหลัก วัตถุเคลื่อนที่ (อาจเป็นเรือศัตรู) แถบสถานะที่มีภาพของเรือจำนวนชีวิตและสามส่วนที่สามารถเติมได้ แถบชาร์จอาวุธหลักสามารถเติมจนจบ สตาร์ฟิลด์เลื่อนในพื้นหลัง (ไม่ใช่หมายเลขบนหน้าจอ) วัตถุที่เป็นของแข็งเช่นหินหรือผนังโลหะที่เป็นส่วนหนึ่งของพื้นหลัง C64 รองรับเพียง 8 sprite ต่อเส้นสแกนแนวนอนดังนั้นฉันไม่คิดว่าทุกอย่างที่อยู่ตรงกลางของหน้าจอจะเป็น sprite หรือไม่ ฉันจะสมมติว่าสิ่งใดก็ตามที่ต้องมีการปะทะกันจะเป็นสไปรต์ (เนื่องจากฉันสามารถรับการตรวจจับการชนกันของฮาร์ดแวร์กับสไปรต์) ได้ นอกจากนี้อาวุธของฉันสามารถยิงกระสุนมากกว่าหนึ่งลำ - เรือของฉันดาวเทียมและกระสุน 6 อันก็จะเรียงกันเป็น 8 ครั้งต่อเนื่อง (ดูประมาณ 50 วินาทีในวิดีโอ) นอกจากนี้เกมกราฟิกแบบไหนที่จะใช้เช่นนี้? คู่มือการเขียนโปรแกรมแสดงรายการโหมดบิตแผนที่ซึ่งจำเป็นต้องแก้ไขหน่วยความจำหน้าจอโดยตรง …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.