面向?qū)ο髣赢嬙O(shè)計(jì)_第1頁
面向?qū)ο髣赢嬙O(shè)計(jì)_第2頁
面向?qū)ο髣赢嬙O(shè)計(jì)_第3頁
面向?qū)ο髣赢嬙O(shè)計(jì)_第4頁
面向?qū)ο髣赢嬙O(shè)計(jì)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、面向?qū)ο蟮膭赢嬙O(shè)計(jì)1基礎(chǔ)練習(xí):得到位置得到目標(biāo)位置ship1.GetValue(Canvas.Le)ship1.GetValue(Canvas.TopProperty)得到的是目標(biāo)左上角距離左邊和定邊的距離2基礎(chǔ)練習(xí):設(shè)置位置 ship1.SetValue(Canvas.Le, shipLocation.X);ship1.SetValue(Canvas.TopProperty, shipLocation.Y);把目標(biāo)左上角設(shè)置到指定位置3幀呈現(xiàn)事件 private void myRender(object sender, EventArgs e)CompositionTarget.Render

2、ing += myRender;一個動畫有很多幀組成,在每幀中都可以執(zhí)行判斷或操作4 第一行是關(guān)鍵,告訴Silverlight應(yīng)用程序可以使用GPU硬件加速。注意了,這里僅僅是說可以使用。第二行是啟用GPU硬件加速緩存驗(yàn)證,即將使用了硬件加速及沒使用硬件加速的對象用顏色區(qū)分顯示。第三行限制Silverlight應(yīng)用程序的最大刷新頻率,這里我設(shè)置為40代表每秒畫面刷新次數(shù)最大為40;然而這并不是必然的,Silverlight會根據(jù)實(shí)際情況當(dāng)CPU本身負(fù)荷不大而需要同時呈現(xiàn)的對象變化頻繁時它會在一定時間內(nèi)將刷新率超過最大值約50%不過以提升畫面的流暢性,這方面我們無法控制。第四行啟動畫面幀率統(tǒng)計(jì)。

3、5對象動態(tài)創(chuàng)建Ellipse ellipse = new Ellipse(); ellipse.Width = 150; ellipse.Height = 150; ellipse.Fill = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0);canvas_parent.Children.Add(ellipse);6練習(xí)動態(tài)產(chǎn)生一個矩形,填充紅色點(diǎn)擊按鈕,把它由屏幕左上角向右下角移動如果距離左邊大于300,則填充藍(lán)色一顆子彈向上飛一顆子彈從指定的位置向上飛一顆子彈從飛船所在的位置向上飛7 public gameTest() Initiali

4、zeComponent(); rec = new Rectangle(); rec.Height = 50; rec.Width = 100; rec.Fill = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0); cnv.Children.Add(rec); Rectangle rec; Point reclocation = new Point(0,0); private void button1_Click(object sender, RoutedEventArgs e) CompositionTarget.Rendering +=

5、 myRender; textBox1.Text = reclocation.X.ToString(); private void myRender(object sender, EventArgs e) reclocation.X += 1; reclocation.Y += 1; rec.SetValue(Canvas.Le, reclocation.X); rec.SetValue(Canvas.TopProperty, reclocation.Y); textBox1.Text = reclocation.X.ToString(); if(double)rec.GetValue(Can

6、vas.Le)=300) rec.Fill = new SolidColorBrush(Color.FromArgb(255, 0, 0, 255); 8新建項(xiàng)目MyGame新建文件夾UserControls把矢量圖轉(zhuǎn)換成的xaml文件拷貝入文件夾UserControls把xaml文件修改正確的namespace,再包含到項(xiàng)目中(這兩步不能反了,因?yàn)橹灰巾?xiàng)目中就會生成cs文件)如下格式9在頁面放入飛船和按鈕 10定義公用變量 private Point shipLocation = new Point(0, 0); private Point shipSpeed = new Point(

7、4,4);表示飛船的位置和速度因?yàn)樗俣扔衳和y坐標(biāo)的速度,所以使用點(diǎn)對象表示比較方便,其含義并不是一個點(diǎn)。位置坐標(biāo)是左上角的點(diǎn)位置11添加一個鍵盤控制事件 private void myKeyDown(object sender, KeyEventArgs e) switch (e.Key) case Key.Left: break; case Key.Right: break; case Key.Up: break; case Key.Down: break; case Key.Space: break; default: break; 12完善代碼 switch (e.Key) case

8、Key.Left: shipLocation.X -= shipSpeed.X;/減小距離左邊界的距離 break; case Key.Right: shipLocation.X += shipSpeed.X;/ break; case Key.Up: shipLocation.Y -= shipSpeed.Y;/ break; case Key.Down: shipLocation.Y += shipSpeed.Y;/增大距離上邊界距離 break; case Key.Space: break; default: break; 13在按鈕單擊代碼 button1.Visibility = V

9、isibility.Collapsed;/隱藏按鈕 shipLocation = new Point(double)ship1.GetValue(Canvas.Le), (double)ship1.GetValue(Canvas.TopProperty);/初始化飛船當(dāng)前位置this.KeyDown += new KeyEventHandler(myKeyDown);/注冊鍵盤按下事件14在鍵盤事件最后設(shè)置飛船位置 ship1.SetValue(Canvas.Le, shipLocation.X); ship1.SetValue(Canvas.TopProperty, shipLocation

10、.Y);每按下方向鍵,就會執(zhí)行位置設(shè)置操作15程序測試,通過按鍵控制飛船方向 private Point shipLocation = new Point(0, 0); private Point shipSpeed = new Point(4,4); private void myKeyDown(object sender, KeyEventArgs e) switch (e.Key) case Key.Left: shipLocation.X -= shipSpeed.X; break; case Key.Right: shipLocation.X += shipSpeed.X; brea

