1 00:00:00,000 --> 00:00:05,069 2 00:00:05,069 --> 00:00:06,110 โธมัส LIVELY สิทธิทั้งหมด 3 00:00:06,110 --> 00:00:07,450 สวัสดีทุกคน. 4 00:00:07,450 --> 00:00:08,690 ฉันโทมัสมีชีวิตชีวา 5 00:00:08,690 --> 00:00:15,160 งานสัมมนาครั้งนี้เป็นไปได้ การเขียนเกม 2D ใน C ใช้ SDL 6 00:00:15,160 --> 00:00:17,970 ดังนั้นผมจึงรู้ว่าคุณกำลังทั้งหมด ถามว่าใช่ฉันจริงๆ 7 00:00:17,970 --> 00:00:22,050 ต้องการที่จะเล่นเกมและทำให้เกม แต่สิ่งที่เป็นธุรกิจนี้ SDL? 8 00:00:22,050 --> 00:00:25,320 ดังนั้น SDL เป็นห้องสมุด C 9 00:00:25,320 --> 00:00:28,270 มันหมายถึงง่าย DirectMedia ชั้น 10 00:00:28,270 --> 00:00:31,340 และมันเป็นข้ามแพลตฟอร์ม ห้องสมุดพัฒนาเกม 11 00:00:31,340 --> 00:00:37,160 มันทำงานบน Windows, Mac, ลินุกซ์แม้ iOS และ Android 12 00:00:37,160 --> 00:00:40,380 สามารถจัดการกับสิ่งที่ชอบ การเข้าถึงระบบเสียง 13 00:00:40,380 --> 00:00:44,900 สำหรับเครื่องคอมพิวเตอร์แป้นพิมพ์และ เมาส์จอยสติ๊กถ้าพวกเขากำลังแนบ 14 00:00:44,900 --> 00:00:48,300 ในมือถือก็ยังสามารถทำ สัมผัสการป้อนข้อมูลและทุกที่ 15 00:00:48,300 --> 00:00:53,030 และแน่นอนที่จะจัดการกับกราฟิก การวาดภาพสิ่งที่หน้าจอ 16 00:00:53,030 --> 00:00:56,470 >> ดังนั้นจึงใช้กันอย่างแพร่หลายมากแม้ว่า คุณอาจไม่เคยได้ยินมาก่อน 17 00:00:56,470 --> 00:01:00,860 มันสร้างขึ้นในยกตัวอย่างเช่น เครื่องยนต์แหล่งวาล์ว 18 00:01:00,860 --> 00:01:04,970 ซึ่งเกมอำนาจเช่น Portal และ Team Fortress 2 19 00:01:04,970 --> 00:01:08,680 มันยังอยู่ในจำนวนมาก ของเกมอินดี้ที่ออกมา 20 00:01:08,680 --> 00:01:13,545 ดังนั้นฉันตื่นเต้นที่จะได้เห็นสิ่งที่คุณ ทั้งหมดจะทำกับมัน 21 00:01:13,545 --> 00:01:20,000 >> เป้าหมายการสัมมนาจะได้รับคุณ ออกไปได้รับการพัฒนาด้วย SDL 22 00:01:20,000 --> 00:01:22,700 เรากำลังจะไปเรียนรู้วิธีการ เพื่อสร้างหน้าต่างเกม 23 00:01:22,700 --> 00:01:26,130 เรากำลังจะสร้างสไปรท์, ซึ่งเป็นภาพในเกมของคุณ 24 00:01:26,130 --> 00:01:27,744 ที่สามารถย้ายไปรอบ ๆ 25 00:01:27,744 --> 00:01:29,910 เรากำลังจะไปเรียนรู้วิธีการ และสไปรท์เคลื่อนไหวที่ 26 00:01:29,910 --> 00:01:32,910 เพื่อย้ายไปรอบ ๆ ให้ พวกเขาเปลี่ยนแปลงตลอดเวลา 27 00:01:32,910 --> 00:01:35,580 และเรากำลังจะไปเรียนรู้วิธีการ ในการจับภาพแป้นพิมพ์และเมาส์ 28 00:01:35,580 --> 00:01:38,240 ข้อมูลจากคอมพิวเตอร์ 29 00:01:38,240 --> 00:01:41,550 สิ่งที่เราจะไม่ได้รับการพูดคุย เกี่ยวกับวันนี้เป็นกราฟิก 3D 30 00:01:41,550 --> 00:01:45,520 เพราะเห็นว่าเป็นความซับซ้อนมาก เรื่องที่เราไม่ได้มีเวลาสำหรับ 31 00:01:45,520 --> 00:01:49,010 เราจะไม่เรียนรู้วิธีการ เล่นเสียงในเกมของเรา 32 00:01:49,010 --> 00:01:53,300 และเราจะไม่ได้รับการสร้าง แต่สำหรับสิ่งที่ลินุกซ์ 33 00:01:53,300 --> 00:01:58,330 >> ตอนนี้ caveats มีว่า หวังว่าภายในสิ้นการสัมมนา 34 00:01:58,330 --> 00:02:01,660 คุณจะสะดวกสบายกับ เอกสาร SDL, 35 00:02:01,660 --> 00:02:05,370 ดังนั้นคุณจะสามารถที่จะไปคิดออก วิธีการเล่นเสียงสำหรับตัวคุณเอง 36 00:02:05,370 --> 00:02:12,150 นอกจากนี้ยังมีอาคารสำหรับ Mac หรือ PC ควรจะทำงาน เหมือนกับอาคารสำหรับลินุกซ์ 37 00:02:12,150 --> 00:02:14,700 แต่การติดตั้งเป็นไป จะแตกต่างกันเล็กน้อย 38 00:02:14,700 --> 00:02:17,700 ดังนั้นคุณควรจะสามารถที่จะคิด วิธีการที่จะทำสิ่งเหล่านี้ 39 00:02:17,700 --> 00:02:20,900 ในตอนท้ายของการสัมมนาในวันนี้ 40 00:02:20,900 --> 00:02:26,980 >> ดังนั้นสำหรับการตั้งค่าที่เรากำลังจะ ที่จะใช้เครื่องเสมือน 41 00:02:26,980 --> 00:02:31,010 เราจะใช้ IDE CS50 เพราะ เราเพียงแค่จะต้องเขียนใน C. 42 00:02:31,010 --> 00:02:35,120 แต่เนื่องจาก IDE ไม่ได้เป็นเบราว์เซอร์ที่เรา ไม่สามารถสร้างหน้าต่างใหม่หรือการแสดงผล 43 00:02:35,120 --> 00:02:36,410 กราฟิกในนั้น 44 00:02:36,410 --> 00:02:38,450 ดังนั้นเราจึงจำเป็นต้องใช้เครื่องเสมือน 45 00:02:38,450 --> 00:02:47,790 เพื่อให้คุณสามารถปฏิบัติตามคำแนะนำ ที่นี่ที่ manual.CS50.net/appliance/15 46 00:02:47,790 --> 00:02:53,290 การติดตั้งเครื่อง CS50 อย่างเป็นทางการ ซึ่งเป็นเพียงเสมือนลินุกซ์ 47 00:02:53,290 --> 00:02:55,110 เครื่อง 48 00:02:55,110 --> 00:02:58,090 >> และจากนั้นเมื่อคุณมี ที่ตั้งทั้งหมด up-- มัน 49 00:02:58,090 --> 00:03:02,090 อาจใช้เวลาสักครู่เพราะ download-- ขนาดใหญ่มากที่คุณจะ 50 00:03:02,090 --> 00:03:07,060 การทำงานใน VM ปรับปรุง sudo apt-get 51 00:03:07,060 --> 00:03:09,410 และที่จะจริงๆ ในการปรับปรุงซอฟต์แวร์ทั้งหมด 52 00:03:09,410 --> 00:03:12,670 แพคเกจในเครื่องเสมือนของคุณ 53 00:03:12,670 --> 00:03:20,130 >> หลังจากนั้นคุณกำลังจะไปทำงาน sudo apt-get ติดตั้ง libsdl2-2.0-0, 54 00:03:20,130 --> 00:03:27,960 libsdl2-DBG, libsdl2-dev และ นอกจากนี้ libsdl2-ภาพ 2.0-0, 55 00:03:27,960 --> 00:03:32,560 libsdl2 ภาพ-DBG, และ libsdl2 ภาพ-dev 56 00:03:32,560 --> 00:03:33,640 ดังนั้นสิ่งที่จะทำอย่างไร 57 00:03:33,640 --> 00:03:38,440 นั่นเป็นเพียงการแก้ปัญหาการติดตั้ง ข้อมูลเอกสารส่วนหัว 58 00:03:38,440 --> 00:03:41,260 และไบนารีสำหรับสองห้องสมุด 59 00:03:41,260 --> 00:03:45,090 ปกติเก่า SDL 2.0 และห้องสมุดอีก 60 00:03:45,090 --> 00:03:50,110 เรียกว่าภาพ SDL ซึ่ง เราจะต้องใช้ 61 00:03:50,110 --> 00:03:54,560 ในการโหลดไฟล์ภาพในเกมของเรา 62 00:03:54,560 --> 00:03:57,860 >> ดังนั้นเมื่อคุณมีที่ยัง ที่เพียงแค่เมื่อมันถามว่า 63 00:03:57,860 --> 00:04:01,100 คุณเพียงแค่พิมพ์ใช่กด Enter การติดตั้งแพคเกจเหล่านั้น 64 00:04:01,100 --> 00:04:04,430 แล้วคุณควรจะดีไป 65 00:04:04,430 --> 00:04:14,800 เพื่อที่จะได้รับรหัสการกระจายคุณ can-- โอ้รักนี้จะไม่มีการปรับปรุง 66 00:04:14,800 --> 00:04:18,480 ถ้าคุณมี GitHub account-- ถ้าคุณมีบัญชี GitHub, 67 00:04:18,480 --> 00:04:24,450 คุณสามารถทำ Git นี้ คำสั่งโคลนที่จะซื้อคืน 68 00:04:24,450 --> 00:04:30,490 และที่จะดาวน์โหลด Git repo กับทุกรหัสในนั้น 69 00:04:30,490 --> 00:04:31,700 เพื่อที่คุณจะมีรหัส 70 00:04:31,700 --> 00:04:36,470 >> หากคุณไม่ได้มี GitHub บัญชีสิ่งที่คุณควรทำคือการพิมพ์ 71 00:04:36,470 --> 00:04:48,867 wgithttps: //github.com/tlively/sdl seminar-- และนี่ก็เป็น different-- 72 00:04:48,867 --> 00:04:49,700 /archive/master.zip 73 00:04:49,700 --> 00:04:55,610 74 00:04:55,610 --> 00:04:59,220 ดังนั้นอีกครั้งที่เดียวกันแน่นอน URL, ยกเว้นว่ามันจะเป็นไปได้ 75 00:04:59,220 --> 00:05:09,010 tlively / SDL_seminar / master.zip และ คุณกำลังใช้ wgit ดาวน์โหลดที่ 76 00:05:09,010 --> 00:05:12,940 และจากนั้นคุณสามารถเพียง เปิดเครื่องรูดเก็บที่ 77 00:05:12,940 --> 00:05:14,900 แล้วคุณจะมี ทุกรหัสแหล่งที่มา 78 00:05:14,900 --> 00:05:17,580 ดังนั้นขออภัยเกี่ยวกับที่ 79 00:05:17,580 --> 00:05:23,880 และแล้วรหัสนอกจากนี้ยังจะเป็นเจ้าภาพที่ หน้าเว็บสัมมนา CS50 ในคู่ 80 00:05:23,880 --> 00:05:25,230 วัน 81 00:05:25,230 --> 00:05:26,590 >> ทั้งหมดขวา 82 00:05:26,590 --> 00:05:29,932 ดังนั้นวิธีที่เราจะเริ่มต้น การเขียนเกมของเราเอง? 83 00:05:29,932 --> 00:05:31,890 ดีสิ่งแรก เรากำลังจะต้องการที่จะทำ 84 00:05:31,890 --> 00:05:34,740 จะดูเอกสาร SDL 85 00:05:34,740 --> 00:05:37,020 ดังนั้นนี่คือที่ VM 86 00:05:37,020 --> 00:05:38,720 และนี่คือหน้าเว็บ 87 00:05:38,720 --> 00:05:40,340 ผมเคยสำรวจจะมีชีวิตอยู่ libsdl.org 88 00:05:40,340 --> 00:05:43,110 89 00:05:43,110 --> 00:05:48,140 สิ่งที่ฉันจะทำนี่คือไปกว่า แถบด้านข้างภายใต้เอกสาร 90 00:05:48,140 --> 00:05:51,040 และคลิกที่วิกิพีเดีย 91 00:05:51,040 --> 00:05:56,870 นี้จะนำฉันไปที่วิกิพีเดียที่ว่า มีมากที่สุดของเอกสารสำหรับ SDL 92 00:05:56,870 --> 00:06:01,360 กว่าในแถบด้านข้างที่นี่เรา ไปคลิก API ตามหมวดหมู่ 93 00:06:01,360 --> 00:06:04,300 เพราะเป็นไปเพื่อให้ เรามีมุมมองที่ดีเด็ดขาด 94 00:06:04,300 --> 00:06:07,770 ของทั้ง API สำหรับการ SDL 95 00:06:07,770 --> 00:06:12,390 >> ดังนั้นสำหรับตัวอย่างเช่นเรามี การเริ่มต้นขั้นพื้นฐาน 96 00:06:12,390 --> 00:06:18,380 และปิดทั้งหมดการเรียงลำดับของ สิ่งที่ใช้ในการบริหารสำหรับ SDL, 97 00:06:18,380 --> 00:06:21,630 และแล้วเราก็มีส่วนในการ แสดงสิ่งที่หน้าจอ 98 00:06:21,630 --> 00:06:23,000 นั่นเป็นวิดีโอ 99 00:06:23,000 --> 00:06:25,790 เหตุการณ์การป้อนข้อมูลที่ได้รับ การป้อนข้อมูลจากแป้นพิมพ์ 100 00:06:25,790 --> 00:06:29,710 ได้รับข้อมูลจากเมาส์และ จอยสติ๊กถ้าคุณมีมันมาก 101 00:06:29,710 --> 00:06:32,901 มีข้อเสนอแนะที่มีผลบังคับใช้สำหรับสิ่งที่ เช่นตัวควบคุมเกมซึ่ง 102 00:06:32,901 --> 00:06:34,150 เราจะไม่พูดคุยเกี่ยวกับ 103 00:06:34,150 --> 00:06:35,630 และนี่คือเสียง 104 00:06:35,630 --> 00:06:38,940 แล้วมีพวงของอื่น ๆ สิ่งที่ SDL สามารถทำเพื่อคุณ 105 00:06:38,940 --> 00:06:43,830 >> แต่วันนี้เรากำลังจะมุ่งเน้น ในการเริ่มต้นที่นี่ 106 00:06:43,830 --> 00:06:48,332 การแสดงภาพในวิดีโอ ส่วนเหตุการณ์ที่เกิดขึ้นและการจัดการการป้อนข้อมูล 107 00:06:48,332 --> 00:06:50,290 ดังนั้นเหล่านี้เป็นหลัก ในส่วนของเอกสาร 108 00:06:50,290 --> 00:06:53,050 ที่คุณควรจะกังวลเกี่ยวกับ 109 00:06:53,050 --> 00:06:57,170 เพียงเพื่อความสนุกสนานถ้าเราไปมากกว่า ที่นี่และคลิกที่ API โดยใช้ชื่อ 110 00:06:57,170 --> 00:07:04,350 เราสามารถมองเห็นรายชื่อของทุกคน สิ่งเดียวในห้องสมุด SDL 111 00:07:04,350 --> 00:07:11,330 ดังนั้นฟังก์ชั่นเหล่านี้ enumerations, โครงสร้างเป็นจำนวนเงินที่บ้าของสิ่งที่ 112 00:07:11,330 --> 00:07:12,820 เลขอนุกรม 113 00:07:12,820 --> 00:07:14,580 และเห็นได้ชัดจน คุณรู้ว่าคุณกำลังทำ 114 00:07:14,580 --> 00:07:19,100 นี้จะไม่ให้เป็นประโยชน์มากเกินไป ซึ่งเป็นเหตุผลที่เราทำ API ตามหมวดหมู่ 115 00:07:19,100 --> 00:07:20,810 >> ดังนั้นขอเริ่มต้น 116 00:07:20,810 --> 00:07:25,680 หวังว่าคุณได้อยู่แล้ว ดาวน์โหลดรหัสกระจาย 117 00:07:25,680 --> 00:07:30,070 และเพื่อให้สิ่งที่คุณสามารถทำได้คือขวา ที่นี่ในเครื่อง CS50, 118 00:07:30,070 --> 00:07:31,150 เพียงแค่เปิดสถานี 119 00:07:31,150 --> 00:07:33,750 120 00:07:33,750 --> 00:07:34,440 ไปเลย. 121 00:07:34,440 --> 00:07:40,740 ดังนั้นผมจึงได้ดาวน์โหลดแล้ว รหัสการกระจายการใช้ซิป 122 00:07:40,740 --> 00:07:41,690 วิธี. 123 00:07:41,690 --> 00:07:43,140 และฉันได้ซิปมัน 124 00:07:43,140 --> 00:07:46,120 ดังนั้นที่นี่มันมีอยู่ในการสัมมนาหลัก SDL 125 00:07:46,120 --> 00:07:49,750 ดังนั้นฉันจะไปลงในไดเรกทอรีที่ 126 00:07:49,750 --> 00:07:55,310 และสิ่งที่เราเห็นที่นี่เป็น ที่เรามีเจ็ดไฟล์ C 127 00:07:55,310 --> 00:07:58,070 และนี่เป็นไปรหัส เรากำลังจะได้รับการมองหาที่ในวันนี้ 128 00:07:58,070 --> 00:08:00,040 เรามี Makefile 129 00:08:00,040 --> 00:08:06,950 และเรามีไดเรกทอรีทรัพยากร ซึ่งก็มีภาพ 130 00:08:06,950 --> 00:08:09,070 ที่คุณจะได้เห็นเร็วพอ 131 00:08:09,070 --> 00:08:16,060 >> ดังนั้นขอเปิดไฟล์เหล่านี้ โดยใช้โปรแกรมแก้ไข G-แก้ไข 132 00:08:16,060 --> 00:08:22,000 ดังนั้นผมจึงต้องการที่จะเปิดแฟ้มทั้งหมดที่ เริ่มต้นด้วยการทักทายและจบด้วย .c 133 00:08:22,000 --> 00:08:23,380 ไปเลย. 134 00:08:23,380 --> 00:08:28,180 เพื่อให้เป็นหน้าต่างเล็ก ๆ ดังนั้นเรา จะพยายามที่จะทำให้มันมีขนาดใหญ่กว่า 135 00:08:28,180 --> 00:08:28,900 ไม่มีก็กลับออกไป 136 00:08:28,900 --> 00:08:32,836 137 00:08:32,836 --> 00:08:34,570 >> ทั้งหมดขวา 138 00:08:34,570 --> 00:08:37,959 ดังนั้นที่นี่เป็นครั้งแรก ไฟล์ที่เรากำลังจะไปดูที่ 139 00:08:37,959 --> 00:08:39,000 มันเรียกว่า hello1_sdl.c 140 00:08:39,000 --> 00:08:41,890 141 00:08:41,890 --> 00:08:47,980 และทั้งหมดนี้ก็คือเริ่มต้น SDL ห้องสมุดเพื่อให้เราสามารถเริ่มใช้มัน 142 00:08:47,980 --> 00:08:51,550 วิธีที่คุณจะได้รู้ว่าจะมา ขึ้นด้วยรหัสคุณหรือไม่ 143 00:08:51,550 --> 00:08:53,850 ดีถ้าเรามองข้าม ที่เอกสาร 144 00:08:53,850 --> 00:08:58,040 และเราไปสู่​​การเริ่มต้น และปิดส่วน 145 00:08:58,040 --> 00:09:02,230 ก็จะบอกให้เราทราบ เกี่ยวกับวิธีการเริ่มต้น SDL 146 00:09:02,230 --> 00:09:06,630 ดังนั้นแน่นอนอ่านบางเวลาอื่น ๆ 147 00:09:06,630 --> 00:09:09,230 มันจะบอกคุณทั้งหมด เกี่ยวกับสิ่งที่เกิดขึ้นที่นี่ 148 00:09:09,230 --> 00:09:14,360 แต่ปมหลักของเรื่องคือ เราจำเป็นต้องเรียก SDL ฟังก์ชันนี้ในนั้น 149 00:09:14,360 --> 00:09:18,910 และผ่านมันสิ่งที่ชนิดของสิ่งที่ เราต้องการให้ห้องสมุดในการเริ่มต้น 150 00:09:18,910 --> 00:09:23,620 ดังนั้นในกรณีที่เรากำลังจะ ในการเริ่มต้นวิดีโอสำหรับตอนนี้ 151 00:09:23,620 --> 00:09:26,690 เพื่อให้เราสามารถเริ่มต้นการแสดงภาพ 152 00:09:26,690 --> 00:09:32,370 >> มากกว่าที่นี่คุณสามารถดูว่า เราคลิกที่ SDL ในมันเรา 153 00:09:32,370 --> 00:09:36,160 จะได้รับข้อมูลมากยิ่งขึ้น รวมทั้งค่าตอบแทน 154 00:09:36,160 --> 00:09:39,050 ดังนั้นเราจึงเห็นว่า returnes ศูนย์ความสำเร็จ 155 00:09:39,050 --> 00:09:43,320 ดังนั้นในรหัสของเราที่เรากำลังจะไป ดูว่ามันจะไม่กลับมาเป็นศูนย์ 156 00:09:43,320 --> 00:09:47,020 และถ้ามันไม่ได้กลับ ศูนย์ดังนั้นมันก็ไม่ประสบความสำเร็จ 157 00:09:47,020 --> 00:09:50,650 แล้วเรากำลังจะไปเพียงแค่พิมพ์ ข้อผิดพลาดนี้โดยใช้ฟังก์ชั่นอื่น ๆ 158 00:09:50,650 --> 00:09:56,260 SDL ได้รับข้อผิดพลาดที่ส่งกลับสตริง อธิบายข้อผิดพลาดที่เกิดขึ้น 159 00:09:56,260 --> 00:09:58,510 เรากำลังจะไปพิมพ์ที่ ข้อผิดพลาดแล้วเราเพียงแค่ 160 00:09:58,510 --> 00:10:02,270 จะออกจากโปรแกรม ด้วยรหัสข้อผิดพลาด 161 00:10:02,270 --> 00:10:06,470 >> แล้วสิ่งที่เราต้องการอีก ที่จะทำคือก่อนที่จะออกจากโปรแกรม 162 00:10:06,470 --> 00:10:10,830 ถ้าเราเริ่มต้นได้ประสบความสำเร็จใน SDL, เราก็ต้องเรียกว่า SDL เลิก 163 00:10:10,830 --> 00:10:15,750 และที่จะจัดการกับการทำความสะอาด ทั้งหมดของทรัพยากรภายใน SDL สำหรับเรา 164 00:10:15,750 --> 00:10:21,240 ดังนั้นเอกสารอีกครั้ง there--, ที่นี่เราอยู่ในการเริ่มต้น 165 00:10:21,240 --> 00:10:23,640 และปิดส่วน ของเอกสาร 166 00:10:23,640 --> 00:10:26,680 คุณก็สามารถคลิกที่ ฟังก์ชั่นที่นี่ SDL เลิก 167 00:10:26,680 --> 00:10:28,700 และคุณสามารถอ่านข้อมูลเกี่ยวกับการที่ดี 168 00:10:28,700 --> 00:10:31,400 และจำนวนมากของฟังก์ชั่นเหล่านี้ หน้าเอกสาร 169 00:10:31,400 --> 00:10:35,630 มีรหัสตัวอย่างดังนั้นนี้ เป็นทรัพยากรที่ดีมาก 170 00:10:35,630 --> 00:10:39,610 แน่นอนใช้เวลาบางส่วน อ่านส่วนของวิกิพีเดียนี้ 171 00:10:39,610 --> 00:10:42,520 ถ้าคุณกำลังจะทำ นี้สำหรับโครงการ 172 00:10:42,520 --> 00:10:43,760 >> ทั้งหมดขวา 173 00:10:43,760 --> 00:10:46,590 เพื่อให้เป็นโปรแกรมทั้งหมดของเรา 174 00:10:46,590 --> 00:10:53,935 สิ่งที่เราสามารถทำได้ตอนนี้ is-- ฉัน จะเปิด Makefile ที่นี่ 175 00:10:53,935 --> 00:10:56,150 ดังนั้นฉันจะใช้เวลา ดูที่วิธีการที่ทำงาน 176 00:10:56,150 --> 00:10:59,500 และมันเป็น makefile ที่ง่ายมาก คล้ายกับสิ่งที่คุณเคยเห็นมาก่อน 177 00:10:59,500 --> 00:11:04,010 หนึ่งในความแตกต่างหลัก คือว่านี่นี้ 178 00:11:04,010 --> 00:11:07,870 เป็นไปแทรกผลมาจากการทำงาน คำสั่งนี้ที่คุณได้อยู่แล้ว 179 00:11:07,870 --> 00:11:10,850 การติดตั้งถ้าคุณได้ติดตั้ง SDL 180 00:11:10,850 --> 00:11:13,230 และนี่คือคำสั่ง ที่เกิดขึ้นในการสร้าง 181 00:11:13,230 --> 00:11:16,710 บางธงพิเศษสำหรับคอมไพเลอร์ 182 00:11:16,710 --> 00:11:22,050 >> นอกจากนั้นเราจะให้มัน ทุกคำสั่งตามปกติเช่นเดียวกับ 183 00:11:22,050 --> 00:11:23,430 ทั้งสองคำสั่ง 184 00:11:23,430 --> 00:11:30,270 ดังนั้น -lsdl2 จับภาพ การเชื่อมโยงในห้องสมุดภาพ SDL 185 00:11:30,270 --> 00:11:36,200 และ -lm จริงจัดการการเชื่อมโยง ในมาตรฐานห้องสมุดคณิตศาสตร์ C 186 00:11:36,200 --> 00:11:40,630 ดังนั้นเราจะไม่ได้ไปต้อง เหล่านั้นสำหรับทุกไฟล์ C ของเรา 187 00:11:40,630 --> 00:11:43,900 แต่เราเพียงแค่ใส่ไว้ในเพื่อที่เราจะสามารถทำได้ ใช้ Makefile เดียวกันสำหรับทุกอย่าง 188 00:11:43,900 --> 00:11:44,816 โดยไม่ต้องแก้ไข 189 00:11:44,816 --> 00:11:46,970 190 00:11:46,970 --> 00:11:50,080 >> กว่าที่นี่ในแหล่งที่มา นี่คือที่ที่คุณต้องการ 191 00:11:50,080 --> 00:11:53,680 ใส่ไฟล์ที่คุณกำลังจะ เพื่อรวบรวมสำหรับโครงการของคุณ 192 00:11:53,680 --> 00:11:57,570 แต่เนื่องจากทุกคนของฉัน C ไฟล์ที่นี่มีฟังก์ชั่นหลัก 193 00:11:57,570 --> 00:12:00,000 ก็จะได้รับสับสน ถ้าเราใส่พวกเขาทั้งหมดใน 194 00:12:00,000 --> 00:12:06,930 ดังนั้นฉันจะเพียงแค่พูดว่า สำหรับตอนนี้ hello1_sdl.c, 195 00:12:06,930 --> 00:12:11,150 ซึ่งเป็นหนึ่งในที่เราเพียงแค่มองไปที่ 196 00:12:11,150 --> 00:12:18,740 ดังนั้นถ้าผมกลับไปมากกว่า ที่นี่ผมไม่สามารถทำให้ 197 00:12:18,740 --> 00:12:22,160 และสิ่งที่มันไม่ได้เป็นเพียง ที่รวบรวมไฟล์แรก 198 00:12:22,160 --> 00:12:28,780 และจากนั้นเราสามารถพิมพ์ ./game เพราะ มันเป็นปฏิบัติการมันผลิต 199 00:12:28,780 --> 00:12:31,660 และทั้งหมดก็ไม่ได้พิมพ์ เริ่มต้นที่ประสบความสำเร็จ 200 00:12:31,660 --> 00:12:33,300 ดังนั้นเราทำสิ่งที่ถูกต้อง 201 00:12:33,300 --> 00:12:36,200 แต่นั่นก็เป็นชนิดของน่าเบื่อ เพราะเราไม่เห็นหน้าต่าง 202 00:12:36,200 --> 00:12:37,900 ไม่มีอะไรย้ายไปรอบ ๆ 203 00:12:37,900 --> 00:12:41,030 >> ดังนั้นที่ดีที่เราได้เริ่มต้น SDL 204 00:12:41,030 --> 00:12:43,520 ตอนนี้ขอย้ายไปยังบางสิ่งบางอย่าง เล็ก ๆ น้อย ๆ ที่น่าสนใจมากขึ้น 205 00:12:43,520 --> 00:12:54,700 ดังนั้นที่นี่เรามี hello2_window.c และ นี้เป็นไปได้มากขึ้นเล็กน้อย 206 00:12:54,700 --> 00:13:00,010 โปรแกรม C ที่ซับซ้อนที่ เริ่มต้น SDL เช่นเดียวกับก่อน 207 00:13:00,010 --> 00:13:04,250 ยกเว้นตอนนี้เรายังจะ ในการเริ่มต้นจับเวลา SDL 208 00:13:04,250 --> 00:13:07,720 และสิ่งนี้เป็นไปเพื่อให้เรา เข้าถึงจับเวลาภายใน 209 00:13:07,720 --> 00:13:10,550 ฟังก์ชั่นการใช้งานและที่เกี่ยวกับเวลา 210 00:13:10,550 --> 00:13:11,920 >> และจากนั้นให้ดูที่นี่ 211 00:13:11,920 --> 00:13:16,840 สิ่งที่เราทำคือเรามีตัวชี้นี้ ไปยัง struct หน้าต่าง SDL ซึ่ง 212 00:13:16,840 --> 00:13:21,160 กำลังจะถูกสร้างขึ้นโดยสายนี้ ฟังก์ชั่นที่ SDL สร้างหน้าต่าง 213 00:13:21,160 --> 00:13:25,380 ตอนนี้จะใช้เวลามากของการขัดแย้งที่ จึงขอไปดูเอกสาร 214 00:13:25,380 --> 00:13:27,930 ดังนั้นอีกครั้งฉันจะ API ตามประเภทฉัน 215 00:13:27,930 --> 00:13:33,820 จะลงไปวิดีโอที่นี่และครั้งแรก ส่วนการจัดการการแสดงหน้าต่าง 216 00:13:33,820 --> 00:13:36,470 ดังนั้นส่วนนี้มี ตันของสิ่งที่อยู่ในมัน 217 00:13:36,470 --> 00:13:39,970 แต่ถ้าคุณมองผ่าน ฟังก์ชั่นเหล่านี้คุณจะ 218 00:13:39,970 --> 00:13:43,620 เห็นว่าน่าจะเป็นที่หนึ่งที่เรา ต้องการที่จะเรียกว่า SDL สร้างหน้าต่าง 219 00:13:43,620 --> 00:13:46,600 ที่เกิดขึ้นจะเป็นสิทธิที่ด้านบน 220 00:13:46,600 --> 00:13:49,080 >> ดังนั้นนี่คือ เอกสารสำหรับฟังก์ชั่นนี้ 221 00:13:49,080 --> 00:13:53,710 หน้าต่างจะมีชื่อเรื่อง เอ็กซ์วายและตำแหน่งบนหน้าจอ 222 00:13:53,710 --> 00:13:56,960 มันจะมีความกว้างความสูงที่ และจากนั้นก็จะใช้เวลาบางธง 223 00:13:56,960 --> 00:14:01,220 ตอนนี้เราไม่ได้เป็นผู้ดูแลเกี่ยวกับ ใด ๆ ของธงเหล่านี้ได้ในขณะนี้ 224 00:14:01,220 --> 00:14:04,560 แต่ถ้าคุณอยากจะทำอะไร เช่นทำให้หน้าต่างแบบเต็มหน้าจอ 225 00:14:04,560 --> 00:14:07,920 คุณสามารถดูที่ว่า 226 00:14:07,920 --> 00:14:13,190 สำหรับตอนนี้เรากำลังจะ ที่จะใช้ค่าพิเศษเหล่านี้ 227 00:14:13,190 --> 00:14:18,775 หน้าต่าง SDL บวกศูนย์กลาง สำหรับ x และ y ในการสั่งซื้อ 228 00:14:18,775 --> 00:14:21,800 เพียงแค่สร้างหน้าต่าง ในใจกลางของหน้าจอของเรา 229 00:14:21,800 --> 00:14:24,370 >> เพื่อให้เป็นสิ่งที่ทำ 230 00:14:24,370 --> 00:14:27,960 และถ้าหน้าต่างที่จะเกิดขึ้น null หมายถึงมีข้อผิดพลาด 231 00:14:27,960 --> 00:14:32,570 แล้วอีกครั้งที่เรากำลังจะ พิมพ์ข้อผิดพลาดโดยใช้ข้อผิดพลาดได้รับ SDL 232 00:14:32,570 --> 00:14:36,570 และจากนั้นก็เพราะเราเริ่มต้นได้ SDL ตอนนี้เราจำเป็นที่จะต้องปิด 233 00:14:36,570 --> 00:14:40,900 ดังนั้นเราจึงเรียก SDL ลาออกก่อน กลับหนึ่งสำหรับหลัก 234 00:14:40,900 --> 00:14:42,905 >> ดังนั้นเราจึงมีการเปิดหน้าต่างนี้หวังว่า 235 00:14:42,905 --> 00:14:44,613 และสิ่งที่เรากำลังจะไป ทำคือการที่เรากำลังจะ 236 00:14:44,613 --> 00:14:50,340 ที่จะเรียก SDL 5,000 มิลลิวินาที ซึ่งเป็นเช่นเดียวกับห้าวินาที 237 00:14:50,340 --> 00:14:55,640 และเมื่อเรากำลังทำกับที่ มันจะทำลายหน้าต่าง 238 00:14:55,640 --> 00:14:59,470 ทำความสะอาดห้​​องสมุด SDL, และออกจากโปรแกรม 239 00:14:59,470 --> 00:15:05,240 ถ้าอย่างนั้นเราไปข้างหน้าและให้ที่ยิง 240 00:15:05,240 --> 00:15:08,660 >> ดังนั้นตอนนี้แทนการเปลี่ยนแปลง Makefile ทุกครั้ง 241 00:15:08,660 --> 00:15:12,180 ฉันก็ไม่สามารถทำและ จากนั้นในบรรทัดคำสั่ง 242 00:15:12,180 --> 00:15:16,090 บอกแหล่งที่มาเท่ากับแล้ว ไฟล์ที่เรากำลังรวบรวม 243 00:15:16,090 --> 00:15:17,090 ดังนั้นจึงเป็น hello2_window.c 244 00:15:17,090 --> 00:15:21,390 245 00:15:21,390 --> 00:15:21,890 ที่ยอดเยี่ยม 246 00:15:21,890 --> 00:15:22,970 ไม่มี erros 247 00:15:22,970 --> 00:15:26,085 ตอนนี้ถ้าเราทำงานที่ปฏิบัติการของเรา เราจะเห็นหน้าต่างนี้ 248 00:15:26,085 --> 00:15:27,960 ขณะนี้มีไม่กี่ ปัญหาเกี่ยวกับหน้าต่าง 249 00:15:27,960 --> 00:15:32,820 เราสามารถย้ายไปรอบ ๆ แต่มันก็มี ขยะพื้นหลังนี้ภายในของมัน 250 00:15:32,820 --> 00:15:34,660 ดังนั้นเราจึงยังไม่ได้วาด อะไรและดังนั้นจึงเป็นเรื่อง 251 00:15:34,660 --> 00:15:38,210 เพียงเต็มไปด้วยขยะซึ่ง สวยมากสิ่งที่เราคาดหวัง 252 00:15:38,210 --> 00:15:41,010 >> นอกจากนี้เราไม่สามารถปิดหน้าต่าง 253 00:15:41,010 --> 00:15:44,780 ฉันกดปุ่ม X ที่นี้ และมุมที่เกิดขึ้นไม่มีอะไร 254 00:15:44,780 --> 00:15:47,840 ดังนั้นเราจะเห็นว่าในการแก้ไขปัญหา ว่าในนิด ๆ หน่อย ๆ 255 00:15:47,840 --> 00:15:51,750 ดังนั้นขอแก้ไขส่วนที่ หน้าต่างที่เต็มไปด้วยขยะแรก 256 00:15:51,750 --> 00:16:00,850 ดังนั้นถ้าเราไปมากกว่าที่จะ hello3_image.c สิ่งที่ เราสามารถมองเห็นคือการที่เราได้เพิ่มไม่กี่ 257 00:16:00,850 --> 00:16:03,360 สิ่งที่เพิ่มเติมได้ที่นี่ 258 00:16:03,360 --> 00:16:08,740 เราได้เพิ่มหัวใหม่นี้ แฟ้มที่จะได้รับฟังก์ชั่นจับเวลา 259 00:16:08,740 --> 00:16:11,490 ผมคิดว่าเราไม่ว่าในที่ผ่านมา อย่างใดอย่างหนึ่งมากเกินไปและผมไม่ได้พูดถึงมัน 260 00:16:11,490 --> 00:16:13,550 แต่ตอนนี้เพราะเรา การทำงานร่วมกับภาพ 261 00:16:13,550 --> 00:16:18,720 เราต้องรวม SDL ไฟล์ส่วนหัวภาพได้เป็นอย่างดี 262 00:16:18,720 --> 00:16:22,087 ดังนั้นจึงเป็นสิ่งเดียวกับที่ ก่อนที่จะเริ่มต้น SDL นี่ 263 00:16:22,087 --> 00:16:23,420 ข้อตกลงเดียวกันกับการสร้างหน้าต่าง 264 00:16:23,420 --> 00:16:25,380 เราได้เห็นว่าก่อนหน้านี้ 265 00:16:25,380 --> 00:16:29,870 >> ตอนนี้เราต้องสร้างสิ่งที่เรียกว่า โหมดแสดงภาพซึ่งการจัดเรียงของไปพร้อม 266 00:16:29,870 --> 00:16:30,800 กับหน้าต่าง 267 00:16:30,800 --> 00:16:33,860 แต่มันก็เรียงลำดับของ วัตถุที่เป็นนามธรรม 268 00:16:33,860 --> 00:16:37,370 ในค่าใช้จ่ายในการดำเนินการทั้งหมดเหล่านี้ การวาดภาพการดำเนินงานไปที่หน้าต่าง 269 00:16:37,370 --> 00:16:41,580 และเป็นจริงสอดคล้อง โปรแกรมโหลด 270 00:16:41,580 --> 00:16:47,880 ลงในฮาร์ดแวร์กราฟิกในของคุณ คอมพิวเตอร์หรือโทรศัพท์ของคุณหรืออะไรก็ตาม 271 00:16:47,880 --> 00:16:51,005 ดังนั้นธงที่เราต้องการที่จะผ่าน it-- และคุณสามารถดูเอกสาร 272 00:16:51,005 --> 00:16:56,160 ที่จะได้รับรายละเอียด here-- จะ จะได้รับการเรนเดเร่ง SDL ซึ่ง 273 00:16:56,160 --> 00:16:58,550 หมายความว่ามันเป็นไปได้ โดยใช้ฮาร์ดแวร์กราฟิก 274 00:16:58,550 --> 00:17:01,490 และเทิดทูนไม่เพียงแค่ในซอฟแวร์ 275 00:17:01,490 --> 00:17:07,390 >> และเรากำลังจะใช้ SDL renderer PRESENTVSYNC 276 00:17:07,390 --> 00:17:12,280 VSync เป็นสิ่งที่เพียงแค่ทำให้ กราฟิกของคุณดูดีขึ้นและป้องกัน 277 00:17:12,280 --> 00:17:14,970 สิ่งที่เรียกว่าหน้าจอ ความหวาดกลัวที่ครึ่งหนึ่ง 278 00:17:14,970 --> 00:17:17,720 ของกรอบและครึ่งหนึ่งของต่อไป ได้รับการวาดกรอบในเวลาเดียวกัน 279 00:17:17,720 --> 00:17:20,056 และมันก็ดูน่ากลัว 280 00:17:20,056 --> 00:17:23,130 แต่อีกครั้งคุณสามารถไปอ่าน เกี่ยวกับการที่ตัวคุณเอง 281 00:17:23,130 --> 00:17:24,319 >> ดังนั้นเราจึงมีธงบางอย่างที่นี่ 282 00:17:24,319 --> 00:17:27,810 และเพื่อให้เราเพียงแค่จะเรียก SDL ฟังก์ชันนี้สร้าง renderer 283 00:17:27,810 --> 00:17:31,340 เรากำลังจะให้หน้าต่าง เพื่อเชื่อมโยงกับที่แสดงผล 284 00:17:31,340 --> 00:17:34,520 หนึ่งในเชิงลบหมายความว่าเราไม่สนใจสิ่งที่ ไดรเวอร์กราฟิกที่เรากำลังจะใช้ 285 00:17:34,520 --> 00:17:36,603 ดังนั้นควรที่สวยมาก มักจะเป็นหนึ่งในเชิงลบ 286 00:17:36,603 --> 00:17:39,010 จนกว่าคุณจะรู้เกี่ยวกับโปรแกรมควบคุมกราฟิก 287 00:17:39,010 --> 00:17:41,650 และจากนั้นเรากำลังจะ ที่จะผ่านมันธงของเรา 288 00:17:41,650 --> 00:17:47,240 ดังนั้นหากที่ส่งกลับโมฆะแล้วเรา จะพิมพ์ข้อผิดพลาดตามปกติ 289 00:17:47,240 --> 00:17:49,550 แต่แล้วเรายังจะ ที่จะทำลายหน้าต่าง 290 00:17:49,550 --> 00:17:54,970 ในการทำความสะอาดทรัพยากรเหล่านั้นก่อน เรียก SDL เลิกและกลับ 291 00:17:54,970 --> 00:17:58,110 >> ตอนนี้ส่วนที่น่าสนใจที่นี่ เป็นที่ที่เราโหลดภาพของเรา 292 00:17:58,110 --> 00:18:00,870 โดยใช้ฟังก์ชั่นนี้ IMG_load 293 00:18:00,870 --> 00:18:04,050 นี้เป็นฟังก์ชั่นเดียวที่เรากำลังจะไป ที่จะใช้จากห้องสมุดภาพ SDL 294 00:18:04,050 --> 00:18:05,480 มันเป็นเพียงคนเดียวที่เราต้องการ 295 00:18:05,480 --> 00:18:12,950 มันเป็นฟังก์ชั่นที่ใช้เวลาสตริง ที่เป็นเส้นทางของทรัพยากรภาพใด ๆ 296 00:18:12,950 --> 00:18:18,024 และจะสามารถ .png เป็น GIF, บิตแมปใด ๆ ของสิ่งเหล่านี้ 297 00:18:18,024 --> 00:18:19,690 และนั่นเป็นเหตุผลที่ฟังก์ชั่นนี้เป็นสิ่งที่ดีดังนั้น 298 00:18:19,690 --> 00:18:22,560 มันสามารถจัดการสวยมากรูปแบบใด ๆ 299 00:18:22,560 --> 00:18:27,240 โหลดลงในหน่วยความจำและเก็บไว้ เป็นสิ่งที่เรียกว่าผิว SDL 300 00:18:27,240 --> 00:18:34,660 >> ตอนนี้พื้นผิว SDL เป็นเพียง struct ที่แสดงถึงข้อมูลภาพในความทรงจำ 301 00:18:34,660 --> 00:18:38,054 เพื่อให้คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ ว่าในเอกสารที่สอง 302 00:18:38,054 --> 00:18:40,720 และถ้าข้อผิดพลาดนี้แล้วเรา จะทำสิ่งที่ทั้งที่ 303 00:18:40,720 --> 00:18:44,480 เราพิมพ์ข้อผิดพลาดของเราปิด ทรัพยากรและจากนั้นออกจากโปรแกรม 304 00:18:44,480 --> 00:18:48,970 ตอนนี้สิ่งที่น่าสนใจคือก่อน เราสามารถวาดภาพนี้ไปที่หน้าต่าง 305 00:18:48,970 --> 00:18:51,390 เราต้องทำให้มันเป็นจริงเนื้อ 306 00:18:51,390 --> 00:18:54,460 ตอนนี้เนื้อสอดคล้อง เพื่อโหลดข้อมูลภาพ 307 00:18:54,460 --> 00:18:57,820 ในหน่วยความจำกราฟิกของฮาร์ดแวร์ของ 308 00:18:57,820 --> 00:19:00,720 >> ดังนั้นพื้นผิวที่อยู่ในหลัก หน่วยความจำหน่วยความจำปกติ 309 00:19:00,720 --> 00:19:05,550 ที่เราได้รับการใช้ภาคการศึกษาทั้งหมด และพื้นผิวที่อยู่ในนี้แยกต่างหาก VRAM 310 00:19:05,550 --> 00:19:09,410 หน่วยความจำที่ควบคุมกราฟิกการ์ด 311 00:19:09,410 --> 00:19:13,170 ดังนั้นเราจึงเรียกใช้ฟังก์ชันนี้ SDL_CreateTextureFromSurface 312 00:19:13,170 --> 00:19:17,104 เราจะให้มันแสดงผลและพื้นผิวของเรา 313 00:19:17,104 --> 00:19:19,020 และจากนั้นเรากำลังจริง ทำกับพื้นผิว 314 00:19:19,020 --> 00:19:20,311 ดังนั้นเราก็จะเป็นอิสระ 315 00:19:20,311 --> 00:19:22,210 เราไม่จำเป็นอีกต่อไป 316 00:19:22,210 --> 00:19:26,650 และแล้วดังนั้นถ้าสายนี้ errored และกลับโมฆะ 317 00:19:26,650 --> 00:19:29,630 แล้วเรากำลังจะทำทั้ง สิ่งที่รายงานข้อผิดพลาดอีกครั้ง 318 00:19:29,630 --> 00:19:30,920 >> ทั้งหมดขวา 319 00:19:30,920 --> 00:19:34,810 ที่นี่เราจะได้เป็นบางส่วน ฟังก์ชั่นการแสดงผลที่เกิดขึ้นจริง 320 00:19:34,810 --> 00:19:37,730 ดังนั้นการเรียก SDL_RenderClear และผ่านมัน 321 00:19:37,730 --> 00:19:42,550 แสดงผลที่เกี่ยวข้องกับหน้าต่างของเรา ก็ทำให้หน้าต่างสีดำ 322 00:19:42,550 --> 00:19:47,650 ดังนั้นจึงเอาว่าขยะที่เราเห็นใน หน้าต่างของเราก่อนและทำให้มันเป็นสีดำ 323 00:19:47,650 --> 00:19:50,750 และจากนั้นเรากำลังจะ ที่จะเรียก SDL_RenderCopy, 324 00:19:50,750 --> 00:19:53,010 ให้แสดงผลของเราเนื้อของเรา 325 00:19:53,010 --> 00:19:55,800 และเราจะพูดคุยเกี่ยวกับสิ่งที่ เขตข้อมูลเหล่านี้อยู่ในบิต 326 00:19:55,800 --> 00:19:57,830 แต่ที่เป็นไปได้ นำข้อมูลพื้นผิว 327 00:19:57,830 --> 00:20:03,100 และคัดลอกลงบนของเรา หน้าต่างการวาดภาพ 328 00:20:03,100 --> 00:20:07,020 ดังนั้นหลังจากที่เราได้ทำสำเนานี้ ข้อมูลบนหน้าต่างของเรา 329 00:20:07,020 --> 00:20:11,180 เราจะต้องทำเช่นนี้ฟังก์ชั่นพิเศษ เรียกว่า SDL_RenderPresent 330 00:20:11,180 --> 00:20:15,360 >> และนี่คือที่น่าสนใจ เพราะนี้ได้รับ 331 00:20:15,360 --> 00:20:18,770 ในหัวข้อที่เรียกว่าบัฟเฟอร์คู่ 332 00:20:18,770 --> 00:20:24,380 ดังนั้นบัฟเฟอร์คู่เป็นเทคนิคที่ ทำให้กราฟิกของคุณดูดีขึ้นมาก 333 00:20:24,380 --> 00:20:28,240 อีกครั้งก็จะช่วยป้องกันการฉีกขาดที่หน้าจอ ผมได้พูดคุยเกี่ยวกับก่อนหน้านี้ที่ 334 00:20:28,240 --> 00:20:29,590 คุณมีสองบัฟเฟอร์ 335 00:20:29,590 --> 00:20:32,260 มีบัฟเฟอร์กลับมาอยู่ในเรื่อง หน่วยความจำและกันชนด้านหน้า 336 00:20:32,260 --> 00:20:36,410 บัฟเฟอร์ด้านหน้าเป็นอักษร สิ่งที่อยู่บนหน้าจอของคุณในขณะนี้ 337 00:20:36,410 --> 00:20:42,070 ดังนั้นเราจึงทำสิ่งเหล่านี้วาดรูปแบบ เช่น SDL ทำให้สำเนาหรือ SDL_RenderClear 338 00:20:42,070 --> 00:20:43,080 กับกันชนหลัง 339 00:20:43,080 --> 00:20:44,800 ดังนั้นพวกเขาจึงปรับเปลี่ยนสิ่งที่ ในบัฟเฟอร์กลับ 340 00:20:44,800 --> 00:20:48,970 ที่นี่เราอาจจะมีการวาดภาพนี้ สี่เหลี่ยมสีเขียวกับกันชนหลัง 341 00:20:48,970 --> 00:20:52,300 >> ดังนั้นแล้วเมื่อเราทำเสร็จแล้ว ทำให้การดำเนินงานของเราซึ่ง 342 00:20:52,300 --> 00:20:55,700 อาจใช้เวลานานจริงๆ เวลาสิ่งที่เรากำลังจะทำ 343 00:20:55,700 --> 00:20:57,860 มีการสลับบัฟเฟอร์ 344 00:20:57,860 --> 00:21:00,720 ดังนั้นมันอย่างแท้จริงเพียงแค่ใช้เวลา กันชนหน้าและกันชนหลัง 345 00:21:00,720 --> 00:21:02,990 สวิทช์และพวกเขาดังนั้น ที่ทันที 346 00:21:02,990 --> 00:21:06,630 ในการดำเนินการอย่างใดอย่างหนึ่งแทน อาจจะหลายร้อยหรือหลายพัน 347 00:21:06,630 --> 00:21:10,910 ทั้งหมดของการแสดงผลใหม่ของเรา วัตถุที่อยู่บนหน้าจอ 348 00:21:10,910 --> 00:21:13,160 และป้องกันไม่ให้สิ่งนี้ เช่นหน้าจอสดชื่น 349 00:21:13,160 --> 00:21:16,710 เมื่อเราได้วาดเพียงครึ่งหนึ่ง ของวัตถุของเราสำหรับกรอบ 350 00:21:16,710 --> 00:21:21,280 ดังนั้นที่ว่าทำไมเราต้องเรียก SDL_RenderPresent เช่นเดียว 351 00:21:21,280 --> 00:21:23,320 เป็น SDL_RenderCopy 352 00:21:23,320 --> 00:21:25,749 >> อีกครั้งที่เรากำลังจะ ที่จะรอห้าวินาที 353 00:21:25,749 --> 00:21:27,540 แล้วเรากำลังจะไป ทำความสะอาดทรัพยากรของเรา 354 00:21:27,540 --> 00:21:29,540 เรามีค่อนข้างน้อยมากขึ้นในเวลานี้ 355 00:21:29,540 --> 00:21:31,750 และจากนั้นเรากำลังจะ เพื่อออกจากโปรแกรม 356 00:21:31,750 --> 00:21:35,350 ดังนั้นขอให้ทำอย่างนั้น 357 00:21:35,350 --> 00:21:41,880 ฉันจะพิมพ์ให้แล้วแหล่งที่มา เท่ากับ hello-- นี้คือตอนนี้ 3image.c 358 00:21:41,880 --> 00:21:49,632 359 00:21:49,632 --> 00:21:52,240 สิทธิทั้งหมดที่รวบรวมไม่มีข้อผิดพลาด 360 00:21:52,240 --> 00:21:57,210 และคุณสามารถดูที่นี่ฉันได้ในขณะนี้ ดึงออกมาภาพของฉันสวัสดี CS50! 361 00:21:57,210 --> 00:22:00,560 ไปที่หน้าต่างของเราที่ หายไปหลังจากห้าวินาที 362 00:22:00,560 --> 00:22:02,090 >> ตอนนี้ยังมีปัญหาใช่มั้ย? 363 00:22:02,090 --> 00:22:05,750 นี้ไม่ได้เป็นแอพลิเคชันที่ดี เพราะเมื่อฉันพยายามที่จะปิดหน้าต่าง 364 00:22:05,750 --> 00:22:06,500 ไม่มีอะไรเกิดขึ้น. 365 00:22:06,500 --> 00:22:09,540 ที่ x ยังไม่ตอบสนอง 366 00:22:09,540 --> 00:22:17,420 ดังนั้นลองมาดูที่ที่ ไฟล์ต่อไป, hello4animation 367 00:22:17,420 --> 00:22:21,850 ดังนั้นนี่คือไฟล์ ที่จะแนะนำ 368 00:22:21,850 --> 00:22:25,124 การเคลื่อนย้ายและการเคลื่อนไหวไปที่ภาพของเรา 369 00:22:25,124 --> 00:22:27,040 ดังนั้นเรากำลังจะทำ สิ่งเดียวกับก่อน 370 00:22:27,040 --> 00:22:30,190 เริ่มต้น SDL สร้าง หน้าต่างสร้าง renderer ที่ 371 00:22:30,190 --> 00:22:33,030 โหลดภาพลงใน หน่วยความจำในการสร้างพื้นผิว 372 00:22:33,030 --> 00:22:35,090 เราได้เห็นทุกที่ก่อน 373 00:22:35,090 --> 00:22:36,770 ตอนนี้เป็นของใหม่ 374 00:22:36,770 --> 00:22:42,305 เรากำลังจะมีโครงสร้างที่เรียกว่า ดูแลรักษา SDL ซึ่งเป็นเพียงรูปสี่เหลี่ยมผืนผ้า 375 00:22:42,305 --> 00:22:49,950 ถ้าเราไปมากกว่าที่นี่เราสามารถ จะค้นหาสำหรับดูแลรักษา SDL, 376 00:22:49,950 --> 00:22:54,040 และคุณสามารถเห็นมันเป็น โครงสร้างที่เรียบง่ายมาก 377 00:22:54,040 --> 00:22:56,760 มันมี x, y สำหรับ ตำแหน่งและมัน 378 00:22:56,760 --> 00:23:02,080 มีความกว้างและความสูงสำหรับ ขนาดของสี่เหลี่ยม 379 00:23:02,080 --> 00:23:07,785 >> ดังนั้นสิ่งที่เรากำลังจะทำคือเรา จะกำหนดปลายทางดูแลรักษา SDL นี้ 380 00:23:07,785 --> 00:23:09,480 สำหรับปลายทาง 381 00:23:09,480 --> 00:23:14,130 และนี่เป็นสถานที่ที่ บนหน้าจอที่ 382 00:23:14,130 --> 00:23:16,005 เรากำลังจะได้รับการวาดภาพ ภาพของเราที่เหมาะสมดังนั้น 383 00:23:16,005 --> 00:23:17,880 ถ้าเรากำลังจะได้รับ ภาพเคลื่อนไหวไปรอบ ๆ 384 00:23:17,880 --> 00:23:20,300 แล้วปลายทางที่ เรากำลังจะวาดภาพ 385 00:23:20,300 --> 00:23:22,620 จะต้องมีการย้ายไปรอบ ๆ 386 00:23:22,620 --> 00:23:24,910 ดังนั้นเราจะเรียกสิ่งนี้ ฟังก์ชั่น SDL_QueryTexture 387 00:23:24,910 --> 00:23:27,550 388 00:23:27,550 --> 00:23:33,500 และแจ้งให้ทราบผมผ่านอยู่ ของ dest.w ซึ่งเป็นความกว้าง 389 00:23:33,500 --> 00:23:36,950 และ dest.h ซึ่งเป็นความสูง 390 00:23:36,950 --> 00:23:40,425 และเพื่อให้เป็นไป SDL_QueryTexture ในการจัดเก็บในเขตข้อมูลเหล่านั้นกว้าง 391 00:23:40,425 --> 00:23:41,675 และความสูงของพื้นผิวของเรา 392 00:23:41,675 --> 00:23:44,680 393 00:23:44,680 --> 00:23:47,030 >> และแล้วสิ่งที่ฉันจะ ทำคือการที่ฉันจะ 394 00:23:47,030 --> 00:23:55,580 การตั้ง dest.x จะเป็นหน้าต่าง ความกว้าง dest.w ลบซึ่งเป็น 395 00:23:55,580 --> 00:23:59,000 ความกว้างของเทพดาหารด้วย 2 396 00:23:59,000 --> 00:24:03,860 และนี้จะตั้งขึ้นเพื่อให้ ว่าภาพที่เป็นศูนย์กลางอย่างสมบูรณ์แบบ 397 00:24:03,860 --> 00:24:06,780 ในหน้าต่างของเราทุกคนใช่มั้ย? 398 00:24:06,780 --> 00:24:08,652 ดังนั้นตอนนี้ฉันมีตำแหน่ง Y 399 00:24:08,652 --> 00:24:10,360 และนี้เป็นไปได้ เป็นตัวแปรที่เป็น 400 00:24:10,360 --> 00:24:16,390 เปลี่ยนเพราะเรากำลังจะได้รับ ภาพเคลื่อนไหวในทิศทางการ y 401 00:24:16,390 --> 00:24:19,050 และตอนนี้เรามีบางสิ่งบางอย่าง เรียกว่าห่วงการเคลื่อนไหว 402 00:24:19,050 --> 00:24:21,180 >> ดังนั้นวิธีการทำงานของแอนิเมชั่ไม่? 403 00:24:21,180 --> 00:24:27,630 ดีตาของมนุษย์สามารถตรวจสอบ 12 ที่แตกต่างกัน ภาพในทุกวินาทีทั้งหมดใช่มั้ย? 404 00:24:27,630 --> 00:24:33,060 ดังนั้นถ้าคุณแฟลชการ์ด 12 ภาพที่ผม ในวินาทีที่ผมเห็นแต่ละภาพเหล่านั้น 405 00:24:33,060 --> 00:24:35,950 เป็นของตัวเองที่แตกต่างกันภาพของแต่ละบุคคล 406 00:24:35,950 --> 00:24:39,690 ตอนนี้ถ้าคุณแฟลชมากขึ้น ภาพที่ผมในครั้งที่สอง 407 00:24:39,690 --> 00:24:42,140 แล้วตาของฉันจะเริ่มต้น จะเบลอพวกเขาร่วมกัน 408 00:24:42,140 --> 00:24:46,920 และฉันอยากจะรับรู้ว่าการเคลื่อนไหว แทนหนึ่งภาพที่แตกต่างกัน 409 00:24:46,920 --> 00:24:51,930 ดังนั้นสำหรับตัวอย่างเช่นภาพยนตร์และโทรทัศน์, พวกเขาแฟลชภาพที่คุณ 24 ครั้ง 410 00:24:51,930 --> 00:24:52,570 วินาที. 411 00:24:52,570 --> 00:24:55,110 ดังนั้นที่ 24 เฟรมต่อวินาที 412 00:24:55,110 --> 00:25:00,136 หน้าจอคอมพิวเตอร์บนมืออื่น ๆ มักจะอยู่ที่ 60 เฟรมต่อวินาที 413 00:25:00,136 --> 00:25:01,260 นั่นคือความเร็วในการฟื้นฟูของพวกเขา 414 00:25:01,260 --> 00:25:04,650 นั่นเป็นวิธีที่พวกเขามักจะฟื้นฟู ภาพบนหน้าจอ 415 00:25:04,650 --> 00:25:08,960 ดังนั้นเป้าหมายของเราเป็นไปได้ 60 เฟรมต่อวินาทีสำหรับเกมของเรา 416 00:25:08,960 --> 00:25:11,770 417 00:25:11,770 --> 00:25:13,710 >> ดังนั้นเรามาดูว่าในรหัส 418 00:25:13,710 --> 00:25:19,064 ดังนั้นสำหรับแต่ละเฟรมเราเป็นครั้งแรก จะล้างหน้าต่าง 419 00:25:19,064 --> 00:25:20,230 นี่คือรูปแบบทั่วไป 420 00:25:20,230 --> 00:25:22,450 คุณมักจะล้าง หน้าต่างแต่ละเฟรมแล้ว 421 00:25:22,450 --> 00:25:25,210 ทำทุกรูปวาดของคุณ การดำเนินงานและจากนั้นในตอนท้าย 422 00:25:25,210 --> 00:25:29,610 ไม่ RenderPresent ที่จะแสดง ทุกอย่างอยู่ในกรอบ 423 00:25:29,610 --> 00:25:33,910 แล้วคุณกำลังจะไป มีการรอคอยที่สิ้นสุด 424 00:25:33,910 --> 00:25:36,340 รอจนกว่าจะถึงต่อไป กรอบควรเริ่มต้น 425 00:25:36,340 --> 00:25:38,650 >> ดังนั้นถ้าผมทำจำนวนมาก การคำนวณที่ซับซ้อนที่นี่ 426 00:25:38,650 --> 00:25:43,100 ที่ใช้เวลากว่า 16 มิลลิวินาที มันจะเป็นไปไม่ได้สำหรับฉัน 427 00:25:43,100 --> 00:25:46,890 ที่จะได้รับอัตราเฟรมที่ 60 ผมอยากเพราะแต่ละกรอบ 428 00:25:46,890 --> 00:25:48,750 ใช้เวลานานเกินไปในการคำนวณ 429 00:25:48,750 --> 00:25:52,340 นอกจากนี้เรากำลังทำจริงๆ การเรียงลำดับของจำนวนเงินที่สำคัญของการทำงาน 430 00:25:52,340 --> 00:25:54,820 ที่นี่เพราะที่นั่นเท่านั้น สิ่งหนึ่งที่เรากำลังวาดภาพ 431 00:25:54,820 --> 00:25:59,390 ดังนั้นผมจึงรอเพียง 1/60 ของ ที่สองซึ่งเป็นความยาว 432 00:25:59,390 --> 00:26:01,520 ของกรอบในระหว่างเฟรม 433 00:26:01,520 --> 00:26:05,610 ดังนั้นฉันเรียงลำดับของการแกล้งทำ การทำงานทั้งหมดของฉันต้องใช้เวลาเป็นศูนย์ 434 00:26:05,610 --> 00:26:09,050 แต่ในเกมจริง คุณจะต้องลบ 435 00:26:09,050 --> 00:26:13,760 ระยะเวลาที่จะเอาไปทำ การทำงานทั้งหมดจากส่วนที่เหลือของคุณเวลานี้ 436 00:26:13,760 --> 00:26:16,970 >> ดังนั้นต่อไปสิ่งที่ฉัน ทำจริงในวงนี้หรือไม่? 437 00:26:16,970 --> 00:26:19,070 ฉันจะล้างหน้าต่าง 438 00:26:19,070 --> 00:26:27,470 ผมตั้ง dest.y ซึ่งเป็น int ไปยัง ตำแหน่ง y ที่เกิดขึ้นจริงของฉันโยนลงไปเป็น int 439 00:26:27,470 --> 00:26:32,070 ตอนนี้ผมต้องการที่ลอยละเอียด สำหรับตำแหน่ง y ที่ของฉันในเกมของฉัน 440 00:26:32,070 --> 00:26:34,150 แต่แล้วก็จริง วาดมันลงบนหน้าจอ 441 00:26:34,150 --> 00:26:39,070 มันต้อง ints เพราะในหน่วยของ พิกเซลเพื่อให้เป็นสิ่งที่หล่อสำหรับ 442 00:26:39,070 --> 00:26:41,745 ฉันจะวาดภาพ 443 00:26:41,745 --> 00:26:45,180 ดังนั้นนี่คือสี่เหลี่ยมต้นฉบับ 444 00:26:45,180 --> 00:26:47,060 และนี่คือสี่เหลี่ยมปลายทาง 445 00:26:47,060 --> 00:26:50,310 ดังนั้นผมจึงผ่าน null สำหรับ สี่เหลี่ยมแหล่งที่มา 446 00:26:50,310 --> 00:26:53,426 จะบอกว่าผมต้องการที่จะดึงพื้นผิวทั้งหมดของฉัน 447 00:26:53,426 --> 00:26:55,300 แต่ถ้าคุณมีจำนวนมากของ พื้นผิวในเกมของคุณ 448 00:26:55,300 --> 00:26:59,120 และพวกเขากำลังทั้งหมดในแผนที่พื้นผิวขนาดใหญ่ ที่ถูกโหลดลงใน SDL เป็นเพียงหนึ่ง 449 00:26:59,120 --> 00:27:02,850 พื้นผิวที่คุณสามารถ ใช้รูปสี่เหลี่ยมผืนผ้าแหล่งที่มา 450 00:27:02,850 --> 00:27:06,750 ที่จะเลือกหนึ่งของพื้นผิวที่มีขนาดเล็ก หนึ่งในสไปรท์ขนาดเล็ก 451 00:27:06,750 --> 00:27:09,450 ออกจากที่แผนที่พื้นผิวขนาดใหญ่ 452 00:27:09,450 --> 00:27:14,740 >> ดังนั้นอีกครั้งฉันผ่านของฉันทำให้ฉัน เนื้อและตอนนี้ปลายทาง 453 00:27:14,740 --> 00:27:18,320 นี้เป็นไปได้ที่ใน หน้าต่างก็จะได้รับการวาด 454 00:27:18,320 --> 00:27:21,390 และจากนั้นก็เพราะฉันเคลื่อนไหว บางสิ่งบางอย่างที่ฉันต้องการการเคลื่อนไหว 455 00:27:21,390 --> 00:27:25,150 ฉันจะได้รับการปรับปรุง ตำแหน่งเทพดาในแต่ละเฟรม 456 00:27:25,150 --> 00:27:30,190 ดังนั้นผมจึงมีการเลื่อนนี้เรียกว่าค่าคงที่ ความเร็วในหน่วยพิกเซลต่อวินาที 457 00:27:30,190 --> 00:27:34,320 ตอนนี้ทุกครั้งที่เราทำเคลื่อนไหว กรอบเป็นเพียง 1/60 ของวินาที 458 00:27:34,320 --> 00:27:36,740 ดังนั้นฉันจะแบ่งที่ 60 459 00:27:36,740 --> 00:27:42,350 แล้วเรามาดูผม ที่ลบจากตำแหน่ง Y 460 00:27:42,350 --> 00:27:44,470 ฉันลบทำไม? 461 00:27:44,470 --> 00:27:46,169 เราจะไปที่ในครั้งที่สอง 462 00:27:46,169 --> 00:27:48,460 ดังนั้นแล้วฉันทำความสะอาดทรัพยากรของฉัน และโปรแกรมที่มากกว่า 463 00:27:48,460 --> 00:27:49,830 >> ดังนั้นขอให้ที่ 464 00:27:49,830 --> 00:27:52,450 465 00:27:52,450 --> 00:28:03,570 ดังนั้นขอให้ไปลงใน SRCS = hello4 animation.c ทั้งหมดใช่มั้ย? 466 00:28:03,570 --> 00:28:05,720 เกม. 467 00:28:05,720 --> 00:28:06,770 มีคุณไป 468 00:28:06,770 --> 00:28:12,690 ดังนั้นผมจึงมีมันเลื่อนขึ้น หน้าต่างซึ่งเป็นระเบียบสวย 469 00:28:12,690 --> 00:28:17,110 แต่ยึดมั่นในผมก็ลบ จากตำแหน่ง y ที่ทุกเวลา 470 00:28:17,110 --> 00:28:18,910 สิ่งที่เกิดขึ้นที่นั่น? 471 00:28:18,910 --> 00:28:24,010 ดีก็ปรากฎว่าใน SDL และ ในความเป็นจริงมากที่สุดในคอมพิวเตอร์กราฟิก 472 00:28:24,010 --> 00:28:28,890 แหล่งที่มาสำหรับระบบการประสานงาน เป็นที่ด้านบนซ้ายของหน้าต่าง 473 00:28:28,890 --> 00:28:34,960 >> ดังนั้นทิศทาง x บวกไป ข้ามหน้าต่างของคุณไปทางด้านขวา 474 00:28:34,960 --> 00:28:38,110 และทิศทางบวก y จริงลงไป 475 00:28:38,110 --> 00:28:40,470 ดังนั้นอีกครั้งในแหล่งกำเนิดของ ด้านบนซ้ายของหน้าต่างของคุณ 476 00:28:40,470 --> 00:28:46,190 ทิศทางบวก y ลง และบวก x คือการที่เหมาะสม 477 00:28:46,190 --> 00:28:48,770 ดังนั้นเมื่อผมลบออกจาก ตำแหน่ง Y ที่ว่า 478 00:28:48,770 --> 00:28:52,640 จะทำให้มันไปในเชิงลบ ทิศทาง Y ซึ่งจะขึ้นหน้าต่าง 479 00:28:52,640 --> 00:28:55,500 นั่นคือสิ่งที่เกิดขึ้นที่นั่น 480 00:28:55,500 --> 00:28:56,510 เย็น. 481 00:28:56,510 --> 00:28:59,240 >> ลองดูที่ไฟล์ต่อไป 482 00:28:59,240 --> 00:29:05,700 นี่คือส่วนหนึ่งของการเป็น แสดงที่ในที่สุดเราก็ 483 00:29:05,700 --> 00:29:08,920 ได้รับที่ X ที่มุมของหน้าต่าง ที่ควรจะปิดหน้าต่าง 484 00:29:08,920 --> 00:29:10,660 ไปทำงาน. 485 00:29:10,660 --> 00:29:12,800 ดังนั้นสิ่งที่เกิดขึ้น? 486 00:29:12,800 --> 00:29:17,520 เราเริ่มต้น SDL สร้างหน้าต่าง สร้าง renderer โหลดภาพ 487 00:29:17,520 --> 00:29:19,770 สร้างเนื้อ เหมือนอย่างที่เราเคยเห็นมาก่อน 488 00:29:19,770 --> 00:29:26,850 เรามีสี่เหลี่ยมปลายทางเดียวกัน เป็นก่อนที่จะสายเดียวกันในการค้นหาเนื้อ 489 00:29:26,850 --> 00:29:29,780 แต่ครั้งนี้เราแล้ว จะแบ่งความกว้าง 490 00:29:29,780 --> 00:29:33,110 และความสูงของปลายทางของเราโดยที่ 4 491 00:29:33,110 --> 00:29:36,430 นี้จะมีผลกระทบของ การปรับภาพของเราลงเมื่อ 492 00:29:36,430 --> 00:29:39,884 เราแสดงมันในหน้าต่างโดยสี่ 493 00:29:39,884 --> 00:29:40,800 เพื่อให้เป็นระเบียบสวย 494 00:29:40,800 --> 00:29:42,770 เราก็สามารถปรับขนาดเช่นเดียวกับที่ 495 00:29:42,770 --> 00:29:45,970 เรากำลังจะเริ่มต้นเทพดา ในใจกลางของหน้าจอ 496 00:29:45,970 --> 00:29:49,410 และตอนนี้เรามี x และความเร็ว Y และ ทั้งที่พวกเขากำลังจะไปเริ่มต้นที่ศูนย์ 497 00:29:49,410 --> 00:29:53,740 498 00:29:53,740 --> 00:29:55,880 >> นี้เป็นไฟล์ผิด 499 00:29:55,880 --> 00:29:56,380 ฉันขอโทษ. 500 00:29:56,380 --> 00:29:57,960 เพื่อให้เป็นความจริงทุกประการ 501 00:29:57,960 --> 00:30:00,170 ที่ยังคงทั้งหมดในแฟ้มนี้ 502 00:30:00,170 --> 00:30:03,210 เรามีแบ่ง 4 และทุกอย่าง 503 00:30:03,210 --> 00:30:07,830 ดังนั้นที่นี่เรามี x และ y ที่ตำแหน่งของเรา สำหรับศูนย์ของหน้าต่าง 504 00:30:07,830 --> 00:30:12,480 และเราให้มันความเร็วเริ่มต้น ความเร็วคงที่ 505 00:30:12,480 --> 00:30:15,180 ผมเชื่อว่าเป็น 300 พิกเซลต่อวินาที 506 00:30:15,180 --> 00:30:19,850 ขณะนี้เรามี int นี้อาจก็เช่นกัน เป็นบูลที่เรียกว่าขอปิด 507 00:30:19,850 --> 00:30:23,970 และแทนที่จะทำ วง จำกัด ในการจับเวลาที่นี่ 508 00:30:23,970 --> 00:30:29,180 เรากำลังจะได้เป็นแรงบันดาล ตราบใดที่ใกล้จะไม่ได้รับการร้องขอ 509 00:30:29,180 --> 00:30:30,960 >> ดังนั้นวิธีที่เราดำเนินการเหตุการณ์ที่เกิดขึ้น? 510 00:30:30,960 --> 00:30:35,600 ดี SDL คิวขึ้นในเหตุการณ์ที่เกิดขึ้น คิวที่แท้จริงอยู่เบื้องหลัง 511 00:30:35,600 --> 00:30:38,860 และแล้วแต่ละเฟรม เราสามารถ dequeue เหตุการณ์ 512 00:30:38,860 --> 00:30:43,900 จากคิวที่ใช้ SDL_PullEvent สายนี้ 513 00:30:43,900 --> 00:30:46,730 และอีกครั้งแน่นอนไปอ่าน เกี่ยวกับเรื่องนี้ในเอกสารประกอบ 514 00:30:46,730 --> 00:30:50,450 มีรายละเอียดมากขึ้นเป็นจำนวนมากและ ฟังก์ชั่นอื่น ๆ อีกมากมายที่คุณสามารถใช้กับเรื่องนี้ 515 00:30:50,450 --> 00:30:54,750 เราผ่านมันอยู่ ของสิ่งนี้ SDL_Event 516 00:30:54,750 --> 00:30:56,990 ที่เรามีที่นี่ในกอง 517 00:30:56,990 --> 00:30:58,840 >> ตอนนี้สิ่งที่เป็น SDL_event แล้ว? 518 00:30:58,840 --> 00:31:02,356 เพราะ SDL ถ้าเรามองใน documentation-- ปล่อยให้ของ 519 00:31:02,356 --> 00:31:07,580 เห็น API ตามหมวดหมู่การป้อนข้อมูล กิจกรรมการจัดการเหตุการณ์ 520 00:31:07,580 --> 00:31:15,150 เราสามารถมองไปที่จำนวน ของเหตุการณ์ที่แตกต่างกันที่นี่ 521 00:31:15,150 --> 00:31:18,600 และเราจะเห็นมี ตันทั้งหมดของพวกเขา 522 00:31:18,600 --> 00:31:22,150 ดังนั้นสิ่งนี้คือสิ่งที่ SDL_Event? 523 00:31:22,150 --> 00:31:28,190 524 00:31:28,190 --> 00:31:31,107 SDL_Event เป็นสหภาพ 525 00:31:31,107 --> 00:31:31,940 ว้าว, สิ่งที่ยูเนี่ยนหรือไม่? 526 00:31:31,940 --> 00:31:33,910 คุณอาจจะไม่เคยได้ ได้ยินว่าก่อนที่ 527 00:31:33,910 --> 00:31:35,610 และที่ตกลง 528 00:31:35,610 --> 00:31:39,420 >> สหภาพเป็นชนิดเช่น struct ยกเว้น struct 529 00:31:39,420 --> 00:31:41,960 มีพื้นที่ทั้งหมดของ สาขาและหน่วยความจำ 530 00:31:41,960 --> 00:31:45,060 ขณะที่สหภาพแรงงานมีเพียง พื้นที่เพียงพอที่จะพอดีกับที่ใหญ่ที่สุด 531 00:31:45,060 --> 00:31:49,660 หนึ่งในสาขาของตนซึ่งหมายความว่า สามารถเก็บหนึ่งในสาขาของตน 532 00:31:49,660 --> 00:31:52,830 ในช่วงเวลาที่ชนิดของ ทำให้รู้สึกสำหรับเหตุการณ์ที่เกิดขึ้นใช่มั้ย? 533 00:31:52,830 --> 00:31:55,810 เราสามารถมีแป้นพิมพ์ เหตุการณ์หรือเหตุการณ์หน้าต่าง 534 00:31:55,810 --> 00:31:59,750 แต่เหตุการณ์เดียวไม่สามารถเป็นทั้ง เหตุการณ์แป้นพิมพ์และเหตุการณ์หน้าต่าง 535 00:31:59,750 --> 00:32:05,450 ดังนั้นมันจะโง่ที่จะมีที่ว่างสำหรับ ทั้งของผู้ที่อยู่ภายในสหภาพเหตุการณ์ของเรา 536 00:32:05,450 --> 00:32:07,770 ดังนั้นหากคุณต้องการที่จะ สร้างสหภาพของคุณเอง 537 00:32:07,770 --> 00:32:10,020 มันก็ดูตรงเดียวกัน การสร้างโครงสร้างที่ 538 00:32:10,020 --> 00:32:14,140 ยกเว้นว่าเราจะใช้คำหลักที่สหภาพ แทนการใช้คำหลักที่ struct 539 00:32:14,140 --> 00:32:17,490 และจำไว้ว่าสำหรับทุก สิ่งที่อยู่ภายในสหภาพของคุณ 540 00:32:17,490 --> 00:32:22,020 ตัวแปรที่เกิดขึ้นจริงที่เป็นสหภาพ สามารถมีหนึ่งในค่าเหล่านั้น 541 00:32:22,020 --> 00:32:24,780 ขณะนั้น. 542 00:32:24,780 --> 00:32:29,940 >> ดังนั้นวิธีที่เราสามารถบอกชนิดของเหตุการณ์ เราก็โผล่ออกจากคิวนี้? 543 00:32:29,940 --> 00:32:33,370 ดีที่เราสามารถทดสอบ event.type 544 00:32:33,370 --> 00:32:35,792 และถ้าเกิดว่ามีค่าเท่ากับ เพื่อ SDL_Quit เรารู้ 545 00:32:35,792 --> 00:32:37,500 มันเป็นกรณีที่ ถูกสร้างขึ้นเมื่อเรา 546 00:32:37,500 --> 00:32:39,510 ตีว่า X ในมุมของหน้าต่าง 547 00:32:39,510 --> 00:32:44,270 และเราสามารถตั้งค่าการร้องขอใกล้เท่ากับ 1 548 00:32:44,270 --> 00:32:47,230 ส่วนที่เหลือเป็นเพียงการเคลื่อนไหวบางอย่าง ที่คุณเคยเห็นมาก่อน 549 00:32:47,230 --> 00:32:52,802 ถ้าอย่างนั้นเราไปข้างหน้าและทำให้ นี้และดูว่าทำงานได้ดี 550 00:32:52,802 --> 00:32:55,135 ดังนั้นฉันจะทำและพิมพ์ แล้ว SRCS = hello5_events.c 551 00:32:55,135 --> 00:33:03,760 552 00:33:03,760 --> 00:33:04,770 เราจะไปที่นั่น. 553 00:33:04,770 --> 00:33:05,780 เกม. 554 00:33:05,780 --> 00:33:08,920 >> ตอนนี้เราจะเห็นว่ามันเป็น ปรับลดลงแน่นอนโดยสี่ 555 00:33:08,920 --> 00:33:10,360 และตอนนี้ก็กำยำรอบ ๆ 556 00:33:10,360 --> 00:33:14,630 ฉันต้องตรวจสอบการชนบาง ที่เกิดขึ้นกับด้านข้างของหน้าต่าง 557 00:33:14,630 --> 00:33:16,840 ที่เราสามารถจะดูที่ 558 00:33:16,840 --> 00:33:21,190 และสิ่งที่เกิดขึ้นเมื่อฉันไปปิดหรือไม่ 559 00:33:21,190 --> 00:33:22,120 ปิด 560 00:33:22,120 --> 00:33:22,740 ที่ยอดเยี่ยม 561 00:33:22,740 --> 00:33:24,290 เราได้รับกรณีที่ 562 00:33:24,290 --> 00:33:26,630 และเราจัดการมัน 563 00:33:26,630 --> 00:33:30,730 >> ดังนั้นลองมองกลับไปที่รหัส 564 00:33:30,730 --> 00:33:33,020 ดังนั้นวิธีการที่ฉันได้รับมัน กำยำรอบเช่นนั้น? 565 00:33:33,020 --> 00:33:37,200 จำได้ว่าผมตั้งค่าทั้ง x และ ปีแรกที่ความเร็ว 566 00:33:37,200 --> 00:33:39,260 และความเร็วเป็นบวก อย่างต่อเนื่องเพื่อให้เป็น 567 00:33:39,260 --> 00:33:42,680 จะได้รับมันเริ่มออก และจะลงไปทางด้านขวา 568 00:33:42,680 --> 00:33:45,680 569 00:33:45,680 --> 00:33:50,310 >> ตอนนี้แต่ละเฟรมที่นอกเหนือไปจากการจัดการ เหตุการณ์ใด ๆ ที่อาจเกิดขึ้น 570 00:33:50,310 --> 00:33:57,520 ฉันจะตรวจสอบว่าผีของฉัน พยายามที่จะออกไปจากหน้าต่าง 571 00:33:57,520 --> 00:34:03,610 ดังนั้นเราจึงสามารถทำได้โดยเพียงแค่การตรวจสอบ x_pos 0, y_pos 0 แล้ว 572 00:34:03,610 --> 00:34:07,370 ยัง x_pos และ y_pos กับ ความกว้างและความสูงหน้าต่างหน้าต่าง 573 00:34:07,370 --> 00:34:11,010 ขอให้สังเกตที่ผมเคยหัก ความกว้างของผีสาง 574 00:34:11,010 --> 00:34:14,090 และนี่คือเพราะถ้าฉันไม่ได้ ลบความกว้างของสไปรต์, 575 00:34:14,090 --> 00:34:17,760 มันจะตรวจสอบว่า ต้นกำเนิดของสไปรต์ 576 00:34:17,760 --> 00:34:19,690 ไม่ได้ไปนอกหน้าต่าง 577 00:34:19,690 --> 00:34:21,480 แต่เราต้องการทั้งหมด ความกว้างของผีสาง 578 00:34:21,480 --> 00:34:24,030 ที่มักจะต้องอยู่ภายในหน้าต่างและ ทั้งความสูงของสไปรต์ 579 00:34:24,030 --> 00:34:25,321 เสมอภายในหน้าต่าง 580 00:34:25,321 --> 00:34:27,429 ดังนั้นสิ่งที่เป็นลบสำหรับ 581 00:34:27,429 --> 00:34:30,080 จำนวนมากของรูปทรงเรขาคณิตที่นี่สามารถ จะเป็นประโยชน์ที่จะดึงมันออกมา 582 00:34:30,080 --> 00:34:33,929 บนกระดาษที่มีการประสานงาน ระบบที่จะเห็นสิ่งที่เกิดขึ้น 583 00:34:33,929 --> 00:34:38,090 >> ดังนั้นถ้าฉันไม่ชนกันผมก็ เพียงแค่ตั้งค่าตำแหน่ง 584 00:34:38,090 --> 00:34:41,400 เพื่อที่จะไม่ได้ไป ออกจากหน้าจอ 585 00:34:41,400 --> 00:34:47,179 และฉันจะไปถ้ามันตีกลับ ที่หนึ่งของผนังที่ 586 00:34:47,179 --> 00:34:51,469 ฉันจะคัดค้าน x ความเร็วเพื่อที่จะ 587 00:34:51,469 --> 00:34:53,210 เริ่มตีกลับในทิศทางอื่น ๆ 588 00:34:53,210 --> 00:34:56,210 และในทำนองเดียวกันถ้ามันฮิต ด้านบนหรือด้านล่าง 589 00:34:56,210 --> 00:34:59,820 ฉันจะตั้งค่าความเร็วการ y เท่ากับความเร็ว y ที่เชิงลบ 590 00:34:59,820 --> 00:35:01,690 เพื่อที่จะกลับมา 591 00:35:01,690 --> 00:35:03,860 ดังนั้นนี่เป็นเพียงวิธีการที่เรามีที่นี่ 592 00:35:03,860 --> 00:35:07,560 >> และตำแหน่งการปรับปรุง เช่นเดียวกับที่เราเคยเห็นมาก่อน 593 00:35:07,560 --> 00:35:12,510 หารด้วย 60 เพราะเรา จัดการเพียง 1/60 ของวินาที 594 00:35:12,510 --> 00:35:15,750 และแล้วการแสดงผล เหมือนกับก่อน 595 00:35:15,750 --> 00:35:19,810 และเพื่อให้ทุกอย่าง ที่เกิดขึ้นในไฟล์นี้ 596 00:35:19,810 --> 00:35:22,490 เพื่อให้เป็นวิธีที่เราทำเหตุการณ์ 597 00:35:22,490 --> 00:35:29,260 สิ่งสำคัญที่ต้องนำมาใช้ที่นี่ เป็นหน้าที่ SDL_PullEvent นี้ 598 00:35:29,260 --> 00:35:33,020 และแน่นอนคุณควรอ่าน เอกสารเพิ่มเติมเกี่ยวกับ SDL_Event 599 00:35:33,020 --> 00:35:38,630 สหภาพเพราะชนิดของข้อมูลนี้ สำคัญมากเพราะเราใช้มัน 600 00:35:38,630 --> 00:35:40,690 สำหรับทุกประเภทของกิจกรรม 601 00:35:40,690 --> 00:35:46,539 >> ตัวอย่างเช่นเราใช้มันสำหรับแป้นพิมพ์ เหตุการณ์ที่เกิดขึ้นซึ่งเป็นสิ่งที่ไฟล์นี้เหมาะสำหรับ 602 00:35:46,539 --> 00:35:47,330 ดังนั้นเราจึงทำในสิ่งที่มี? 603 00:35:47,330 --> 00:35:50,180 เรามีสิ่งที่เหมือนกันเป็นมาก่อน เริ่มต้น SDL สร้างหน้าต่าง 604 00:35:50,180 --> 00:35:55,260 สร้าง renderer โหลดภาพ ในหน่วยความจำสร้างเนื้อ 605 00:35:55,260 --> 00:36:00,530 อีกครั้งที่เรากำลังจะไป มีรูปสี่เหลี่ยมผืนผ้าปลายทางนี้ 606 00:36:00,530 --> 00:36:04,890 เรากำลังจะปรับขนาดภาพ โดยสี่ทำให้มันเป็นบิตขนาดเล็ก 607 00:36:04,890 --> 00:36:08,000 ตอนนี้เรากำลังจะเริ่มต้น เทพดาในใจกลางของหน้าจอ 608 00:36:08,000 --> 00:36:12,090 แต่ครั้งนี้เราจะตั้งค่า x ความเร็วเริ่มต้นและ y ที่เป็นศูนย์ 609 00:36:12,090 --> 00:36:15,140 เพราะแป้นพิมพ์เป็น จะควบคุมเหล่านั้น 610 00:36:15,140 --> 00:36:18,900 และนอกจากนี้เรากำลังจะไป ติดตามตัวแปรเหล่านี้ 611 00:36:18,900 --> 00:36:20,450 ขึ้นลงซ้ายและขวา 612 00:36:20,450 --> 00:36:23,090 และที่จะเก็บ ติดตามเราได้ไม่ว่าจะเป็น 613 00:36:23,090 --> 00:36:27,370 กดปุ่มแป้นพิมพ์ที่ สอดคล้องกับการขึ้นลงซ้าย 614 00:36:27,370 --> 00:36:28,460 และขวา 615 00:36:28,460 --> 00:36:32,440 >> ตอนนี้เป็นชนิดของแฟนซี เพราะเราสามารถใช้ W, A, S, 616 00:36:32,440 --> 00:36:35,480 D ที่นี่หรือปุ่มลูกศรที่เกิดขึ้นจริง 617 00:36:35,480 --> 00:36:38,590 เราจะเห็นว่าในเวลาเพียงสอง 618 00:36:38,590 --> 00:36:41,140 ดังนั้นเรากำลังจะดำเนินการ เหตุการณ์เช่นเดียวกับก่อนที่จะ 619 00:36:41,140 --> 00:36:42,530 เราดึงเหตุการณ์ 620 00:36:42,530 --> 00:36:45,840 แต่ตอนนี้เรากำลังจะไป สลับกับประเภทการแข่งขัน 621 00:36:45,840 --> 00:36:47,710 ถ้ามัน SDL_Quit เรา จะตั้งอยู่ใกล้ 622 00:36:47,710 --> 00:36:49,990 ขอให้หนึ่งเช่นเดียวกับก่อนที่จะ 623 00:36:49,990 --> 00:36:52,315 ที่จัดการ x ใน มุมของหน้าต่าง 624 00:36:52,315 --> 00:36:55,050 เพื่อให้หน้าต่างของเราจริงปิด 625 00:36:55,050 --> 00:37:00,110 >> มิฉะนั้นถ้าเราได้รับคีย์ SDL ลง เหตุการณ์ซึ่งหมายความว่าเรากดคีย์ 626 00:37:00,110 --> 00:37:04,470 แล้วสิ่งที่เรากำลังจะทำคือเรา จะเปิดสิ่งนี้ที่นี่ 627 00:37:04,470 --> 00:37:11,370 ซึ่ง means-- เพื่อ event.key หมายถึงการรักษาสหภาพเหตุการณ์ของเรา 628 00:37:11,370 --> 00:37:15,490 ไปและได้รับที่สำคัญ โครงสร้างเหตุการณ์ในนั้น 629 00:37:15,490 --> 00:37:18,810 ดังนั้นมันจะเปิดออกที่นี้ ยูเนี่ยนเป็นโครงสร้างเหตุการณ์ที่สำคัญ 630 00:37:18,810 --> 00:37:22,820 แล้วไปที่สำคัญ โครงสร้างของเหตุการณ์สาขาของตน 631 00:37:22,820 --> 00:37:26,140 เรียกว่า keysym แล้ว scancode 632 00:37:26,140 --> 00:37:29,480 และอีกครั้งอ่านแน่นอน เอกสารเกี่ยวกับเรื่องนี้ 633 00:37:29,480 --> 00:37:31,220 คำที่ใช้ปัจจัยการผลิตที่ค่อนข้างน่าสนใจ 634 00:37:31,220 --> 00:37:34,020 คุณจะได้รับการสแกนรหัสหรือรหัสที่สำคัญ 635 00:37:34,020 --> 00:37:38,590 และมันก็เป็นเพียงเล็กน้อยบอบบาง แต่ เอกสารค่อนข้างดี 636 00:37:38,590 --> 00:37:43,380 >> ดังนั้นถ้าเราเห็นโค้ดสแกน กดปุ่มของเราเป็น W หรือขึ้น 637 00:37:43,380 --> 00:37:45,450 เรากำลังจะตั้งค่าเท่ากับ 1 638 00:37:45,450 --> 00:37:47,240 และจากนั้นเราแยกออกจากสวิทช์ที่ 639 00:37:47,240 --> 00:37:52,980 ถ้ามันเป็น A หรือซ้ายเราตั้งทิ้งไว้ 1, et ฯลฯ และอื่น ๆ สำหรับการลงและขวา 640 00:37:52,980 --> 00:37:57,080 ตอนนี้ออกมาในครั้งนี้สวิทช์ด้านนอก ถ้าเราดูที่สำคัญถึงเหตุการณ์ 641 00:37:57,080 --> 00:38:00,730 นั่นหมายความว่าเราได้เปิดตัวที่สำคัญ และเราไม่ได้กด 642 00:38:00,730 --> 00:38:05,380 ดังนั้นฉันจะพูดขึ้นเท่ากับ 0, ซ้ายเท่ากับ 0 ลงเท่ากับ 0 ขวา 643 00:38:05,380 --> 00:38:08,260 เท่ากับ 0, และอื่น ๆ 644 00:38:08,260 --> 00:38:12,070 >> และแจ้งให้ทราบที่เรามีในแต่ละเหล่านี้ สองกรณีนำสิทธิติดกัน 645 00:38:12,070 --> 00:38:14,490 ไม่มีรหัสแยกต่างหาก สำหรับกรณีแรกที่ 646 00:38:14,490 --> 00:38:18,180 หมายความว่าไม่ว่าจะเป็น เอหรือลงที่นี่ 647 00:38:18,180 --> 00:38:20,520 มันจะรันโค้ดนี้ 648 00:38:20,520 --> 00:38:22,090 เพื่อให้เป็นประโยชน์สวย 649 00:38:22,090 --> 00:38:24,830 จะป้องกันไม่ให้เราต้องทำมากขึ้น เงื่อนไขและไอเอฟเอและกิจกรรม 650 00:38:24,830 --> 00:38:26,980 เช่นนั้น. 651 00:38:26,980 --> 00:38:29,420 >> ดังนั้นเรากำลังจะไป กำหนดความเร็ว 652 00:38:29,420 --> 00:38:31,020 เราตั้งค่าความเร็วเป็น 0 653 00:38:31,020 --> 00:38:33,910 แล้วถ้าขึ้นกด และไม่ได้ลงแล้วเรา 654 00:38:33,910 --> 00:38:37,450 ตั้งค่าความเร็ว y ที่ความเร็วเชิงลบ 655 00:38:37,450 --> 00:38:42,930 โปรดจำไว้ว่าในเชิงลบเนื่องจาก ทิศทาง y ที่เชิงลบขึ้น 656 00:38:42,930 --> 00:38:45,540 และทิศทางบวก y จะลดลง 657 00:38:45,540 --> 00:38:47,510 หากมีการกดลง และไม่ขึ้นแล้วเรา 658 00:38:47,510 --> 00:38:53,860 จะตั้งค่าให้ความเร็วในเชิงบวก ซึ่งหมายถึงการไปลงหน้าจอ 659 00:38:53,860 --> 00:38:55,460 สิ่งเดียวกันกับด้านซ้ายและขวา 660 00:38:55,460 --> 00:38:58,200 >> และจากนั้นเรากำลังจะปรับปรุง ตำแหน่งเช่นเดียวกับก่อนที่จะ 661 00:38:58,200 --> 00:39:00,740 เรากำลังจะทำการปะทะกัน การตรวจสอบที่มีขอบเขต 662 00:39:00,740 --> 00:39:04,290 แต่เราไม่ได้ไปตั้งค่า ความเร็วความเร็วเพราะเป็นเพียง 663 00:39:04,290 --> 00:39:06,780 ควบคุมโดยแป้นพิมพ์ 664 00:39:06,780 --> 00:39:11,230 แต่เราจะไปตั้งค่า ตำแหน่งที่จะเก็บมันไว้ในหน้าต่าง 665 00:39:11,230 --> 00:39:14,400 และเรากำลังจะตั้งค่า ในตำแหน่งที่ struct 666 00:39:14,400 --> 00:39:17,400 แล้วทำทุก การแสดงผลจากสิ่งที่มาก่อน 667 00:39:17,400 --> 00:39:20,750 ดังนั้นเรามาดูสิ่งที่มันไม่ 668 00:39:20,750 --> 00:39:25,460 เพื่อให้ SRCS-- เรามาดู นี้ hello6_keyboard.c 669 00:39:25,460 --> 00:39:38,140 670 00:39:38,140 --> 00:39:38,820 >> ไม่นะ. 671 00:39:38,820 --> 00:39:40,150 ดังนั้นเราจึงมีคำเตือนบางอย่างที่นี่ 672 00:39:40,150 --> 00:39:43,840 และที่บอกว่าเราก็ไม่ได้ ตรวจสอบชนิดที่เป็นไปได้ทุกเดียว 673 00:39:43,840 --> 00:39:45,610 ของเหตุการณ์ 674 00:39:45,610 --> 00:39:49,470 ที่ตกลงเพราะ มี 2​​36 ของพวกเขาหรือเพื่อให้ 675 00:39:49,470 --> 00:39:51,760 ดังนั้นผมจะไม่สนใจคำเตือนเหล่านั้น 676 00:39:51,760 --> 00:39:53,530 ก็ยังคงรวบรวมดี 677 00:39:53,530 --> 00:39:56,100 ดังนั้นฉันจะไปเล่นเกม 678 00:39:56,100 --> 00:39:57,590 มันไม่ได้ย้าย 679 00:39:57,590 --> 00:40:04,150 แต่ตอนนี้เมื่อฉันบดบนแป้นพิมพ์ของฉัน ฉันสามารถทำอะไรบางอย่างเคลื่อนไหว WASD ที่นี่ 680 00:40:04,150 --> 00:40:06,870 ผมใช้ปุ่มลูกศรของฉันเช่นกัน 681 00:40:06,870 --> 00:40:10,070 และแจ้งให้ทราบถึงแม้ว่าฉัน กดที่เหมาะสมในขณะนี้ 682 00:40:10,070 --> 00:40:13,804 มันจะไม่ออกมาจากหน้าต่าง เพราะผมตั้งค่าได้ในทุกกรอบ 683 00:40:13,804 --> 00:40:14,720 เพื่อให้เป็นระเบียบสวย 684 00:40:14,720 --> 00:40:19,420 คุณสามารถคิดย้ายไปรอบ ๆ มาริโอกับ บางปุ่มลูกศรหรือสิ่งที่ต้องการที่ 685 00:40:19,420 --> 00:40:22,880 และใช่เอ็กซ์ทำงาน 686 00:40:22,880 --> 00:40:26,900 >> ไฟล์สุดท้ายดังนั้นเรากำลังจะ ที่จะมอง hellow7_mouse 687 00:40:26,900 --> 00:40:29,600 นี้เป็นเรื่องเกี่ยวกับการป้อนข้อมูลของเมาส์ 688 00:40:29,600 --> 00:40:34,790 ดังนั้นในหนึ่งนี้เรา นำเข้าหัวคณิตศาสตร์ 689 00:40:34,790 --> 00:40:38,100 เพราะเรากำลังจะมี นิด ๆ หน่อย ๆ ของคณิตศาสตร์ที่นี่ 690 00:40:38,100 --> 00:40:45,260 เดิมสิ่งเดิมปลายทาง เดิมเห็นว่าก่อนที่จะ 691 00:40:45,260 --> 00:40:46,910 อย่างนี้เป็นที่น่าสนใจ 692 00:40:46,910 --> 00:40:51,730 ดังนั้นเราจะกลับไปตรวจสอบเท่านั้น สำหรับ SDL เลิกเหตุการณ์ 693 00:40:51,730 --> 00:40:52,460 ว่าเป็นเพราะเหตุใด 694 00:40:52,460 --> 00:40:55,110 เพื่อให้คุณสามารถได้รับการป้อนข้อมูลของเมาส์จากเหตุการณ์ที่เกิดขึ้น 695 00:40:55,110 --> 00:40:57,670 เช่นเดียวกับเมื่อเมาส์ย้าย คุณจะได้รับเหตุการณ์ว่า 696 00:40:57,670 --> 00:41:00,520 เมื่อกดปุ่มเมาส์กด คุณจะได้รับเหตุการณ์ว่า 697 00:41:00,520 --> 00:41:05,760 >> แต่มีผู้อื่นง่ายขึ้นเล็กน้อย บางที API สำหรับการป้อนข้อมูลของเมาส์ 698 00:41:05,760 --> 00:41:09,500 และนั่นก็เป็นเพียงแค่ได้รับรัฐเมาส์ SDL 699 00:41:09,500 --> 00:41:14,370 ดังนั้นผมจึงมี int สำหรับ x และ y ที่ตำแหน่งเคอร์เซอร์ 700 00:41:14,370 --> 00:41:18,910 ผมผ่านไป SDL_GetMouseState, ซึ่งชุดเหล่านี้ 701 00:41:18,910 --> 00:41:22,200 และนี่คือตำแหน่งใน ระบบพิกัดของหน้าต่าง 702 00:41:22,200 --> 00:41:25,520 ดังนั้นถ้ามวลเป็นในด้านบนซ้าย ของหน้าต่างที่จะ 0, 0 703 00:41:25,520 --> 00:41:28,040 704 00:41:28,040 --> 00:41:33,380 >> ตอนนี้สิ่งที่ผมจะทำคือการที่ฉันจะ ที่จะทำนิด ๆ หน่อย ๆ ของคณิตศาสตร์เวกเตอร์ 705 00:41:33,380 --> 00:41:36,910 ฉันเดิมพันที่คุณคิดว่าคุณจะไม่ เห็นว่าใน CS50 แต่ที่นี่มันเป็น 706 00:41:36,910 --> 00:41:40,720 ฉันจะทำอะไรบางอย่างเวกเตอร์ คณิตศาสตร์ที่จะได้รับเวกเตอร์ 707 00:41:40,720 --> 00:41:43,840 จากภาพที่เคอร์เซอร์ 708 00:41:43,840 --> 00:41:53,280 ดังนั้นทำไมฉันมี ลบที่นี่? 709 00:41:53,280 --> 00:42:01,350 ดีถ้าฉันเพียงแค่ใช้ปลายทางเพื่อ .-- ฉันจำเป็นต้องแปลเมาส์เอ็กซ์ 710 00:42:01,350 --> 00:42:05,166 และ Y โดยครึ่งหนึ่งความกว้างและ ความสูงของภาพที่ 711 00:42:05,166 --> 00:42:08,040 เพราะผมต้องการที่ศูนย์ของ ภาพที่จะมุ่งหน้าไปยังเมาส์ 712 00:42:08,040 --> 00:42:10,160 ไม่ได้ที่มาของภาพ 713 00:42:10,160 --> 00:42:15,650 >> เพื่อให้เป็นเพียงเพื่อให้แน่ใจว่าผมกำลังพูดถึง เกี่ยวกับศูนย์ของภาพที่นี่ 714 00:42:15,650 --> 00:42:19,510 จากนั้นเราได้รับเดลต้า x และ y ซึ่ง คือความแตกต่างจากเป้าหมาย 715 00:42:19,510 --> 00:42:23,430 ไปยังตำแหน่งที่แท้จริงของภาพ 716 00:42:23,430 --> 00:42:25,690 และจากนั้นเราจะได้รับ ระยะทางที่นี่ซึ่ง 717 00:42:25,690 --> 00:42:29,140 เป็นไปได้ที่พีทาโกรัส ทฤษฎีบท, รากที่สองของ x 718 00:42:29,140 --> 00:42:32,720 ครั้ง x บวกครั้งวายวาย 719 00:42:32,720 --> 00:42:38,400 >> ตอนนี้เพื่อป้องกันไม่ให้กระวนกระวายใจและฉันสามารถแสดง คุณว่านี้ไม่ถ้าฉันไม่ทำเช่นนี้ 720 00:42:38,400 --> 00:42:45,830 ถ้าระยะห่างระหว่างเคอร์เซอร์และ ศูนย์ภาพน้อยกว่าห้า 721 00:42:45,830 --> 00:42:48,730 ฉันแค่ไม่ได้ไปเพื่อเลื่อนภาพ 722 00:42:48,730 --> 00:42:52,900 มิฉะนั้นเราจะกำหนดความเร็ว 723 00:42:52,900 --> 00:42:55,960 และเราตั้งไว้เพื่อให้ ความเร็วจะเป็นค่าคงที่ 724 00:42:55,960 --> 00:42:58,770 และผลกำไรของทุก คณิตศาสตร์นี้คือภาพ 725 00:42:58,770 --> 00:43:01,660 จะไปย้ายไปทางเคอร์เซอร์ 726 00:43:01,660 --> 00:43:08,470 >> ตอนนี้ก็ปรากฎว่า SDL_GetMouseState, 727 00:43:08,470 --> 00:43:14,490 นอกเหนือไปจากการตั้งค่า และข้อโต้แย้ง x y ที่นี่ 728 00:43:14,490 --> 00:43:21,340 มันก็จะส่งกลับ int ที่สอดคล้อง สถานะของปุ่มเมาส์ 729 00:43:21,340 --> 00:43:24,600 ดังนั้นเราจึงไม่สามารถอ่านว่า โดยตรง แต่ที่เราสามารถทำได้ 730 00:43:24,600 --> 00:43:29,090 ใช้แมโครเหล่านี้เป็นหนึ่งเดียว ผู้ประกอบการค่าที่เหมาะสมไม่ว่าน่ากลัว 731 00:43:29,090 --> 00:43:30,650 เพียงค่าที่เหมาะสมและ 732 00:43:30,650 --> 00:43:38,320 ดังนั้นเราจึงบอกว่าปุ่มซึ่งเป็นผลที่ได้ SDL_GetMouseState ของเราว่า 733 00:43:38,320 --> 00:43:43,990 และค่าที่เหมาะสมและแมโครนี้ นี่ SDL_BUTTON_LEFT 734 00:43:43,990 --> 00:43:47,680 >> ดังนั้นนี้เป็นไปได้เพียงแค่แก้ไข เพื่อบิตแมปที่สอดคล้อง 735 00:43:47,680 --> 00:43:51,090 ปุ่มซ้ายของเมาส์ถูกกด 736 00:43:51,090 --> 00:43:55,470 และดังนั้นหากค่าที่เหมาะสม และเกิดขึ้นและมัน 737 00:43:55,470 --> 00:43:59,340 ไม่เป็นศูนย์ซึ่งหมายความว่า ปุ่มซ้ายถูกกด 738 00:43:59,340 --> 00:44:04,320 แล้วเราจริงจะปฏิเสธ ทั้ง x และ y ที่ความเร็วที่ 739 00:44:04,320 --> 00:44:06,700 ซึ่งก็จะทำให้ภาพหนี 740 00:44:06,700 --> 00:44:07,980 ตำแหน่งที่ปรับปรุง 741 00:44:07,980 --> 00:44:10,920 การตรวจจับการชนเห็นมัน ทั้งหมดก่อนที่จะกระทำขวาทั้งหมด 742 00:44:10,920 --> 00:44:11,510 ขอให้มัน 743 00:44:11,510 --> 00:44:14,200 744 00:44:14,200 --> 00:44:16,050 เพื่อให้คุณได้ทำให้ SRCS = hello7_mouse.c 745 00:44:16,050 --> 00:44:21,720 746 00:44:21,720 --> 00:44:22,220 ที่ดี 747 00:44:22,220 --> 00:44:23,490 ไม่มีข้อผิดพลาด 748 00:44:23,490 --> 00:44:24,900 และเกม 749 00:44:24,900 --> 00:44:26,440 >> ดังนั้นที่นี่ฉันมีเมาส์ของฉัน 750 00:44:26,440 --> 00:44:29,000 และภาพที่เป็นจริง ไล่เมาส์ของฉัน 751 00:44:29,000 --> 00:44:33,140 ตอนนี้ในเกมที่คุณทำอาจจะ นี้เป็นเหมือนไล่ศัตรู 752 00:44:33,140 --> 00:44:35,240 ตัวอักษรเล็ก ๆ น้อย ๆ ของคุณหรืออะไรก็ตาม 753 00:44:35,240 --> 00:44:37,440 แต่ที่นี่เรามี ภาพไล่เมาส์ 754 00:44:37,440 --> 00:44:41,000 และเมื่อฉันคลิกเมาส์ เริ่มไล่ภาพ 755 00:44:41,000 --> 00:44:42,860 และภาพที่เป็น วิ่งหนีจากเมาส์ 756 00:44:42,860 --> 00:44:43,810 เพื่อให้เป็นเย็นสวย 757 00:44:43,810 --> 00:44:47,770 และแจ้งให้ทราบอีกครั้งมี ยังคงตรวจสอบการชนที่นี่ 758 00:44:47,770 --> 00:44:53,930 >> เพื่อให้เป็นเล็ก ๆ น้อย ๆ เป็นครั้งสุดท้าย สาธิตฉันได้ตั้งค่าที่นี่ 759 00:44:53,930 --> 00:44:58,870 และให้ดูที่สิ่งหนึ่งที่เพิ่มเติม 760 00:44:58,870 --> 00:45:02,970 ดังนั้นกลับมาที่นี่ผมกล่าวถึงนี้กระวนกระวายใจ 761 00:45:02,970 --> 00:45:05,000 ทั้งหมดขวา 762 00:45:05,000 --> 00:45:12,890 ดังนั้นหากระยะทางน้อยกว่าห้าพิกเซล ผมได้รับการตั้งค่า x และ y ที่ความเร็วเป็นศูนย์ 763 00:45:12,890 --> 00:45:15,960 จะเกิดอะไรขึ้นถ้าเรากำจัดที่? 764 00:45:15,960 --> 00:45:19,070 ดังนั้นฉันจะทำเช่นนี้เพียง 765 00:45:19,070 --> 00:45:23,820 766 00:45:23,820 --> 00:45:30,150 โปรดแก้ตัวรูปแบบนี้น่ากลัว แต่เราออกความเห็นรหัสที่ถูกต้อง 767 00:45:30,150 --> 00:45:38,080 ดังนั้นฉันจะบันทึกและทำ คำสั่งเดียวกันจากก่อนที่จะให้มัน 768 00:45:38,080 --> 00:45:38,785 >> ทั้งหมดขวา 769 00:45:38,785 --> 00:45:39,660 และตอนนี้สิ่งที่เกิดขึ้น? 770 00:45:39,660 --> 00:45:43,260 771 00:45:43,260 --> 00:45:43,760 ดี. 772 00:45:43,760 --> 00:45:45,801 เรายังคงดังต่อไปนี้ เมาส์เช่นเดียวกับก่อน 773 00:45:45,801 --> 00:45:49,310 แต่เมื่อเราได้รับเมาส์ เราได้มีกระวนกระวายใจขั้นต้นนี้ 774 00:45:49,310 --> 00:45:50,320 สิ่งที่เกิดขึ้นที่นั่น? 775 00:45:50,320 --> 00:45:52,600 ทั้งในเวกเตอร์ของเรา คณิตศาสตร์จำได้ว่าเราเป็น 776 00:45:52,600 --> 00:45:57,540 ระยะห่างระหว่างการที่ เคอร์เซอร์และศูนย์ของภาพ? 777 00:45:57,540 --> 00:46:00,710 ดีที่ว่าวิธีการ 0 เราเริ่มได้รับ 778 00:46:00,710 --> 00:46:06,280 เช่นการจัดเรียงของพฤติกรรมบ้านี้ ที่ภาพจะเป็นประเภทของ 779 00:46:06,280 --> 00:46:08,910 เช่นสั่นรอบเคอร์เซอร์ 780 00:46:08,910 --> 00:46:12,000 และที่สร้างความกระวนกระวายใจนี้ 781 00:46:12,000 --> 00:46:13,020 และที่น่าเกลียดจริงๆ 782 00:46:13,020 --> 00:46:15,103 และคุณอาจไม่ ต้องการเกมของคุณทำแบบนั้น 783 00:46:15,103 --> 00:46:17,350 เว้นแต่จะเรียงลำดับของผลพิเศษบางอย่าง 784 00:46:17,350 --> 00:46:21,960 >> นั่นคือเหตุผลที่เรามี เพียงแค่นี้โดยพลการ 785 00:46:21,960 --> 00:46:27,150 ตัดห้าพิกเซลที่เราพูด ถ้าเป็นภายในห้าพิกเซลเรากำลังดี 786 00:46:27,150 --> 00:46:29,560 เราไม่จำเป็นต้องเลื่อนภาพอีกต่อไป 787 00:46:29,560 --> 00:46:32,260 นั่นคือสิ่งที่เกิดขึ้นที่นั่น 788 00:46:32,260 --> 00:46:37,390 789 00:46:37,390 --> 00:46:40,870 >> เพื่อที่ว่ามันสวยมาก 790 00:46:40,870 --> 00:46:44,390 ตอนนี้คุณรู้วิธีการสร้าง หน้าต่างโหลดภาพ 791 00:46:44,390 --> 00:46:49,330 วาดภาพไปที่หน้าต่างที่ได้รับ ใส่แป้นพิมพ์ได้รับการป้อนข้อมูลของเมาส์, 792 00:46:49,330 --> 00:46:52,190 มีพวงของอื่น ๆ การป้อนข้อมูลที่คุณจะไม่ 793 00:46:52,190 --> 00:46:56,070 รู้วิธีการที่จะได้รับถ้าคุณเพียงแค่ใช้จ่าย ไม่กี่นาทีมองไปที่เอกสาร 794 00:46:56,070 --> 00:46:59,670 ดังนั้นคุณจะมีค่อนข้าง เครื่องมือไม่กี่ที่จำหน่ายของคุณในขณะนี้ 795 00:46:59,670 --> 00:47:01,650 ที่จะเขียนเป็นเกมที่เต็มเปี่ยม 796 00:47:01,650 --> 00:47:05,030 >> ตอนนี้เกมทุกความต้องการเสียงบาง แต่เอกสารเสียง 797 00:47:05,030 --> 00:47:06,460 นอกจากนี้ยังเป็นที่ดีงาม 798 00:47:06,460 --> 00:47:09,200 และฉันยินดีที่จะเดิมพันว่าถ้า คุณเข้าใจทุกสิ่งที่ 799 00:47:09,200 --> 00:47:14,560 เราได้พูดคุยเกี่ยวกับในวันนี้ด้วย ภาพและพื้นผิว 800 00:47:14,560 --> 00:47:18,370 หน้าต่างและทุกอย่างแล้ว หา API เสียงไม่ได้ 801 00:47:18,370 --> 00:47:21,170 จะเป็นไปได้ว่าไม่ดี 802 00:47:21,170 --> 00:47:27,420 ดังนั้นผมจึงหวังเป็นอย่างยิ่งว่าจะได้เห็น สิ่งที่คุณสร้างขึ้นด้วย SDL 803 00:47:27,420 --> 00:47:31,595