如何用C#实现扑克发牌动画效果?

longsky 2021-01-31 05:09:59


效果如上图,扑克牌由中间位置向下从左到右发牌,形成发牌动画,这是截图,显示的过程中只有一张牌。实际效果我是看的有款叫 够级 1.0的游戏,看到这里的发牌效果很好,想模仿一下。没能达到。

不知有没有高手朋友帮忙?

本人水平有限,用线程和timer效果都是乱七八糟,没能实现。
...全文
2860 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
longsky 2021-02-27
  • 打赏
  • 举报
回复
我看能不能尝试写一下具体代码, 谢谢烤火的鱼
烤火的鱼 2021-02-19
  • 打赏
  • 举报
回复
不推荐timer,timer一般在主线程里面,建议在线程里面执行,sleep一下,然后this.Invoke调用主线程的方法,移动牌,如果在主线程里面sleep,则移动后必须用Application.DoEvents()方法把CPU控制权交给其他事件先处理(必然窗口重绘),要不然系统卡在那里看不到效果
longsky 2021-02-12
  • 打赏
  • 举报
回复
desperaso: 正在看那个贴子的12楼。 xuzuning:绘图虽然不会改变背景的图,但不刷新,这些图片还是会留在上面,一刷新,就有闪烁感。
xuzuning 2021-02-08
  • 打赏
  • 举报
回复
背景是容器的背景图,绘图是在 从容器创建的 Graphics 中进行的,所以绘图不会改变背景的内容,无需复制
desperaso 2021-02-07
  • 打赏
  • 举报
回复
图片移动是这么搞地:
https://bbs.csdn.net/topics/392714495?page=2
的12楼
和pictureBox没啥关系,用pictureBox没法看地

longsky 2021-02-07
  • 打赏
  • 举报
回复
感谢以上朋友的回复! 录视频转GIF效果确实差,desperaso朋友的GIF已经算很好的,我试过,效果挺好的。 我想的效果是这样的: 现在我完成的效果是这样的: 中间省略了很多帧。要不图片太大。 主要代码 public static Bitmap myone= new Bitmap(71,96); //要移动的扑克图案 public static Bitmap backclone = new Bitmap(71, 96); //复制的下一步扑克移动位置的背景 public void initbackimg() { Image mybmp = Image.FromFile(@"bmp\back1.png"); Graphics g = Graphics.FromImage(myone); g.DrawImage(mybmp, new Rectangle(0, 0, 71, 96), new Rectangle(0,0,71, 96), GraphicsUnit.Pixel); g.Dispose(); } //在 指定位置绘图。 public void hui(Point pxy) { pictureBox2.CreateGraphics().DrawImage(myone, pxy.X, pxy.Y); } //在 指定位置复制当前背景图。 public void copyto(Point pxy) { Graphics g =Graphics.FromImage(backclone); g.DrawImage(pictureBox2.BackgroundImage, new Rectangle(0,0, 71, 96), new Rectangle(pxy.X, pxy.Y, 71, 96), GraphicsUnit.Pixel); g.Dispose(); } public void rehui(Point pxy) { pictureBox2.CreateGraphics().DrawImage(backclone, pxy.X, pxy.Y); } 然后在定时器里 不断 复制背景 绘扑克 恢复背景,不断重复,发牌速度有点慢。 这样的代码还需要怎么改进更有效果呢?
desperaso 2021-02-06
  • 打赏
  • 举报
回复
链接:https://pan.baidu.com/s/1g-148bkIU7yegQFO_j8cnQ
提取码:vnrd
2种牌面,svg转path绘制,程序里选择设置,11种发牌动画效果,可动画组合设置

录制效果太差,运行查看,
  • 打赏
  • 举报
回复
最简单的办法是用h5个效果,JS做动作,c#可用可不用,不然拿来做个外壳也可以
zerozerg2006 2021-02-04
  • 打赏
  • 举报
回复
本质上其实是更新图的位置,算出每一帧里牌的位置,然后调整坐标,构造矩阵,渲染出来就好了。 按照你的描述,我估计你后面三条都是现成的。 还有,这里不需要任何多线程的东西。别看着好像很多东西都在动,就需要多线程。
mirrorspace 2021-02-04
  • 打赏
  • 举报
