在工程里添一个新的UserControl,命名为:sp

sp.xaml的代码如下:
- <UserControl
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d"
- x:Class="gameloop.sp"
- d:DesignWidth="640" d:DesignHeight="480">
- <Grid x:Name="LayoutRoot" Background="#FFF21A1A" Width="90" Height="90" />
- </UserControl>
以下是Page.xaml.cs文件的内容:
- namespace gameloop
- {
- public partial class Page : UserControl
- {
- public Page()
- {
- InitializeComponent();
- this.Loaded += new RoutedEventHandler(Page_Loaded);
- this.KeyDown += new KeyEventHandler(Page_KeyDown);
- }
- //键盘按下事件,WSAD键按下时改变mypos的值
- void Page_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.Key == Key.W)
- {
- mypos.Y -= 1;
- }
- if (e.Key == Key.S)
- {
- mypos.Y += 1;
- }
- if (e.Key == Key.A)
- {
- mypos.X -= 1;
- }
- if (e.Key == Key.D)
- {
- mypos.X += 1;
- }
- }
- //定义一个Storyboard命名为gameloop
- Storyboard gameloop;
- //定义精灵
- sp sp1;
- //定义一个点,其x,y值用来保存和设定精灵的坐标
- Point mypos;
- void Page_Loaded(object sender, RoutedEventArgs e)
- {
- //实例化
- gameloop = new Storyboard();
- //gameloop的刷新时间为25毫秒
- gameloop.Duration = new Duration(TimeSpan.FromMilliseconds(0));
- //注册刷新事件
- gameloop.Completed += new EventHandler(gameloop_Completed);
- //添加并初始化精灵
- addsp();
- //开始刷新
- gameloop.Begin();
- }
- //示例需要用到的运算变量
- int fps = 0;
- void gameloop_Completed(object sender, EventArgs e)
- {
- //在这里添加游戏代码
- //示例
- //这里的FPS是一个TextBlock控件,请自行添加到Page.xaml以顺利运行此示例
- FPS.Text = fps.ToString() + "FPS";
- fps++;
- //把mypos的值传给精灵,精灵移动的效果在这里产生
- ((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).X = mypos.X;
- ((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).Y = mypos.Y;
- //继续刷新
- gameloop.Begin();
- }
- //添加精灵的实现代码
- void addsp()
- {
- //实例化精灵
- sp1 = new sp();
- //精灵添加到表展层,(layoutroot是一个grid)
- this.LayoutRoot.Children.Add(sp1);
- //为精灵添加依赖属性
- createTFG(sp1);
- //取得精灵起始位置并保存到mypos中
- mypos = new Point(((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).X
- , ((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).Y);
- }
- //为传入的控件添加依赖属性
- void createTFG(UIElement element)
- {
- //属性组
- TransformGroup group = new TransformGroup();
- //这些是没有用到的属性以后再在实例中讲解应用
- ScaleTransform scale = new ScaleTransform();
- SkewTransform skew = new SkewTransform();
- RotateTransform rotate = new RotateTransform();
- //这里我们只到了这个属性,是位置属性,子项里有x,y属性是可以取得或者设定坐标值的
- //其它地方用到的((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform)都是在取得或者设定这个属性的x,y值
- TranslateTransform translate = new TranslateTransform();
- //把属性都添加到组
- group.Children.Add(scale);
- group.Children.Add(skew);
- group.Children.Add(rotate);
- group.Children.Add(translate);
- //把属性组传送到控件
- element.RenderTransform = group;
- }
- }
- }
工程文件请我的资源里下载.
本文介绍了一个基于WPF的简易游戏循环实现方法,并演示了如何通过键盘输入控制屏幕上的精灵移动。通过Storyboard定时刷新游戏状态,实现了基本的游戏交互。
1173

被折叠的 条评论
为什么被折叠?



