Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示
本节完后,同时会更新Silverlight+WCF 新手实例 象棋 专题索引,并顺路提供第八阶段源码
在Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)节中,我们完成了下棋双方的棋谱传递
在Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)节中,我们完成了观棋者获取棋谱列表
在本节中,我们要进行最一步了,棋谱回放:
首先,当用户进入列表后,获取完棋谱信息之后,第一个动作,就是要把棋谱按顺序播放一下,这样,用户看到棋局就是双方正在下的棋局了,之后,就跟下棋一样,一步步接收棋步,然后一步步的自动移动就行了。
我们播放哪里的棋谱呢的?
界面上显示的ListBox显然是不能用来循环读取的,毕竟那显示的是格式化后的字符串,从字符串解析回棋步是不现实的;
一开始获取的列表不是可以循环?那也只有一部分,之后棋手双方下的呢?
所以,说了这么多,其实不就是想找多个变量来存棋谱列表么,于是,我们在App.xaml.cs全局又添加一个全局变量了:
{
//...省略N行代码...
public static List<GameService.MoveStep> stepList = new List<GameService.MoveStep>();//棋谱
public static bool chessManualPlaying = false;//棋谱正回放中
//...省略N行代码...
public App()
{
//...省略N行代码...
}
//...省略N行代码...
}
这里又顺路添加了一个全局属性,用于设置棋谱是不是正在回放中,后面我们会用到[很后哦]。
OK,全局棋谱存贮变量有了,我们就得为它增加棋谱数据了,我们会在两个地方添加棋谱,
1:一个是用户下棋时传递时的棋谱:
我们进入Chess.xaml.cs,找到收到棋谱通知的代码,只需要添加一行,第一行,把棋步添加一下就行了:
{
App.stepList.Add(e.player.Step);//只需要一行
if (App.player.ID != e.player.ID)//非自己
{
//...省略N行...
}
HelpSetChessManualEvent(e.player.Step);
}
2:进入页面时获取的棋谱列表读取到棋谱区时:
我们进入ChessManual.xaml.cs,找到获取棋谱列表的代码,同样只需要一行:
{
//获取完棋谱后,这里循环调用添加就可以了
if (e.Result != null && e.Result.Count > 0)
{
App.stepList = e.Result;//这里只需要一行代码
foreach (GameService.MoveStep step in e.Result)
{
lbChessManual.Items.Add(step.ID + ":" + step.Name);
}
}
}
OK,我们对全局棋谱的传值,两行代码就搞定了,于是在播放棋谱时,理论上我们循环全局的stepList就行了:
我们先产生一个方法,用于播放一个棋步,就是传进一个棋步,然后自动播放:
{
Point from = new Point(step.FromX, step.FromY);
Point to = new Point(step.ToX, step.ToY);
if (App.player.ColorValue + step.ColorValue == 3 || (step.ColorValue == 2 && App.player.ColorValue == 3))//旁观者 黑色棋子
{
from = App.chess.ReverseArray(from);
to = App.chess.ReverseArray(to);
}
App.chess.Action.AutoMoveTo(from, to);
}
这个方法其实有点简单,只要调用AotoMoveTo就搞完了,唯一的复杂点,就是判断要不要反转坐标了。
[两种情况:如果是下棋者,棋步是对手的,要反转坐标;观众默认是红色的,收到黑色棋步,也要反转坐标]
好了,有了单步的方法,我们for一下step里,然后循环传值就OK了?No,如果这样循环,棋步刷的一下就没了,还看啥回放?
因此,我们需要定间隔播放了,所以,我们需要先产生间隔的秒数,我们通过滑动块来设置文本框的数字:
我们设置一下滑动块的属性[默认值为0,最大值为9,最小滑动为0.5,最大滑动为1]:
我们同时添加滑动事件:
而我们滑动时只需要一行代码,为文本框赋值就行了:
{
txtValue.Text = e.NewValue.ToString();
}
我们增加一个方法,叫PlayStep,用于循环播放棋步:
{
//待实现
}
好了,接着我们双击一下“回放”按钮,里面调用一下这个PlayStep就行了:
{
PlayStep();
}
默认我们加载完棋步列表后,也要定位棋步,所以也调用一下PlayStep:
{
//获取完棋谱后,这里循环调用添加就可以了
if (e.Result != null && e.Result.Count > 0)
{
App.stepList = e.Result;//这里只需要一行代码
foreach (GameService.MoveStep step in e.Result)
{
lbChessManual.Items.Add(step.ID + ":" + step.Name);
}
PlayStep();//加完后马上调用播放棋步,默认0秒,所以刷一下就播放完了
}
}
于是,所有的重点只剩下怎么实现这个PlayStep了。
我们每一步棋步都需要间隔N秒走一步,一开始我竟然用线程的Sleep来操作,结果是,程序卡住了,直接播放完了才能动,那个汗-_-!
于是,N久之后,非线程阻塞的timer出来了,让它定时每N秒走一步就行了:
全局定义一下timer先,顺路加上移动的索引:
{
System.Windows.Threading.DispatcherTimer timer;//定义timer
int moveStepIndex = 0;//移动到第几步了
//...下面省略N行...
}
接着初始化timer及事件:
{
System.Windows.Threading.DispatcherTimer timer;//定义timer
int moveStepIndex = 0;//移动到第几步了
public ChessManual()
{
//...省略N行...
timer = new System.Windows.Threading.DispatcherTimer();
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
//待实现
}
//...省略N行...
}
我们这里没有初始化timer的间隔时间,是因为把间隔时间设置放到PlayStep函数里了,说到PlayStep,我们可以实现它了:
{
if (App.stepList.Count > 0)
{
//播放前复位棋子
App.chess.Reset();
timer.Interval = TimeSpan.FromSeconds(slPlayerInternal.Value);
timer.Start();
}
}
我们只用了小小几行代码,其实就是设置一下时间,然后让timer它Start起来就完事了,于是重心又一步转移到timer的tick事件里了:
{
//待实现
GameService.MoveStep step = App.stepList[moveStepIndex];//获取棋步
lbChessManual.SelectedIndex = moveStepIndex;//定位棋步索引
lbChessManual.UpdateLayout();//需要更新下布局
lbChessManual.ScrollIntoView(lbChessManual.SelectedItem);//滚动到先中的项
AutoMove(step);//移动棋步
moveStepIndex++;//索引加1
if (moveStepIndex == App.stepList.Count)//判断棋步结束没有
{
moveStepIndex = 0;//重置索引
timer.Stop();//停止timer
}
}
这里每一步都有注释,相信不会看不懂的了。OK,至此,我们是可以F5看效果了:
1:目前正在下棋,下到一半中:
2:观众进来了,获取完棋步,并播放了一次,定位到最后一步:
3:设置为2秒,点“回放”,自动播放了第一步:
4:回放走到第二步:
5:回放走到最后一步了:
OK,到此,我们的棋谱回放功能基本完成了,只是有一些细节,我们是需要另外处理了:
1:下棋者在下棋过程,要不要开放“回放”功能,如果开放,需要注意什么?
2:观众在回放过程中,突然又传来一个棋步,需要注意什么?
这两个小细节,下节处理,本系列到这里,所有基础区的功能都基本完成了差不多了,那本系列是不是也接近尾声了?
OK,本节点到为止了,提供第八阶段源码:点击下载
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2010/08/09/1795873.html
Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)相关推荐
- Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)
在线演示地址: Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们 ...
- Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)
2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界 ...
- Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 演示已更新到此节介绍:Silverlight+WCF 新手实例 象棋 介绍III(二十三) 本节连着Silverlight+WC ...
- Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 事隔几篇,我们又回到事件区,继续其它两个按钮事件,来张图吧: 在Silverlight+WCF 新手实例 象棋 主界面-事件区- ...
- Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 还是那张图: 本节实现返回大厅和退出系统: 一:返回大厅,其实很简单的说,就是转向房间列表了. 可是,转向前也有很多事情要处理的 ...
- Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)
2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 上上一节,就是二十八节:Silverlight+WCF ...
- Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)
上上一节,我们对棋子的下半盘棋子做了所有的规则限制,因为我们下棋的总是用下半盘的棋子来下,总没人用上半盘棋来下那么高境界的吧. 不过这节简单追加点代码,让那些企图高境界的人士可以临时性的自己和自己下. ...
- Silverlight+WCF 新手实例 象棋 介绍(一)
先发一下目前实例情况的截图: 1.登陆界面: 2.进入房间大厅 三种颜色,红色为红色玩家,黑色为黑色玩家,蓝色为主旁观者.点击就进去. 3.点击红色进入主界面 目前缺少系统消息文字输出,棋谱信息,棋谱 ...
- Silverlight+WCF 新手实例 象棋 介绍II(九)
2019独角兽企业重金招聘Python工程师标准>>> 继上次介绍发图以来,除了一边写文章介绍以外,还进一步不断的完善,并增加了新的功能, 现在进一步上图,对目前情况的进展做一下简单 ...
最新文章
- Android4.3引入的UiAutomation新框架官方简介
- 如何使Putty会话颜色更美观
- 荒径 弗罗斯特_弗罗斯特庞克,颠覆性城市建设者
- 前端学习(2269)vue造轮子之添加icon
- gcc预处理、编译、汇编、链接详解
- php soap调用asp.net webservice
- JavaScript:Date 对象
- 在Java中将字符串转换为日期,将日期转换为字符串
- shell常见的语句结构_wuli大世界_新浪博客
- 更好的在小学语课上用计算机,如何把小学科学课上好教育随笔
- grok java_Java Grok.match方法代码示例
- 【雅思】【绿宝书错词本】List13~24
- meta标签(以京东首页为例)
- 68000多只海洋动物、占地18.3万平米,这才是全球最大海洋水族馆该有的气势!...
- 企业邮箱09年的十大新闻
- python是否被高估了?
- 如何判断一棵二叉树是完全二叉树
- 类似火车头的采集器-免费任意数据采集器
- python清掉内存的函数_关于python:如何彻底清除所有Matplotlib图的内存
- 【二分】【卡常】砍树(luogu P1873)
热门文章
- Delivery Hero的Kubernetes之旅:从YAML泥潭到Helm乐园
- KLD导航无法支持外卡的解决方法
- 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程
- Springboot、Mybatis(Mybatis-plus) 、Mysql
- 疫情驱动变革,2020腾讯云To B大有可为
- 【附源码】计算机毕业设计JAVA疫苗药品批量扫码识别追溯系统
- 用Python实现音频卷积,并制作一个简单的HRTF效果
- 大疆M3508电机使用PWM控制转速
- 计算机二级难吗 可以自学不,计算机二级可以自学好过吗
- 书评学习笔记《自动驾驶汽车环境感知》