16年内在WinForms + C#上进行游戏(第2部分)

背景知识


自从上一篇文章撰写以来已经有一段时间了。 按照承诺,我写了第二部分。 我要感谢所有在评论中提供建议的人,从中我能够学习到一些新东西。 好吧,对于那些希望立即看到该项目的人, 这里是 GitHub项目的链接

只是要注意,此版本中添加和更改的所有内容都是通过非常
很多工作,很多错误。 我的Google收到了大量请求,从MVP的实现功能到异步方法。

图片


更新内容


  1. 添加了自己的地图编辑器(与原始游戏一样)。
  2. 更完善的实现。
  3. 增加了追上驴子和旋转的能力。
  4. 添加了许多类型的鱼。
  5. 大大提高了项目绩效。
  6. 修复了大量错误。
  7. 此外,在应用程序的体系结构(更确切地说,其外观)上也有重大改进。
  8. 添加了保存玩家资料。
  9. 实现的奖杯。
  10. 增加了白天和黑夜的变化。
  11. 旅行已添加。
  12. 开设杂货店。
  13. 实施了MVP模式。
  14. 在游戏中实施事件系统
  15. 诱饵,具有混合成分的能力
  16. 添加了语音表演
  17. 添加了动画
  18. 取决于鱼的大小和生存时间来进行鱼竿的磨损

我将对README Git项目文件进行更多更改。

别人的代码是如何被误导的。


图片

我们在屏幕快照中看到了用于钓鱼的地图编辑器,即每个位置的深度网格(这些是FormBorderStyle = 0的Label元素,以便显示框架)。 顺便说一下,截图是使用我自己的剪刀制作的。 怎么了

源代码
for (int x = 0; x < 51; x++){ for (int y = 0; y < 18; y++){ Point between = new Point(Game.CastPoint.X - LVL.Deeparr[x, y].Location.X, Game.CastPoint.Y - LVL.Deeparr[x, y].Location.Y); float distance = (float)Math.Sqrt(between.X * between.X + between.Y * between.Y); if (distance < 20){ if (Player.getPlayer().lure != null){ Game.gui.DeepLabel.Text = LVL.Deeparr[x, y].Tag.ToString(); Sounder.setY(x); Sounder.setX(y); } } Game.Deep = Convert.ToInt32(Game.gui.DeepLabel.Text); } } 



在这里,我们看到了一个二维数组的简单遍历(而不是正确的遍历)。 然后,我们根据勾股定理计算斜边,如果<20,则确定所需的像元。 但是,即使使用正方形,此方法也非常糟糕。 这是矩形。 因此,经常会错误地检测到该单元。 为了辩护,我可以说我是从YouTube那里获取此代码的。

因此,我们需要确定光标位于哪个单元格中。 为此,您可以使用以下源代码:

代号
 for (var y = 0; y < CurLvl.Height; y++) { for (var x = 0; x < CurLvl.Widgth; x++) { var r = new Rectangle(CurLvl.DeepArray[x, y].Location, new System.Drawing.Size(LabelInfo.Width, LabelInfo.Height)); if (r.IntersectsWith(new Rectangle(point, new System.Drawing.Size(1, 1)))) { //SomeCode } } } 


在这里,我们获取光标的坐标,将其粘贴到PointToClient中,然后将它们传递给Rectangle构造函数,指定大小1和1。然后使用标准的IntersectsWith检查方法,光标交集和标签。 同样,我们不能只处理标签的单击,因为不会显示带有标签的表单。
另外,它允许对3个钓鱼竿实施支撑。

鱼的产生


因此,游戏的主要部分是鱼的产生。 它分为几个阶段:
1.输入位置时,我们来自以下行:
金鱼:25 250-400 [奶酪,蠕虫,Mag,玉米]鱼的大小占最大,最小深度,最大深度的百分数,以及我们得到鱼对象的诱饵列表(请不要忘记通过正则表达式预先检查该行)。 为了使代码美观,我定义了一个将字符串转换为fish的运算符。

 public static explicit operator Fish(FishString fs) { return fs.GetFishByStr(); } 


结果,这种方法使我们可以编写:

 Fish fish = (Fish)new FishString(" : 25 250 - 400 [ , , ,  ]"); 

该代码仅作为示例提供,在此项目中找不到此格式。

2,现在我们需要等待扔掉钓鱼竿,之后我们以随机的咬合时间启动定时器(每个钓鱼竿自己的定时器),然后从大小为1000单位的鱼类列表中跟随定时器的刻度,选择栖息深度包括深度的鱼类钓鱼竿。

3.从此列表中,随机选择一条鱼。 我们检查是否可以食用鱼饵,还检查鱼的活动时间与游戏中的当前时间相对应。

4.如果鱼可以吃掉诱饵,我们就对诱饵进行攻击。 我们根据已安装的挂钩下降的机会来计算是否会下降,以及在什么时间之后下降。 如果鱼不能吃掉诱饵,那么我们将循环浏览当前的诱饵(如果有)。 我们检查附近是否有一条鱼会啄到鱼饵上,然后重复同样的事情。

由于生成过程,我已经成为一个自信的LINQ用户。

游戏本身



食品类

杂货店的屏幕快照。

可以在资源库中查看其来源。 在那里,用于修改食物图像的MouseEnter和MouseLeft处理程序非常有趣。

图片

旅行表格的屏幕截图。 (所有水体均经过测试,其名称不是真实的。)

图片

游戏截图

计划


  1. 为游戏制作客户端服务器
  2. 初级FPGA(FPGA)开发人员
  3. 通过网络摄像头进行人脸识别(我正在寻找可能有用的文献)
  4. 用ObjectListView替换常规ListView

在上一篇文章的结尾,我写道我想找到一份工作。 好吧,在9月,尽管在C语言中,我还是通过SNMP关闭了我的第一个TOR。

结论


这个项目已经变得很大,至少有一个理想的但非常不错的代码库,易于维护,在某些地方可能违反了SOLID的原理,但这是由于该项目很长。 另外,如果您是新手开发人员,并且正在寻找可以参与的项目,则可以对该存储库进行提交。 预期更改的列表可以在项目的README文件中找到。

我还要指出的是,我在C#开发人员的职业生涯中看不到任何前景,或者我希望更接近硬件,因此我尝试研究低级语言。

谢谢所有读到最后的人,任何对源代码的批评都将受到欢迎,我们将立即予以考虑。

Source: https://habr.com/ru/post/zh-CN479864/


All Articles