回复
用动画库很容易完成这个. 看你的样子是想自己写算法,要用C#winform的画图API.自己实现画扑克,移动X,Y.调整间隔时间. 其实麻烦的很,因为是要重新制造轮子
  • 打赏
  • 举报
回复
timer实现可以通过不断重画牌来实现(一秒内至少12帧,为了凑成整数,建议每次间隔50ms)
PLC云峰. 2021-02-03
  • 打赏
  • 举报
回复
求叻:R[0],R[1]。。。。。R[n] 如何C#语言初始化 数组n,数组最小值,数组最大值都可设定。
ziqi0716 2021-02-03
  • 打赏
  • 举报
回复
引用 4 楼 longsky 的回复:
三位朋友推荐的都挺好的。不过不懂wpf。能用timer实现吗? 比如从座标 x=280 y=280 开始发54张牌, 牌 1 2 3 4 ....... 54 每张牌的座标: x1=120+10*牌的序列号 y1=680 发牌过程中牌的位置变化量, x变=(x1-x)/10 y变=(680-280)/10 通过timer控制 每次把当前牌的位置 给加上变化量。 自己写了几次,总是达不到效果 。 for(int i=1;i<55;i++) { ........ timer1.Start() ............... }
定时器来实现这个?方向绝对有问题的,尽早打消这个念头.简单学下wpf的动画,找个demo学下就好了
eggplane 2021-02-03
  • 打赏
  • 举报
回复
干啥活用啥工具,用c#搞这个不对,学学cocos吧
  • 打赏
  • 举报
回复
timer的话,只能是隔几秒就变化图片的X Y坐标呗
longsky 2021-02-02
  • 打赏
  • 举报
回复
采用这种方法,所有牌是一下子出来的,跟预想的不一样。主要代码是这样的: 每张牌要移动的10个位置,0 是最开始的位置,9是最终要移到的位置。 Dictionary<int, Point> pathCol = new Dictionary<int, Point> { {0,new Point(0,0)}, {1,new Point(0,0)}, {2,new Point(0,0)}, {3,new Point(0,0)}, {4,new Point(0,0)}, {5,new Point(0,0)}, {6,new Point(0,0)}, {7,new Point(0,0)}, {8,new Point(0,0)}, {9,new Point(0,0)}, }; #region 根据指定的扑克牌序号 生成发牌变化位置 public void mypath(int num) // 第num张牌 { int temx = 260, temy = 280; pathCol[0]=new Point(temx, temy);// 发牌最新开始的位置。 int x1 = 150 + 15 * num; int y1 =30; x1 =(x1-temx )/ 10; for (int i = 1; i < 9; i++) { temx = temx + x1; temy =temy+y1; pathCol[i]=new Point(temx, temy); } pathCol[9]=new Point(120 + 15 * num, 580);// 发牌最终的位置。 } #endregion int pkcount =1;//扑克牌的总数。 int isnum = 1;//当前要发的扑克牌序号 int ,tmove=0; //位置序号 private void timer1_Tick(object sender, EventArgs e) { while (isnum <= pkcount) //当前扑克牌序号要小于扑克总数 { if (tmove == 0) // 如果是从第0个位置,先生产位置序列 mypath(isnum); mypic[isnum].Location = pathCol[tmove]; //把当前扑克移到指定位置。 tmove += 1; //位置系号加1 if(tmove>9) //如果扑克牌已经移动到位。 { tmove = 0; isnum += 1; } } timer1.Stop(); } 但显示结果不是想像的那样,一张牌按位置系列移动到位后,再开始一张移动,而是一下子全部移动到位,不知道问题出在哪里?有明白的朋友吗? 同样的方法用在另一个程序,是可以移动的。
desperaso 2021-02-02
  • 打赏
  • 举报
回复
在winform底下用组件移动方式来显示,效果太差基本上看不成,这类操作用paint重绘
比如https://bbs.csdn.net/topics/392725261
Dear200892 2021-02-01
  • 打赏
  • 举报
回复
可以通过WPF的动画实现物体的移动和旋转
assky124 2021-02-01
  • 打赏
  • 举报
回复
直接用游戏引擎(cocos之类的)或者WPF
北京.NET 2021-02-01
  • 打赏
  • 举报
回复
timer或者线程给你一个思路 起始X,Y 移动到X,Y,算出X,Y 一共需要的坐标, 比如循环10次,每次 XY轴移动十分之一。
加载更多回复(3)

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