Bangumi娘的食用指南

Posted in Web

========================================= 源码地址:https://github.com/Kurarion/Bangumi-for-QQ 说明文档地址:http://www.irisu.cc/bangumi/ ========================================= Bangumi娘的食用指南 序章 简介及用途 简介 Bangumi娘是基于 CoolQ HTTP API 以及 Bangumi API 通过PHP及SQL实现的 用途 用于在QQ平台便捷地查寻条目,更新条目进度 基础指南 1.一切想要被回应命令的必须以英文输入下的做「~」或者「!」,诸如「~」「!」大概不会被受理…… 2.请注意参数之间以一个空格隔开 3.当你忘记了某些指令的全称,你可以通过使用~/!+首字母,Bangumi娘回复相关提示 示例: 4.指令是不区分大小写的,但是参数就不一定了,通过~user和~USER甚至更糟的~UseR都能实现同一个功能 示例: 5.指令的识别是逐字匹配,也就是说~user与~userxxxx效果等同,但空格就另当别论了,空格是分隔参数的唯一字符 6.请注意,Bangumi娘的祈祷可能会真正成为祈祷……可能的原因有: <1>不可抗力 <2>参数超出了预想 <3>维护 7.暂时不支持自动加群,因为种种原因… Bangumi娘QQ号: 1243000303 讨论群号: 477741212 点击链接加入群聊【bangumi】 指令手册 指令表示规则及术语 指令表示规则 <空> 代表没有参数 <参数X *> 代表第X个必填参数,<>内的*表示是必须参数 <参数X ~> 代表第X个可选参数 <参数X !> 代表第X个可以省略的参数 <参数X ^> 代表第X个可向上顺延一位的参数,这种情况只出现在~subject, ~up,~co,~save指令,为了便捷使用同一个条目ID,每当用户~subject [条目ID]一个条目就会自动保存当前条目ID,这样用户可以下次只需输入~subject而不需要参数就可以得到上一次~subject [条目ID]的结果,这样的话之后原本的参数可以向前顺延取代上一个参数的位置,这里的[条目ID]参数既是<参数X….

UE4 – 学习笔记之五 (总结二三四)

Posted in Unity3D&UE4

虚幻4的Engine模块 为了方便查看类关系,您可以点击这里在新标签中查看大图: 点我查看大图 Gameplay框架: Actor是一个游戏玩法实体,通常包含一个或多个Component,在游戏过程中可以静态地放置在Level中或通过Spawned动态生成,并支持多人游戏的网络复制。所有的Actor都从AActor类延伸出来,这个类是可重构游戏对象的基类。 需要注意的是,AActor有一个子类AInfo(不进行渲染而只进行信息的存储),之所以继承于Actor的原因大概是想利用Actor已经实现好的各种基本功能,尤其是网络复制,尽管AInfo不进行渲染,但很多也需要进行网络同步的 从某种意义上讲,Actor可以被认为是容纳特殊类型对象(称为组件)的容器。例如,一个CameraActor包含一个CameraComponent。但是这不是绝对的,功能也能通过自己的Actor对象的代码实现,但这明显不是一个最好的解决方法,因为要考虑重用性的问题,这样,各种各样的功能组件可以被用在各种的Actor上,如下图将CameraComponent附加到Pawn上 Pawn类那些可以由玩家或AI控制的所有Actor的是基础类(也继承于Actor)。Pawn是World范围内玩家或AI实体的物理表征。这不仅意味着Pawn决定了玩家或AI实体在视觉上的外观,还意味着它在碰撞和其他物理交互方面与世界的交互方式。Pawn代表游戏中玩家或实体的物理位置,旋转等。一个Character是一种特殊类型的Pawn,它有人型的走动,动画等功能。 它们之间的使用差别:如果游戏的主角们是各种各样的球体的,而玩家只能控制球体的滚动,这个时候只需使用Pawn就行,但如果游戏是一个写实的风格,需要一个人形的角色,直接使用Character会很省事,它已经集成了很多人形角色的功能和组件。 以下是官方的区别解释: 默认情况下,Controller和Pawns 之间有一对一的关系,即每个控制器在任何给定时间只控制一个Pawn,但是也能设置为一对多。此外,游戏过程中Spawned的Pawn不会被Controller自动Possess,需要自己增加逻辑调用Controller的Possess函数。 主要有两种子Controller: PlayerController和AIController PlayerController是由玩家进行控制的,AIController则是电脑计算的控制器 以下是Controller的官方描述 为了网络游戏中其它Player信息的传递,还有一个Info类:Player State PlayerState是为服务器上的每个玩家(或在独立游戏中)创建的。玩家状态被复制到所有客户端,并且包含关于玩家的网络游戏相关信息,例如玩家名称,分数等。 如下图所示的那样:PlayerState是被Controller所包含的,但是需要注意:一般AIController是没有自己可用的PlayerState的。 以上就是Pawn,Controller和PlayerState之间的联系 以下是PlayerState的官方解释: 接下来是游戏模式和游戏状态的类,顺带提及GameSession 有两个主要类处理关于正在玩的游戏的信息:Game Mode和Game State 即使是最开放的游戏也有规则的基础,这些规则组成了Game Mode(只在服务器上,一般只存放不变的量)。在最基本的层面上,这些规则包括: 参加游戏的Player和观众的数量,以及Player和观众的最大数量。 玩家如何进入游戏,其中可能包括用于选择spawn位置和其他spawn/respawn行为的规则。 是否可以暂停游戏,以及如何暂停游戏。 关卡之间的转换,包括游戏是否应以电影模式开始。 总的来说GameModeBase定义正在玩的游戏。它管理着游戏规则,得分,在这种游戏类型中允许哪些演员存在,以及谁可以进入游戏。 它只在服务器上实例化,并不会在客户端上存在。 在C ++ UGameEngine :: LoadMap()中为游戏玩法初始化关卡时,GameModeBase actor被实例化 。 此GameMode actor的类由在World Settings中设置的GameMode Override值或游戏的Project Settings中设置的DefaultGameMode条目确定。 这个类的主要内容即是管理游戏规则,defalut玩家Pawn的管理,玩家加入游戏的行为和初始化(HUD)。与GameSession不同,GameModeBase是上层的规则,它没有具体到Player的操作,GameSession则是一个具体的一次会话实例 比如:它的InitNewPlayer(): 1.在session上注册player GameSession->RegisterPlayer(NewPlayerController, UniqueId.GetUniqueNetId(), UGameplayStatics::HasOption(Options, TEXT(“bIsFromInvite”))); 2.Find a….

