面向对象的动画设计.ppt

上传人:牧羊曲112 文档编号:6034389 上传时间:2023-09-16 格式:PPT 页数:28 大小:327.61KB
返回 下载 相关 举报
面向对象的动画设计.ppt_第1页
第1页 / 共28页
面向对象的动画设计.ppt_第2页
第2页 / 共28页
面向对象的动画设计.ppt_第3页
第3页 / 共28页
面向对象的动画设计.ppt_第4页
第4页 / 共28页
面向对象的动画设计.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《面向对象的动画设计.ppt》由会员分享,可在线阅读,更多相关《面向对象的动画设计.ppt(28页珍藏版)》请在三一办公上搜索。

1、面向对象的动画设计,基础练习:得到位置,得到目标位置ship1.GetValue(Canvas.LeftProperty)ship1.GetValue(Canvas.TopProperty)得到的是目标左上角距离左边和定边的距离,基础练习:设置位置,ship1.SetValue(Canvas.LeftProperty,shipLocation.X);ship1.SetValue(Canvas.TopProperty,shipLocation.Y);把目标左上角设置到指定位置,帧呈现事件,private void myRender(object sender,EventArgs e)Compos

2、itionTarget.Rendering+=myRender;一个动画有很多帧组成,在每帧中都可以执行判断或操作,第一行是关键,告诉Silverlight应用程序可以使用GPU硬件加速。注意了,这里仅仅是说可以使用。第二行是启用GPU硬件加速缓存验证,即将使用了硬件加速及没使用硬件加速的对象用颜色区分显示。第三行限制Silverlight应用程序的最大刷新频率,这里我设置为40代表每秒画面刷新次数最大为40;然而这并不是必然的,Silverlight会根据实际情况当CPU本身负荷不大而需要同时呈现的对象变化频繁时它会在一定时间内将刷新率超过最大值约50%不过以提升画面的流畅性,这方面我们无法

3、控制。第四行启动画面帧率统计。,对象动态创建,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);,练习,动态产生一个矩形,填充红色点击按钮,把它由屏幕左上角向右下角移动如果距离左边大于300,则填充蓝色一颗子弹向上飞一颗子弹从指定的位置向上飞一颗子弹从飞船所在的位置向上飞,public gameTest()Initial

4、izeComponent();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+=myRender;textBox1.Text=

