利用gameloop开发简单第一个小游戏

本文介绍了一个基于WPF的简易游戏循环实现方法,并演示了如何通过键盘输入控制屏幕上的精灵移动。通过Storyboard定时刷新游戏状态,实现了基本的游戏交互。

 

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

 

 

 

sp.xaml的代码如下:

  1. <UserControl
  2.  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.  mc:Ignorable="d"
  7.  x:Class="gameloop.sp"
  8.  d:DesignWidth="640" d:DesignHeight="480">
  9.  <Grid x:Name="LayoutRoot" Background="#FFF21A1A" Width="90" Height="90" />
  10. </UserControl>

以下是Page.xaml.cs文件的内容:

 

  1. namespace gameloop
  2. {
  3.     public partial class Page : UserControl
  4.     {
  5.         public Page()
  6.         {
  7.             InitializeComponent();
  8.             this.Loaded += new RoutedEventHandler(Page_Loaded);
  9.             this.KeyDown += new KeyEventHandler(Page_KeyDown);
  10.         }
  11.         //键盘按下事件,WSAD键按下时改变mypos的值
  12.         void Page_KeyDown(object sender, KeyEventArgs e)
  13.         {
  14.             if (e.Key == Key.W)
  15.             {
  16.                 mypos.Y -= 1;
  17.             }
  18.             if (e.Key == Key.S)
  19.             {
  20.                 mypos.Y += 1;
  21.             }
  22.             if (e.Key == Key.A)
  23.             {
  24.                 mypos.X -= 1;
  25.             }
  26.             if (e.Key == Key.D)
  27.             {
  28.                 mypos.X += 1;
  29.             }
  30.         }
  31.         //定义一个Storyboard命名为gameloop
  32.         Storyboard gameloop;
  33.         //定义精灵
  34.         sp sp1;
  35.         //定义一个点,其x,y值用来保存和设定精灵的坐标
  36.         Point mypos;
  37.         void Page_Loaded(object sender, RoutedEventArgs e)
  38.         {
  39.             //实例化
  40.             gameloop = new Storyboard();
  41.             //gameloop的刷新时间为25毫秒
  42.             gameloop.Duration = new Duration(TimeSpan.FromMilliseconds(0));
  43.             //注册刷新事件
  44.             gameloop.Completed += new EventHandler(gameloop_Completed);
  45.             //添加并初始化精灵
  46.             addsp();
  47.             //开始刷新
  48.             gameloop.Begin();
  49.         }
  50.         //示例需要用到的运算变量
  51.         int fps = 0;
  52.         void gameloop_Completed(object sender, EventArgs e)
  53.         {
  54.             //在这里添加游戏代码
  55.             //示例
  56.             //这里的FPS是一个TextBlock控件,请自行添加到Page.xaml以顺利运行此示例
  57.             FPS.Text = fps.ToString() + "FPS";
  58.             fps++;
  59.             //把mypos的值传给精灵,精灵移动的效果在这里产生
  60.             ((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).X = mypos.X;
  61.             ((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).Y = mypos.Y;
  62.             //继续刷新
  63.             gameloop.Begin();
  64.         }
  65.         //添加精灵的实现代码
  66.         void addsp()
  67.         {
  68.             //实例化精灵
  69.             sp1 = new sp();
  70.             //精灵添加到表展层,(layoutroot是一个grid)
  71.             this.LayoutRoot.Children.Add(sp1);
  72.             //为精灵添加依赖属性
  73.             createTFG(sp1);
  74.             //取得精灵起始位置并保存到mypos中
  75.             mypos = new Point(((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).X
  76.                 , ((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform).Y);
  77.         }
  78.         //为传入的控件添加依赖属性
  79.         void createTFG(UIElement element)
  80.         {
  81.             //属性组
  82.             TransformGroup group = new TransformGroup();
  83.             //这些是没有用到的属性以后再在实例中讲解应用
  84.             ScaleTransform scale = new ScaleTransform();
  85.             SkewTransform skew = new SkewTransform();
  86.             RotateTransform rotate = new RotateTransform();
  87.             
  88.             //这里我们只到了这个属性,是位置属性,子项里有x,y属性是可以取得或者设定坐标值的
  89.             //其它地方用到的((sp1.RenderTransform as TransformGroup).Children[3] as TranslateTransform)都是在取得或者设定这个属性的x,y值
  90.             TranslateTransform translate = new TranslateTransform();
  91.             //把属性都添加到组
  92.             group.Children.Add(scale);
  93.             group.Children.Add(skew);
  94.             group.Children.Add(rotate);
  95.             group.Children.Add(translate);
  96.             //把属性组传送到控件
  97.             element.RenderTransform = group;
  98.         }
  99.     }
  100. }

工程文件请我的资源里下载.

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值