基于 CoolQ HTTP API 以及 Bangumi API 实现的 “Bangumi娘”

Posted in Web

不过暂时不加人 首先先给出这个精简的Tip(当前进度来说): 实现原理就如同标题,是基于酷Q的扩展http API APP实现的,其github项目:https://github.com/richardchien/coolq-http-api 【文档说明书】 正好,就在几个月前Bangumi番组计划(是专注于动漫、音乐、游戏领域,帮助你分享、发现与结识同好的ACGN网络)网站发起者 Sai 发布了Bangumi API,其github项目:https://github.com/bangumi/api ,借助两个强大的API我开始了 “Bangumi娘” 在QQ平台的部分Bangumi API 功能的尝试与实现。 其实一开始并没有一下”就决定是你了! HTTP API!”,还是在尝试了各种酷Q的SDK之后决定的, 当然也要感谢酷Q这个平台,尤其是其对docker的对应版本支持,虽然一些功能不是免费的,但是物有所值! 这之后,开始思考用来做两个API的对接,这么一想…我这做的好没技术含量…… 首先考虑了Python,毕竟linux也方便,但是…资源,时间有限,一直跑我的web也吃不消, 最后使用了PHP(毕竟涉及HTTP),果然PHP不错,能够胜任这种随叫随到的工作~ 那么,当前结果展示先: 1.查看用户 : 2.搜索条目: 3.查看指定ID条目的详细信息: 也可使用d和dd来显示更加详细的资料 省略…. 4.查看每日放送表(根据参数显示每天的节目表,默认当天) 大概就是这些了 … 以下是我的项目结构,也许你就明白我大概是如何实现的了 因为我会不断更新下去,源码什么的先不公布…如果您迫切想知道相关实现 请联系我 QQ: 597320012 / E-Mail: sirokuma@irisu.cc (wz97315@hotmail.com)

UE4 – 学习笔记之四

Posted in Unity3D&UE4

