1 00:00:00,000 --> 00:00:00,260 2 00:00:00,260 --> 00:00:03,010 >> DAVID馬蘭:讓我們寫一個程序 涉及一個窗口和一個圓 3 00:00:03,010 --> 00:00:05,820 圓來回彈跳 關閉左和右 4 00:00:05,820 --> 00:00:07,120 該窗口的邊緣。 5 00:00:07,120 --> 00:00:09,960 要做到這一點,讓我們用斯坦福大學 可移植庫,讓我們先 6 00:00:09,960 --> 00:00:14,830 包括gevents.h這樣我們就可以 偵聽鼠標移動。 7 00:00:14,830 --> 00:00:20,970 然後,讓我們的include gobjects.h使 我們可以聲明類的東西橢圓形或 8 00:00:20,970 --> 00:00:22,110 圈子,真的。 9 00:00:22,110 --> 00:00:26,090 然後,讓我們有gwindow.h使 我們有一個圖形窗口 10 00:00:26,090 --> 00:00:27,020 一切。 11 00:00:27,020 --> 00:00:30,390 >> 讓我們宣布主按照通常的方式。 12 00:00:30,390 --> 00:00:35,095 而且我們現在聲明並實例 或者創建窗口,GWindow - 13 00:00:35,095 --> 00:00:37,090 我們會打電話給變量窗口 - 14 00:00:37,090 --> 00:00:39,790 得到newGWindow。 15 00:00:39,790 --> 00:00:44,450 我們會隨便讓 320像素×240像素。 16 00:00:44,450 --> 00:00:46,190 >> 讓我們接下來實例化一個圓圈。 17 00:00:46,190 --> 00:00:48,740 但要實例化這個圈子裡, 我們需要做更多的工作。 18 00:00:48,740 --> 00:00:51,340 尤其是,讓我們填寫這個圈子 這樣,整個的是 19 00:00:51,340 --> 00:00:53,910 黑色,而不僅僅是 其輪廓。 20 00:00:53,910 --> 00:00:54,850 GOval - 21 00:00:54,850 --> 00:00:56,450 我們會打電話給它圈 - 22 00:00:56,450 --> 00:00:58,310 得到newGOval。 23 00:00:58,310 --> 00:01:04,810 我們會把這個橢圓形的0,110,我們將 通過使橢圓20個像素寬 24 00:01:04,810 --> 00:01:09,070 20個像素高 - 換句話說,一個 直徑為20或10的半徑。 25 00:01:09,070 --> 00:01:14,120 >> 現在,讓我們設置圓的顏色 要報價,引文結束,“黑”。讓我們 26 00:01:14,120 --> 00:01:19,030 現在設置它填補 通過指定正確的。 27 00:01:19,030 --> 00:01:24,100 現在最後,讓我們的圈子加入 窗口如下,據此, 28 00:01:24,100 --> 00:01:26,390 後者加入到前者。 29 00:01:26,390 --> 00:01:27,910 >> 現在讓我們來聲明一個雙。 30 00:01:27,910 --> 00:01:29,200 我們會打電話給它的速度。 31 00:01:29,200 --> 00:01:32,380 而有些武斷,讓我們說, 這個圈子的速度將 32 00:01:32,380 --> 00:01:36,290 2.0,換言之,2個像素 對於每一個時間單位。 33 00:01:36,290 --> 00:01:39,380 現在讓我們來故意 導致一個無限循環。 34 00:01:39,380 --> 00:01:42,060 >> 那麼如何讓這個圈子 來回反彈? 35 00:01:42,060 --> 00:01:45,190 那麼讓我們假設這個循環內 對於每一個時間單位,我們是 36 00:01:45,190 --> 00:01:48,890 要移動的圓圈只是一點點 根據2個像素的速度位 37 00:01:48,890 --> 00:01:50,070 每單位時間。 38 00:01:50,070 --> 00:01:52,900 但不斷,我們將不得不 檢查圓接觸 39 00:01:52,900 --> 00:01:56,480 在屏幕或左的右邊緣 屏幕邊緣的,因為如果是這樣,我們 40 00:01:56,480 --> 00:01:58,530 需要反彈,可以這麼說。 41 00:01:58,530 --> 00:02:00,380 >> 如何實現 彈跳的概念? 42 00:02:00,380 --> 00:02:04,400 那麼,如果我們要在2個像素 每單位時間的權利,彈離 43 00:02:04,400 --> 00:02:08,259 右邊緣,我們可以簡單地逆轉 這是每單位負2個像素 44 00:02:08,259 --> 00:02:10,400 的時間,從而否定 速度。 45 00:02:10,400 --> 00:02:13,160 所以,事實上,彈跳比較 簡單。 46 00:02:13,160 --> 00:02:19,260 >> 讓我們首先移動的圓圈這麼多 沿x軸的像素,通過該 47 00:02:19,260 --> 00:02:21,040 許多像素沿y軸。 48 00:02:21,040 --> 00:02:23,600 換句話說,我們不希望它 沿y軸方向移動的。 49 00:02:23,600 --> 00:02:25,950 我們只希望它反彈 前後左右。 50 00:02:25,950 --> 00:02:31,910 >> 而且我們現在這個循環中檢查是否 x坐標的圓的加 51 00:02:31,910 --> 00:02:36,515 圓的寬度大 大於或等於 52 00:02:36,515 --> 00:02:38,520 窗口寬度 - 53 00:02:38,520 --> 00:02:42,180 換句話說,如果圓的位置 加圓圈的寬度 54 00:02:42,180 --> 00:02:44,840 本身現在是過去的邊緣 窗外,我們最好 55 00:02:44,840 --> 00:02:46,090 更好地扭轉我們的速度 - 56 00:02:46,090 --> 00:02:49,080 57 00:02:49,080 --> 00:02:53,680 速度得到負的速度,從而 翻轉了積極的 58 00:02:53,680 --> 00:02:56,090 負或負到正。 59 00:02:56,090 --> 00:02:59,740 但是,如果圓移動 從右到左的,因此它打 60 00:02:59,740 --> 00:03:00,670 左邊緣? 61 00:03:00,670 --> 00:03:06,490 換句話說,如果x坐標的 圈子現在是小於或等於 62 00:03:06,490 --> 00:03:12,530 為0,讓我們繼續前進,再次 顛倒我們的速度。 63 00:03:12,530 --> 00:03:14,980 >> 那麼為什麼我在沒有添加 寬圓的這 64 00:03:14,980 --> 00:03:16,410 時間,因為我以前那樣? 65 00:03:16,410 --> 00:03:19,050 那麼,請記住,坐標 一個對象的定義 66 00:03:19,050 --> 00:03:22,200 通過其頂部的左上角, 未通過其中央。 67 00:03:22,200 --> 00:03:25,810 因此,當該圓從移動 從左到右,我們需要檢查 68 00:03:25,810 --> 00:03:28,910 是否的右邊緣 圈已通過 69 00:03:28,910 --> 00:03:30,200 窗口的右邊緣。 70 00:03:30,200 --> 00:03:34,100 因此,要搞清楚那是什麼,我們有 得到的圓的x坐標 71 00:03:34,100 --> 00:03:38,080 加圓圈的寬度移動 我們從頂部左側 72 00:03:38,080 --> 00:03:40,650 角落,有效,對 右上方角落。 73 00:03:40,650 --> 00:03:43,700 當圓從右邊移動到 左側,同時,我們不需要 74 00:03:43,700 --> 00:03:47,550 懶得這樣此外,由於 圓的左上角是 75 00:03:47,550 --> 00:03:50,700 已經是價值,我們將 從可得x搞定。 76 00:03:50,700 --> 00:03:54,140 >> 現在讓我們轉移球。 77 00:03:54,140 --> 00:04:00,900 現在,讓我們保存,編譯並運行此 程序,使反彈,。/反彈。 78 00:04:00,900 --> 00:04:02,230 我們在那裡有一個程序。 79 00:04:02,230 --> 00:04:05,760 >> 但圓正這麼混賬快, 這幾乎是不可能的,看看有什麼 80 00:04:05,760 --> 00:04:07,060 其實已在進行之中。 81 00:04:07,060 --> 00:04:10,620 因此,讓我們頗為方案強行通過 點擊X在右上角 82 00:04:10,620 --> 00:04:11,720 角落在這裡。 83 00:04:11,720 --> 00:04:15,300 現在讓我們返回到源代碼 慢下來的東西一點點。 84 00:04:15,300 --> 00:04:19,240 >> 換句話說,在這個無限 循環,而不是僅僅與移動和 85 00:04:19,240 --> 00:04:22,850 移動和再次,廣告nauseum,讓我們流連忘返 只需幾毫秒 86 00:04:22,850 --> 00:04:24,910 出發前再次移動。 87 00:04:24,910 --> 00:04:28,480 尤其是,讓我們去底部 這裡簡直是無限循環的 88 00:04:28,480 --> 00:04:32,820 停下來,例如10毫秒 在每次迭代。 89 00:04:32,820 --> 00:04:36,690 現在,讓我們重新編譯並重新運行反彈。 90 00:04:36,690 --> 00:04:40,190 現在我們看到一個更合理 實現,在這裡我們可以看到 91 00:04:40,190 --> 00:04:43,310 圈真正反彈的 左和右邊緣。 92 00:04:43,310 --> 00:04:45,395