小游戏升级

 

昨天上午发布的小游戏(同理我是一个传送门)☜更新了,此次更新的内容如下

——修复小概率下,方块挪到屏幕边缘时程序崩溃的问题;

——新增“W”和“D”键控制小方块移动功能

——新增游戏记录的功能,从此刷高分有凭有据~(游戏记录和该程序在同一个目录中,名字是“score.txt”

——新增“登录”界面,好友比拼更方便

——修复子弹命中时怪物的死亡逻辑(死亡还有个什么逻辑?但是不知道大家注意到没有,当子弹位于怪物左边一点的时候,即便没和怪物接触,怪物也会死亡)

——修改界面刷新率,但是即便这样,屏幕有时候也会闪烁

——修改方块移动逻辑,方块移动更加平顺,并提高了方块的移动速度,要打怪怎能不快点?

——修改发射子弹逻辑,支持连发,感觉更爽

——死了之后重新再来,今儿我就不信刷不了记录了

——新增作者贱贱的问候

——开放源代码,做你们的外挂去吧

捕获

感谢帮助发现Bug的玩家 X镜同学。

|我是传送门——>>这是下载链接|

|我是传送门——>>这是源代码|

忙了半个晚上+一个上午,终于写完了一个小游戏

忙了一整个晚上,终于搞定了一个弹幕游戏(不是视频)

语言C#,此处是下载地址。欢迎大家批评,玩起来的时候我的感觉是有点卡(这不是因为机子慢或者资源占用高,因为我把刷新率降低到10帧了,至于为什么做,我也不知道~)。

按左右箭头控制左右移动,空格键发射子弹,ESC退出

当然我还有安装包,想要的在评论里放邮箱(当然我觉的没人想要安装包……)

随后我会在ghithub上发布我的代码

|我是传送门——>>>>小游戏 |

【教程】关于C#中调用Cpp编写的dll

dll文件
dll文件用的图片

前几天写了一篇文章,讲了如何建立dll以及如何调用dll,文章中使用的是C/C++,今天就说说怎么使用C#调用C++的dll。


首先建立一个C#工程。然后再原文件夹中的Debug文件夹中放入我们做好的dll,这里我们使用前一篇文章中建立的dll:“basic_dll.dll”,然后就是写代码。

在C#中如果要调用dll,就要using一个空间:System.Runtime.InteropServices,包含进来就好了。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

这里包含进了一些无关的东西,不用管它,我一建立工程就有这些了,懒得删-_-……

如果要载入dll,就要在声明方法之前加上


[DllImport("basic_dll.dll", EntryPoint = "add",CallingConvention = CallingConvention.Cdecl)]

其中,“basic_dll.dll”是我们要引入的dll的名字,要么它在程序的同一目录下,要么在系统中已经注册过,后面的“EntryPoint”是dll的入口函数,也就是我们要导入的函数名称,再后面的CallingConvention是调用约定,如果不加上这个调用约定的话,会导致编译时出现”对 PInvoke 函数“xxFunction()”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配“这样的错误,原因一会说。

然后的然后就是声明一下我们的函数了,在这里同样只有一个add(int, int)   -_-

一下是一段简单到要死的源代码


namespace Csharp调用
{

class Program
{
[DllImport("basic_dll.dll", EntryPoint = "add",CallingConvention = CallingConvention.Cdecl)]
public static extern int add(int a, int b);

static void Main(string[] args)
{
Console.WriteLine(add(3, 5));
Console.ReadKey();
}
}
}

这段代码极其简单以至于我就跳过解读了,然后说说关于刚才提到的堆栈不对称的问题。

众所周知,在c++WIN32程序中有三种calling convention(调用约定):__cdecl, __stdcall, __fastcall,默认为__cdecl。而c#中默认为CallingConvention =CallingConvention.Winapi,如果不对调用约定进行说明的话,会出现调用约定不一致的错误。当然,在dll中,要传出的方法应该放在extern ”C“中,不然会因为C++更改函数名而导致调用错误。