为了方便查看类关系,您可以点击这里在新标签中查看大图: 点我查看大图 AGameModeBase: GameModeBase定义正在玩的游戏。它管理着游戏规则,得分,在这种游戏类型中允许哪些演员存在,以及谁可以进入游戏。 它只在服务器上实例化,并不会在客户端上存在。 在C ++ UGameEngine :: LoadMap()中为游戏玩法初始化关卡时,GameModeBase actor被实例化 。 此GameMode actor的类由(按顺序)URL?game = xxx,并在World Settings中设置的GameMode Override值或游戏的Project Settings中设置的DefaultGameMode条目确定。 这个类的主要内容即是管理游戏规则,defalut玩家Pawn的管理,玩家加入游戏的行为和初始化(HUD)。与GameSession不同,GameModeBase是上层的规则,它没有具体到Player的操作,GameSession则是一个具体的一次会话实例 方法: InitNewPlayer(): 在session上注册player     GameSession->RegisterPlayer(NewPlayerController, UniqueId.GetUniqueNetId(), UGameplayStatics::HasOption(Options, TEXT(“bIsFromInvite”))); Find a starting spot,找到起始点 Set up spectating,设置观战(如果是观众) NewPlayerController->StartSpectatingOnly(); Init player’s name NewPlayerController->PlayerState->SetPlayerName(); InitGame(): 通过World创建了GameSession,这里说明一点:UWorld::SpawnActor在Create新Actor后会将其纳入指定的Ulevel之下(根据SpawnParameters参数,默认在CurrentLevel) AActor* const Actor = NewObject<AActor>(LevelToSpawnIn, Class, NewActorName, SpawnParameters.ObjectFlags, Template);     LevelToSpawnIn->Actors.Add( Actor );     LevelToSpawnIn->ActorsForGC.Add(Actor); 而且SpawnActor只在World中,而不在level中,更不在Actor中,原因是Actor是存在一个Outer的这里一般是Level(大概也能是一个Component),Level中有Actor的直接索引,World则是通过Levels的遍历访问Actor的,因此New Actor不必在World中注册 InitGameState():….

一个图片剪刀小工具

Posted in Win

下载地址: 图片剪刀.rar   github项目地址: https://github.com/Kurarion/Image-Cut 先放在这里,后续补充源码和相关问题: 当然您可以直接使用它,不过他需要vc++ 2015 运行库支持 以下是它的功能的简单缩影:

UE4 – 学习笔记之三

Posted in Unity3D&UE4

这次在二的基础上分析了UWorld,ULocalPlayer,ULevel的部分成员 先上总体关系图 为了方便查看类关系,您可以点击这里在新标签中查看大图: 点我查看大图 以下是具体的分析 UWorld类: World是代表地图或沙箱的顶级对象,Actors和Components 将存在并被渲染。 一个世界可以是一个单一的Persistent Level,其后可选地跟着一个存着 streaming levels 的list,可以通过volumes and blueprint功能加载和卸载,或者可以是由世界组织组成的层次集合。 在独立的游戏中,除了在目标和当前世界同时存在的无缝区域转换期间,通常只存在一个World。在编辑器中存在许多World:正在编辑的关卡,每个PIE实例,每个具有交互式渲染视口的编辑器工具等等。 ActiveGroupActors: 当前活跃的Actor数组 AudioDeviceHandle: 处理这个World的有源音频设备 AudioVolumes: 控制Volumes内部和外部的Audio效果的Tset 相关知识:更多参考 Volumes:它游戏中不可见,仿佛类似一个包围盒并有overlap的触发函数,但它是一个独立的Actor,可以直接放在Level中,而且不止是overlap的功能,它也可以acting as a collision surface,从而阻止玩家进入Volumes。 它有很多子类 bAggressiveLOD: 加强LOD效果,当帧数低于DesiredFrameRate太多时 bBegunPlay: 是否Actor的BeginPlay()已经被调用 bDropDetail: 去除高细节的Actor,当帧数低于DesiredFrameRate太多时 bIsDefaultLevel: 是否默认的Level bIsTearingDown: World是否处于销毁状态 bPlayersOnly: 当世界tick时,只更新玩家,+Pending则延迟一帧后执行 Layers: World中Actor引用的所有图层列表 bPostTickComponentUpdate: 表示在世界Tick期间,我们执行”脏”组件的最终组件更新(在PostAsyncWork和效果物理场景已运行之后) MyParticleEventManager: 粒子事件管理器 NetworkManager: 网络管理器 PersistentLevel: 持久的Level:包含世界信息,默认画笔和在游戏过程中产生的Actor 一开始就加载进World StreamingLevels: 后续动态加载进World,也可设置成alwaysloaded或者使用BP自定义加载时机 Levels: World中所有的Level索引 TickGroup: 当前的Tick组….

UE4 – 学习笔记之二

Posted in Unity3D&UE4

