加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WPF游戏开发——小鸡快跑

发布时间:2020-12-15 04:46:07 所属栏目:百科 来源:网络整理
导读:鉴于上一篇文章代码过多,被版主从首页删除了,本文只提取部分代码展示。 同上一篇文章一样,游戏还是小鸡快跑,不同的是,这次的小鸡不在是跳大坑,而是躲子弹了。 关于做游戏,还是那两样要点,对象和屏幕。不过,由于WPF不同Winform,它没有paint方法,所

鉴于上一篇文章代码过多,被版主从首页删除了,本文只提取部分代码展示。

同上一篇文章一样,游戏还是小鸡快跑,不同的是,这次的小鸡不在是跳大坑,而是躲子弹了。

关于做游戏,还是那两样要点,对象和屏幕。不过,由于WPF不同Winform,它没有paint方法,所以使用WPF做游戏,只能考虑用别的方法来进行移动小鸡。本文中使用INotifyPropertyChanged来实现。闲话少说进入正题。

首先定义一个元素类Element,这里包含X坐标,Y坐标,小鸡显示图像,是否移动,是否加速,是否跳跃等等属性。如下为部分代码:

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Double X { </span><span style="color: #0000ff;"&gt;get</span> { <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; _x; } </span><span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt; { _x </span>=<span style="color: #000000;"&gt; value; </span><span style="color: #0000ff;"&gt;if</span> (PropertyChanged != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { PropertyChanged(</span><span style="color: #0000ff;"&gt;this</span>,<span style="color: #0000ff;"&gt;new</span> PropertyChangedEventArgs(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;X</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)); } } }</span></pre>

看了代码大家应该理解了,当修改小鸡的X坐标时,对象的属性也一起变更。

有了小鸡类后,就可以定义对象了,然后将小鸡添加进屏幕。同WINFORM一样,进行按键事件编写,上为跳跃,左右移动,空格加速。

在WINFORM里,有TIMER可以进行模拟帧,可是在wpf里没有timer这个类,于是我们使用System.Windows.Threading.DispatcherTimer。如下:

dispatcherTimer = += = TimeSpan(,,

在DispatcherTimer的事件里进行判断和移动操作。

关于移动,由于WPF 每个可以显示的控件,可以对其进行动画操作,因此,本文采用TranslateTransform。如下:

Name= Stroke= Width= VerticalAlignment= Margin=> X= Y=> Stretch=>

看了上面的代码,可以理解,我先定义了一个矩形,然后对矩形给予变换,(我习惯把render翻译成给予~~)初始值,都是X=0,Y=0,当我想移动他时,就改变他的X的值,加1,或加2就可以了。

在然后就是定义子弹,子弹有四个属性,X,Y,LIFE,BulletImg,定义好子弹类后,将子弹添加进屏幕。文中使用Image来添加子弹。如下:

<div class="cnblogs_code" onclick="cnblogs_code_show('3b1c64cb-5088-48ea-949a-afaf57da1104')">
<img id="code_img_closed_3b1c64cb-5088-48ea-949a-afaf57da1104" class="code_img_closed" src="https://www.52php.cn/res/2019/02-02/23/1c53668bcee393edac0d7b3b3daff1ae.gif" alt=""><img id="code_img_opened_3b1c64cb-5088-48ea-949a-afaf57da1104" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('3b1c64cb-5088-48ea-949a-afaf57da1104',event)" src="https://www.52php.cn/res/2019/02-02/23/405b18b4b6584ae338e0f6ecaf736533.gif" alt=""><span class="cnblogs_code_collapse">View Code
<div id="cnblogs_code_open_3b1c64cb-5088-48ea-949a-afaf57da1104" class="cnblogs_code_hide">

  Bullet Bullet = =  BitmapImage( Uri(= == = ==  Thickness(,            Img.VerticalAlignment </span>=<span style="color: #000000;"&gt; VerticalAlignment.Bottom;
            Img.HorizontalAlignment </span>=<span style="color: #000000;"&gt; HorizontalAlignment.Right;
            Img.RenderTransform </span>= <span style="color: #0000ff;"&gt;new</span> TranslateTransform(<span style="color: #800080;"&gt;0</span>,-<span style="color: #800080;"&gt;30</span><span style="color: #000000;"&gt;);
           </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;添加进集合</span>

<span style="color: #000000;"> ImgList.Add(Img);
BulletList.Add(Bullet);
<span style="color: #008000;">//<span style="color: #008000;">添加进屏幕
Root.Children.Add(Img);

子弹添加进去后,就是让他自己移动,这里采用改变子弹的MARGIN属性来控制。上面的代码有个小问题,我也没解决,就是图片添加进去后的位置我固定不了,所以我就对子弹进给予了变换?Img.RenderTransform = new TranslateTransform(0,-30)

最后就是死亡定义了,这个死亡定义还是比较讨厌的, 可能是我的基础不太好,没有找到更好的办法,于是我采用了本方法,即如果子弹的X 在小鸡的图片之间 并且 小鸡跳起的高度 小于10,那就死亡了。

由于写的比较匆忙,有一些没用到的对象忘记删除了就上传了,还有就是图片全部使用的是绝对路径,由于实在是WPF还不熟。。所以。。还请见谅。

开发环境:vs2008

源码下载地址:

补充:我没有对子弹进行释放,想扩展的朋友在扩展时需要在子弹打到屏幕外时,将子弹移除。

另外,程序似乎有个BUG,但我不太确定,就是是否移动到快到终点的时候,就不在出现子弹了?有解决的一定告诉我方法啊~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读