11、k; case Key.Up: shipLocation.Y -= shipSpeed.Y; break; case Key.Down: shipLocation.Y += shipSpeed.Y; break; case Key.Space: default: break; private void button1_Click(object sender, RoutedEventArgs e) button1.Visibility = Visibility.Collapsed; shipLocation = new Point(double)ship1.GetValue(Canvas.Le)

12、, (double)ship1.GetValue(Canvas.TopProperty); this.KeyDown += new KeyEventHandler(myKeyDown); 16產(chǎn)生一個向上飛的子彈引用using LuoYongGame.UserControls;定義公用變量 Bullet bullet; private Point bulletLocation = new Point(300, 500); private Point bulletSpeed = new Point(0, 20); private DateTime lastTick;這里子彈要動態(tài)產(chǎn)生,要被多個事

13、件使用17在按下空白鍵事件中加代碼 case Key.Space: bullet = new Bullet(); cnv.Children.Add(bullet); bullet.SetValue(Canvas.Le, bulletLocation.X); bullet.SetValue(Canvas.TopProperty, bulletLocation.Y); break;把子彈擺到一固定位置,以后會修改18寫幀呈現(xiàn)事件 private void myRender(object sender, EventArgs e) TimeSpan ts = DateTime.Now - lastTi

14、ck; bulletLocation.Y -= bulletSpeed.Y * ts.TotalSeconds; bullet.SetValue(Canvas.Le, bulletLocation.X); bullet.SetValue(Canvas.TopProperty, bulletLocation.Y); lastTick = DateTime.Now; 19在按鈕單擊事件中添加 lastTick = DateTime.Now; CompositionTarget.Rendering += myRender;得到運(yùn)行開始時間注冊幀呈現(xiàn)事件20 Canvas x:Name=ALIEN_0

15、1_01 Width=195 Height=129 Canvas.Left=21修改MainPage.xaml 注意要編譯,注意工具欄,xmlns:my=“clr-namespace:MyGame.UserControls”可以從工具欄拖出控件了。22界面23類中的變量 /暫存綠色外星人在畫布中的位置 private Point greenAlien1Location = new Point(0, 0); /暫存綠色外星人在X軸上的移動速度 private Point greenAlien1Speed = new Point(250, 0); /定義動畫在畫布中的左邊界 private Poi

16、nt upperLeftCorner = new Point(0, 0); /定義動畫在畫布中的右邊界 private Point bottomRightCorner = new Point(0, 0); /暫存外星人的行高 private double rowHeight = 60; /暫存完成呈現(xiàn)幀的時間 private DateTime lastTick;24 private void RenderFrame(object sender, EventArgs e) /計(jì)算當(dāng)前時間與上次完成幀事件的時間差 TimeSpan ElapsedTime = (DateTime.Now - las

17、tTick); /根據(jù)時間差和定義的外星人在X軸上的移動速度更新外星人在X軸上的坐標(biāo) greenAlien1Location.X += greenAlien1Speed.X * (double)ElapsedTime.TotalSeconds; /根據(jù)時間差和定義的外星人在Y軸上的移動速度更新外星人在Y軸上的坐標(biāo) greenAlien1Location.Y += greenAlien1Speed.Y * (double)ElapsedTime.TotalSeconds; /如果外星人移動到了畫布的右邊界 if (greenAlien1Location.X bottomRightCorner.X

18、) /達(dá)到畫布的右邊邊界了,轉(zhuǎn)換方向(原本是從左到右,此時外星人轉(zhuǎn)變?yōu)閺挠业阶笠苿樱?greenAlien1Speed.X *= -1; /設(shè)置外星人當(dāng)前的X軸坐標(biāo) greenAlien1Location.X = bottomRightCorner.X; /更改外星人的Y軸坐標(biāo),使其下移一行 greenAlien1Location.Y += rowHeight; else if (greenAlien1Location.X upperLeftCorner.X)/如果外星人移動到了畫布的左邊界 /到達(dá)畫布的右邊界,需改變外星人的移動方向(原本從右到左,此時外星人轉(zhuǎn)變?yōu)閺淖蟮接遥?greenAli

19、en1Speed.X *= -1; /設(shè)置外星人當(dāng)前的X軸坐標(biāo) greenAlien1Location.X = upperLeftCorner.X; /更改外星人的Y軸坐標(biāo),使其下移一行 greenAlien1Location.Y += rowHeight; /用新的坐標(biāo)改變外星人在畫布中的位置 ucGreenAlien1.SetValue(Canvas.Le, greenAlien1Location.X); ucGreenAlien1.SetValue(Canvas.TopProperty, greenAlien1Location.Y); /幀呈現(xiàn)事件完成,保存當(dāng)前時間 lastTick =

20、 DateTime.Now; 25 private void btnStartGame_Click(object sender, RoutedEventArgs e) /隱藏開始按鈕 btnStartGame.Visibility = Visibility.Collapsed; /保存綠色外星人的當(dāng)前位置(頂點(diǎn)的X坐標(biāo)及頂點(diǎn)的Y坐標(biāo)) greenAlien1Location = new Point(double)ucGreenAlien1.GetValue(Canvas.Le), (double)ucGreenAlien1.GetValue(Canvas.TopProperty); /定義動畫的左邊界 upperLeftCorner = new Point(greenAlien1Location.X, greenAlien1Location.Y); /定義動畫的右邊界(動畫的右邊界畫布的實(shí)際大小與外星人寬度的差) bottomRightCorner = new Point(LayoutRoot.ActualWidth - ucGreenAlien1.ActualWidth, LayoutRoot.ActualHeight - ucGreenAlien1.ActualHeight); /存儲動畫的開始時間 lastTick = D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論