这是本节学习的整体框架,图中只列出了一部分关键函数和少量的相关解释   为了方便查看类关系,您可以点击这里在新标签中查看大图: 点我查看大图 【您也可以在下方查看大图和编辑它】 接下来将依次分析AActor,APawn和AController   相关知识: 虚幻类的命名前缀 虚幻引擎提供了在构建过程中为您生成代码的工具。这些工具有一些类命名的期望,如果名称与预期不符,将会触发警告或错误。下面的类前缀列表描述了这些工具所期待的。 从Actor(Class AActor)派生的前缀要为A,例如AController。 从Object(Class UObject)派生的前缀要为U,例如UComponent。 Enums类以为E前缀,例如EFortificationType。 Interface 类通常以I为前缀,例如IAbilitySystemInterface。 Template 类以T为前缀,例如TArray。 从SWidget (Slate UI)派生的前缀要为S,例如SButton。 别的一切都以F为前缀,例如FVector。 Engine/GameFramework/Actor: AAcotr: Actor是可以在关卡中放置或产生的Object的基类。 Actor可能包含一系列ActorComponents,它们可以用来控制actor如何移动,如何渲染等等。Actor的另一个主要功能是在播放过程中通过网络复制属性和函数调用。 AutoReceiveInput属性:决定哪个player控制,其中TEnumAsByte是以类型安全的方式将枚举值存储为字节的模板,实际上作用就是在enum之上封装了安全性的一层,具体的类说明。     相关知识: 看到上面有UPROPERTY(EditAnywhere, Category=Input) 这里是UE4的反射机制:注册这个属性到反射系统,使对其可见,即是在编辑器中显示这个属性,并能够对该属性进行其他管理,比如垃圾回收(GC),【它根据root set(Singleton,管理着所有有效的索引)来进行垃圾回收操作的,通过UPROPERTY()宏使root set保存有这个属性的引用,每次GC时就不会将其视为垃圾处理】 EditAnywhere参数说明表示该属性可以通过属性窗口,原型和实例进行编辑,并指定所在的Category为Input,也就是说可以在UE4编辑器中这个Actor的详细信息中的名为”Input“的类目中找到这个属性。 引用官方说明:反射是程序在运行时检查自身的能力。这非常有用,是虚幻引擎的基础技术,为编辑器,序列化,垃圾收集,网络复制和Blueprint / C ++通信等许多系统提供动力。然而,C ++本身并不支持任何形式的反射,所以虚幻拥有自己的系统来收集,查询和处理关于C ++类,结构体,函数,成员变量和枚举的信息。我们通常将反射称为属性系统,因为反射也是图形术语。 类似的还有: UCLASS() – 用于告诉Unreal为一个类生成反射数据。该类必须来自UObject。 USTRUCT() – 用于告诉Unreal为结构生成反射数据。 GENERATED_BODY() – UE4将其替换为为该类型生成的所有必需的样板代码。 UPROPERTY() – 使用UCLASS或USTRUCT的成员变量作为UPROPERTY。UPROPERTY有很多用途。它可以允许变量被复制,序列化和从蓝图访问。它们也被垃圾收集器用来跟踪UObject的引用数量。 UFUNCTION() – 启用UCLASS或USTRUCT的类方法作为UFUNCTION。UFUNCTION可以允许从Blueprints中调用类方法,并用作RPC等等。 它们的说明符表如下: UCLASS说明符列表 UPROPERTY说明符列表 UFUNCTION指示符列表 USTRUCT说明符列表 是否允许此Actor在收到BeginPlay事件之前进行tick的开始。….

UE4 – 学习笔记之一

Posted in Unity3D&UE4

先贴上原文:使用 C++类向导 创建 LightSwitchCodeOnly 类 学习使用中完全有问题:原因可能是文档太旧,更新频繁也可能UE4官方并不重视C++ 不过蓝图的确方便,但毕竟C++才是本质,还是有必要了解的 不多说废话了…下面是我遇到的问题以及相对的解决方法【我使用的是4.18.3】 首先,当我已经完成了仅使用蓝图完成这个可开关灯的类时,已经迫不及待想要尝试使用C++完成这个任务 第一次使用发现这个编码的确与众不同(与Unity3D相比) 比如 UCLASS() 这样的宏…等等,这被称为反射机制,与之相关的更多的资料请参考此文章结尾的参考 以上即为官方文档中的说明。【注意:在一切问题的开始一定要先检查拼写错误…血的教训】 也许你的Visual Studio并不能好好地工作,你可以参考官方的建议: 为虚幻 4 设置 Visual Studio 当然,也有XCode的相关配置指导。 但是即使我跟着指导完成了设置,似乎并没有我想象中的那样完美. 问题一: #include “Components/PointLightComponent.h” #include “Components/SphereComponent.h” 没错,我早该想到的:也许是这个原因,这个组件没有被include 这就是与它们相关的种种错误的根源 class UPointLightComponent* PointLight1; class USphereComponent* Sphere1; 请将它们添加到LightSwitchCodeOnly.h中 问题二: LightSwitchCodeOnly.h中: UFUNCTION() //void OnOverlapBegin(class AActor* otherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool BFromSweep, const FHitResult& SweepResult); void OnOverlapBegin(class UPrimitiveComponent* HitComp,class AActor*….