5、();private void myRender(object sender,EventArgs e)reclocation.X+=1;reclocation.Y+=1;rec.SetValue(Canvas.LeftProperty,reclocation.X);rec.SetValue(Canvas.TopProperty,reclocation.Y);textBox1.Text=();if(double)rec.GetValue(Canvas.LeftProperty)=300)rec.Fill=new SolidColorBrush(Color.FromArgb(255,0,0,255

6、);,新建项目MyGame,新建文件夹UserControls把矢量图转换成的xaml文件拷贝入文件夹UserControls把xaml文件修改正确的namespace,再包含到项目中(这两步不能反了,因为只要包含到项目中就会生成cs文件)如下格式,在页面放入飞船和按钮,定义公用变量,private Point shipLocation=new Point(0,0);private Point shipSpeed=new Point(4,4);表示飞船的位置和速度因为速度有x和y坐标的速度,所以使用点对象表示比较方便,其含义并不是一个点。位置坐标是左上角的点位置,添加一个键盘控制事件,priv

7、ate 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;,完善代码,switch(e.Key)case Key.Left:shipLocation.X-=shipSpeed.X;/减小距离左边界的距离 break;case Key.Right:shipLocation.X+=shipSpeed.X;/br

8、eak;case Key.Up:shipLocation.Y-=shipSpeed.Y;/break;case Key.Down:shipLocation.Y+=shipSpeed.Y;/增大距离上边界距离 break;case Key.Space:break;default:break;,在按钮单击代码,button1.Visibility=Visibility.Collapsed;/隐藏按钮 shipLocation=new Point(double)ship1.GetValue(Canvas.LeftProperty),(double)ship1.GetValue(Canvas.TopP

9、roperty);/初始化飞船当前位置this.KeyDown+=new KeyEventHandler(myKeyDown);/注册键盘按下事件,在键盘事件最后设置飞船位置,ship1.SetValue(Canvas.LeftProperty,shipLocation.X);ship1.SetValue(Canvas.TopProperty,shipLocation.Y);每按下方向键,就会执行位置设置操作,程序测试,通过按键控制飞船方向,private Point shipLocation=new Point(0,0);private Point shipSpeed=new Point(4

10、,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;break;case Key.Up:shipLocation.Y-=shipSpeed.Y;break;case Key.Down:shipLocation.Y+=shipSpeed.Y;break;case Key.Space:default:break;private voi

11、d button1_Click(object sender,RoutedEventArgs e)button1.Visibility=Visibility.Collapsed;shipLocation=new Point(double)ship1.GetValue(Canvas.LeftProperty),(double)ship1.GetValue(Canvas.TopProperty);this.KeyDown+=new KeyEventHandler(myKeyDown);,产生一个向上飞的子弹,引用using LuoYongGame.UserControls;定义公用变量 Bullet

12、 bullet;private Point bulletLocation=new Point(300,500);private Point bulletSpeed=new Point(0,20);private DateTime lastTick;这里子弹要动态产生,要被多个事件使用,在按下空白键事件中加代码,case Key.Space:bullet=new Bullet();cnv.Children.Add(bullet);bullet.SetValue(Canvas.LeftProperty,bulletLocation.X);bullet.SetValue(Canvas.TopProp

13、erty,bulletLocation.Y);break;把子弹摆到一固定位置,以后会修改,写帧呈现事件,private void myRender(object sender,EventArgs e)TimeSpan ts=DateTime.Now-lastTick;bulletLocation.Y-=bulletSpeed.Y*ts.TotalSeconds;bullet.SetValue(Canvas.LeftProperty,bulletLocation.X);bullet.SetValue(Canvas.TopProperty,bulletLocation.Y);lastTick=D

14、ateTime.Now;,在按钮单击事件中添加,lastTick=DateTime.Now;CompositionTarget.Rendering+=myRender;得到运行开始时间注册帧呈现事件,Canvas x:Name=ALIEN_01_01 Width=195 Height=129 Canvas.Left=,修改MainPage.xaml,注意要编译,注意工具栏,xmlns:my=“clr-namespace:MyGame.UserControls”可以从工具栏拖出控件了。,界面,类中的变量,/暂存绿色外星人在画布中的位置 private Point greenAlien1Locat

15、ion=new Point(0,0);/暂存绿色外星人在X轴上的移动速度 private Point greenAlien1Speed=new Point(250,0);/定义动画在画布中的左边界 private Point upperLeftCorner=new Point(0,0);/定义动画在画布中的右边界 private Point bottomRightCorner=new Point(0,0);/暂存外星人的行高 private double rowHeight=60;/暂存完成呈现帧的时间 private DateTime lastTick;,private void Rende

16、rFrame(object sender,EventArgs e)/计算当前时间与上次完成帧事件的时间差 TimeSpan ElapsedTime=(DateTime.Now-lastTick);/根据时间差和定义的外星人在X轴上的移动速度更新外星人在X轴上的坐标 greenAlien1Location.X+=greenAlien1Speed.X*(double)ElapsedTime.TotalSeconds;/根据时间差和定义的外星人在Y轴上的移动速度更新外星人在Y轴上的坐标 greenAlien1Location.Y+=greenAlien1Speed.Y*(double)Elapsed

17、Time.TotalSeconds;/如果外星人移动到了画布的右边界 if(greenAlien1Location.X bottomRightCorner.X)/达到画布的右边边界了,转换方向(原本是从左到右,此时外星人转变为从右到左移动)greenAlien1Speed.X*=-1;/设置外星人当前的X轴坐标 greenAlien1Location.X=bottomRightCorner.X;/更改外星人的Y轴坐标,使其下移一行 greenAlien1Location.Y+=rowHeight;else if(greenAlien1Location.X upperLeftCorner.X)/

18、如果外星人移动到了画布的左边界/到达画布的右边界,需改变外星人的移动方向(原本从右到左,此时外星人转变为从左到右)greenAlien1Speed.X*=-1;/设置外星人当前的X轴坐标 greenAlien1Location.X=upperLeftCorner.X;/更改外星人的Y轴坐标,使其下移一行 greenAlien1Location.Y+=rowHeight;/用新的坐标改变外星人在画布中的位置 ucGreenAlien1.SetValue(Canvas.LeftProperty,greenAlien1Location.X);ucGreenAlien1.SetValue(Canvas

19、.TopProperty,greenAlien1Location.Y);/帧呈现事件完成,保存当前时间 lastTick=DateTime.Now;,private void btnStartGame_Click(object sender,RoutedEventArgs e)/隐藏开始按钮 btnStartGame.Visibility=Visibility.Collapsed;/保存绿色外星人的当前位置(顶点的X坐标及顶点的Y坐标)greenAlien1Location=new Point(double)ucGreenAlien1.GetValue(Canvas.LeftProperty)

20、,(double)ucGreenAlien1.GetValue(Canvas.TopProperty);/定义动画的左边界 upperLeftCorner=new Point(greenAlien1Location.X,greenAlien1Location.Y);/定义动画的右边界(动画的右边界画布的实际大小与外星人宽度的差)bottomRightCorner=new Point(LayoutRoot.ActualWidth-ucGreenAlien1.ActualWidth,LayoutRoot.ActualHeight-ucGreenAlien1.ActualHeight);/存储动画的

21、开始时间 lastTick=DateTime.Now;/添加屏幕帧处理事件 CompositionTarget.Rendering+=RenderFrame;CompositionTarget.Rendering是响应静态事件,触发该事件是为了为每帧获取内容。这是一种非常方便的方法,用它构建基于帧的动画的基本技术很容易,只需要简单地为静态的CompositionTarget.Rendering事件关联事件处理程序。一旦关联了事件处理程序,Silverlight就会开始不断地调用这个事件处理程序(只要渲染代码执行得足够快,每秒将会调用60次),Width 和 ActualWidth差别,Widt

22、h:是我们期望控件应有的宽度,是可读写的,可在xaml文件中设置,也可在法度中设置。若是没有设置,Width的值为NaN(Not a Number)ActualWidth:是控件Render的实际宽度,控件Render之前,它的值为0,。该属性是只读的。,运行后看到一个精灵的运动在Silverlight 中,我们必须对一些重要问题进行精确地控制。其中最重要的是时间管理。默认情况下,Silverlight 每秒输出60帧图像。这意味着代码必须尽可能快地执行每一个帧的输出以避免漏掉一些帧的显示任务以便生成一个平滑流畅的动画效果。对于创建其它使用矢量图形的程序来说,其实现步骤和我们前面的例子的步骤几乎完全相同。你可以使用基于矢量图形的动画精灵来替换前面的光栅图像。在完成了许多精灵的创建任务后你会觉得代码不容易维护。此时需要对代码进行重构,这就要使用一个定义了绝大部分公共动画行为的新类来对精灵进行包装。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号