零基礎學編程Rust-實戰篇-編寫乒乓球小遊戲2

乒乓球小遊戲2-繪製球拍
上一期咱們成功運行了一個Piston示例,打開了一個窗口並在窗口上畫了個紅色的方框,爲何畫的是一個紅色的方框呢?咱們能不能畫個綠色的長方形呢?
game pingpang
接下來咱們就研究下代碼:
打開main.rs文件
main.rs
在文件的第一行使用的extern關鍵子,聲明須要使用外部crate piston_window;咱們先前介紹過crate是rust組織代碼共享代碼的一種形式,相似Java中的jar包。extern關鍵字咱們先前也有提到,說它在2018版本中幾乎能夠不用了。咱們能夠把這一行代碼註釋掉,再運行看下效果。
沒有報錯吧,這主要得益於最新的rust 2018版本中對use關鍵字的功能加強。咱們看第二行代碼就是使用use關鍵字把piston_window引入到當前做用域中。rust會先在本項目也就是咱們的game_pingpang中查找piston_window若是找不到就會在Cargo.toml中配置的依賴中查找。這就不須要extern再提早聲明須要第三方依賴了,這也是爲何咱們須要在Cargo.toml文件中添加piston_window依賴的緣由。
接下來是聲明瞭一個main函數,建立了個PistonWindow類型的可變變量window.怎麼建立的呢?是使用類型WindowSettings建立的,從類型名稱就能夠看出這個類型是用來設置窗口配置信息的。關聯方法new的第一個參數Hello Piston是設置窗口的title。也就是顯示在窗口頭部的信息。咱們把它改爲Game Pingpang。第二個參數是一個數組用來設置窗口的大小,640表示窗口的寬度爲640像素,480表示窗口的高度爲480像素。接下來調用exit_on_esc方法設置按esc鍵時是否退出。咱們待會能夠試下按esc鍵,看程序是否退出。而後調用build方法建立一個窗口。窗口有可能建立失敗,因此build方法的返回值爲option類型,咱們還須要調用unwrap方法獲取窗口對象。
上一期咱們介紹過若是要實現一個動畫,須要不斷的從新繪製圖像。在piston中當繪製圖像或者從新繪製圖像時會激發render和update事件也就是渲染和更新事件。咱們就可使用while循環不段的獲取window的事件,並在事件發生後調用window的draw 2d方法在窗口中繪製二維圖像。這裏是先調用clear函數將窗口整個清空。接下來調用rectangle函數繪製方框。rectange有四個參數,咱們這裏先介紹前倆個。第一個參數是一個有四個值的數組,分別表示RGBA顏色值中的紅色、綠色、藍色和透明度值,這裏紅色值爲1.0也就是100%紅色,聽說多看綠色對眼睛好一些,咱們能夠把綠色值設爲1.0把紅色值和藍色值設爲0.0,這樣就把顏色改成了綠色。
第二個參數也是一個有四個值的數組,其中前倆個值表明繪製的方框在窗口的位置,這裏的0.0和0.0也就表明方框的左上角在窗口座標系的0.0,0.0的位置也就是窗口的左上角。後面的倆個值分別表明方框的寬度和高度,這裏的寬度和高度都是100,因此這是一個邊長爲100像素的正方形,咱們須要一個長方形作球拍,能夠把高度改成20像素。這樣咱們就繪製了一個寬爲100像素高爲20像素的綠色長方形球拍。咱們運行看下效果,沒有報錯,球拍已經繪製出來了,窗口的的title已經改爲了Game pingpang,按ESC建,能夠退出當前程序。雖然如今代碼能夠正常執行,可是代碼都寫在main方法中,違反了單一職責原則也不方便維護吧,接下來咱們給main方法瘦下身,咱們新建個繪製方法,把繪製方框的功能放到這個函數中,繪製時須要用到context和graphics,咱們的繪製方法須要包含這倆個參數,在閉包中聲明參數是不須要聲明參數類型的,但在函數中是須要聲明參數類型的,怎麼知道context,graphics的類型呢?固然咱們能夠經過查看api文檔得知,這裏跟你們介紹個小技巧,能夠經過聲明倆個變量ctx和gph並聲明它們的類型爲空也就是一個空的圓括號,並給它們分別賦值爲context和graphics。編寫好後,運行下代碼,這樣編譯器的提示信息就告訴了咱們context和graphics的類型。
咱們能夠看到context的類型是piston_window模塊下的Context類型,而graphics的類型是back_end模塊下的GfxGraphics類型,從模塊名稱看,GfxGraphics是個具體的實現類,應該還有上層抽象類型,咱們能夠先嚐試使用Graphics試下,修改gph的類型爲Graphics引用類型。ctx爲Context類型。再運行看下效果。從錯誤信息裏能夠看出的確是存在Graphics的,可是它是個特徵,咱們先前使用特徵聲明類型時是否是添加過impl關鍵字,咱們在Graphics前添加impl關鍵字再試下。錯誤信息提示咱們impl後跟特徵這種寫法只能用在函數聲明或者方法的返回值類型聲明中,咱們也恰好要把graphics作爲函數draw的參數,給draw函數添加倆個參數,ctx和gph。而後把繪製相關的代碼都複製到draw函數中,在main方法中只須要調用draw函數進行繪製,這下main方法就清爽多了吧。
咱們運行看下有沒有報錯,此次沒有報錯了。
接下來咱們還能夠把繪製球拍相關的代碼抽取出來,球拍有位置大小等信息,因此咱們能夠定義一個球拍類型,封裝球拍具有的相關信息,這樣若是咱們須要修改球拍的樣式只須要修改球拍類型就好。接下來咱們打開src/lib.rs文件,在lib.rs文件中聲明tianlangstudio模塊,在tianlangstuido模塊中定義struct類型Racket也就是球拍,球拍有位置座標信息x,y,有大小信息寬度和高度。爲了方便實例化Racket對象咱們再給Racket添加一個new關聯方法,當調用new關聯方法時建立一個座標在窗口底部水平居中的球拍,咱們知道窗口的寬度是640,球拍的寬度是100,因此球拍x座標的值應該爲270。窗口的高度是480,球拍的高度是20,因此球拍的y座標值應該爲460,這樣球拍恰好貼緊窗口底部。設置球拍的寬度爲100像素,高度爲20像素。接下來再給Racket類型添加一個draw方法,將繪製球拍的功能放到球拍的繪製方法中。咱們須要在外部使用Racket類型和相關方法,因此要給他們添加pub關鍵字。在main.rs文件中,咱們就能夠引入tianlangstuido模塊,使用Racket的關聯函數new建立一個球拍,並調用球拍對象的draw方法繪製球拍。這樣函數draw是否是就清爽多了。可讀性也好多了。接下來咱們運行看下效果。運行效果跟咱們預期一直,球拍緊貼窗口底部並水平居中。如今球拍仍是靜態的,接下來咱們實現經過按左右方向鍵移動球拍的功能。api

相關文章
相關標籤/搜索