MagicaVoxel – 像素风格的建模工具

Posted in Modeling

MagicaVoxel(点击访问MagicaVoxel的官网,在那里你可以下载它的最新版本) 本人接触这个迷你却精悍的建模工具还是今年(2018)的寒假,在Unity3D的一个教程中了解并第一次使用了它,即使你并不是一个专业的模型师,但这仍是一款容易上手的软件。 Unity3D – 一个小小的游戏 在这篇文章里的游戏Demo就是使用了MagicaVoxel制件的简易模型(没有绑定骨骼,即它只能静态地运动),当然上述的REME模型制件也只是我的现学现卖…因此我只上传我制作好的reme.vox(MagicaVoxel自身的模型扩展名),关于我参考的Unity3D教程,你可以在文章的最末端”参考”中找到。教程中也有怪物的制作,我自己尝试性地创作了两个并加入了游戏Demo中。相应的.vox也会上传分享(由于其中一个过于简陋就不再放出了…)。 先来展示一下: reme.vox:下载 untitled.vox:下载 当然,MagicaVoxel的强大远不只这些… 通过视口右上角的World,你可以进一步地扩展你的模型,这样便能创建更大的模型:通过创建一个新立方体区域或者直接选中模型复制调整(平移,旋转,镜像…)…以上就是一个例子,但这里并不能直接编辑你的模型像素,选中一个模型(直接点击,立方体边框变为白色即为选中)点击视口右上角Edit,会出现以下界面: 此时便能开始你的变更了,同时其他的模型也会可见以供你实时参考,但它们目前是不可编辑的,也就是说一次只能对一个模型编辑。 MagicaVoxel还支持渲染:点击Render即可看到 这里也有很多参数可以进行调整,视口右上可以调节输出的分辨率,最后点击视口左下角的”照相机”图标可以将当前视口(可能相对你设置的分辨率显示不全)以你设置的分辨率导出为一张图片。   也许你也可以利用它创作一个二维的图片,就比如我(水平等于入门之前的画师)创作的阿斯托尔福 我保存了不少进度版本: 它看起来完全像一个毫不负责的涂鸦…现在的我也这样认为。这里我为了作画,事先将整个立方体用一个颜色填满,而我的作画区域只有最上面的一层。我认为这样比较方便,当然,你可以随时移动某一块区域 按照以上 1.选择区域  2.选择区域的方式  3.操作变换,也许不用我细说。 它看起来毫无变化…也许只是一个以防万一的副本(我忘记了) 进一步增加头部细节 完善头发,在此保存一个可能的分支以应对可能的更改 好像没有变化…总之多保存是一个好习惯 完善马尾~ 没错,右手显得太小了,更新它~看来一开始先画头部是一个不错的方法… 一个看起来还可以的雏形,和上一个版本的区别:增加了身体的光影效果,将本该有阴影的地方根据材质光加深 增加了头部的光影效果 完善各种缺陷…删除了最上层除了人物的像素块… 这里跨度巨大…因为各种原因没有创建进度副本。 大体上是,扩展了下半身和左半披风(最后渲染阴影用到),并且删除了大部分的无关像素块 最后渲染: VOX文件:afu11.vox     参考: 从零开始三小时速撸一款雷姆小游戏Unity3D全过程    

OPENWRT明月版-配置校园IPV6穿透

Posted in Other

不知是哪里出了问题,官方原版的OpenWrt-CC版本是原生支持ipv6穿透的,为图方便直接使用了明月的op固件,但是默认支持的ipv6穿透没有了,这持续了一段只有ipv4的日子。如今终于找到了正确的配置方法了: 首先使用Winscp连接你的路由器,如下编辑:  这里就很奇怪:明明luci里面有wan6这一配置,但dhcp配置文件里之前并没有”wan6″任何字眼… 不过修改前最好要备份。 之后便可重启路由器了。 我查看了一下luci里的接口: LAN终于获取到了ipv6地址~ 然而试着检查了一下,发现并不能访问ipv6网址。。。 查看WAN,发现DHCP设置多了一层 修改上一层的”IPV6设置“全部禁用,保存&应用…然后再试一下~OK! 以下是相关的其他的一些配置: 至此便能在夜间通过ipv6搭配ss(ipv6)愉快地上网了~