黑翅🔯 黑之翅膀
Minecraft观察者
关注数: 194 粉丝数: 1,828 发帖数: 16,636 关注贴吧数: 38
时隔多年,我找回了制作游戏的初衷。 我是一个敏感的人,我会经常思考自己做过的事,将发生过的事情互相比较,尝试用这种方法推出新的策略,和自我改进。 我在贴吧里的签名是:回顾历史是为了减少未来出错的概率。 我在很小的时候就有制作游戏的梦想,尽管我走了很多弯路,但心里还是默默记住我未来要做游戏这个想法,而且我坚信未来我会达成这个梦想。没错,我做到了,在童年的我觉得不太可能的想法,今天还是做到了。 做游戏跟编程的专业程度无关: 我当时的想法是:我不会写代码,我就做不了游戏..... 我一直尝试去接触代码,但很显然,那时稚嫩的我~啥也不是。在那个年份,做游戏更是会在家里被贴上:叛逆、不务正业、玩物丧志、游戏上瘾、浪费清楚..这种负面评价,所以我想学编程的路,早早就被扼杀在小时候了,被强迫签了平面设计的门课,在描线、构图、比例、排版的中逐渐迷失了自我~~以至于现在做事,都会先过一层画面中思维枷锁。而我还是被蒙在鼓里,甚至没意识到我被限制了。 所以我在早期就是一个以美术起手的妄想自己要做游戏的平凡人~只要有机会,我就会偷偷接触一下代码,虽然看不懂,但我发现我的逻辑思维比较好!我能很快的在很短的时间内,想出很复杂又互相关联的游戏玩法,包括细节。(我想说,我到现在还是用着这项能力,只是在我实现想法的过程中,执行上比以前更快了) 噢,我现在是有编程基础的,我也发现了我说话的方式都变了,但尽管如此,它对“我要实现玩法”的步骤上,只起到了细微的作用。因为我大部分时间都只是花在敲键盘上,而不是更快地在实现我的玩法。 原来有策划这种东西? 以前我并不知道有策划这种职业,我以为一个游戏就只需要程序员就能搞定。后来接触到更深入的圈子,我才知道还有策划这种职业,我突然眼前一亮,这不就是我吗?于是我又研究了一些策划,自学了一点点,看看跟我想象中的过程有什么区别。 然后尝试着开始写更详细的游戏内容,游戏交互逻辑,各种游戏流程之间的转换,交互,更详细的数值等等,渐渐地我发现了好像策划也跟我想实现游戏的过程,差别越来越大! 经过对比我发现,策划是一个偏向于社交属性的这么一个职业,也就是说属于工作流程内部的,跟制作游戏里的其他工作岗位对接的这么个活....把所有的动作都列出来,每个游戏步骤都细化一下,然后交给美术、程序、音乐。每个地方都管一下,确实挺像我在做的事,但我发现,这也还不是我自己想象中的工作流程。 我们可以假设一下,抛开人和人之间的隔阂,默契程度,理解程度,认知水平上的不同,共用一个大脑,我自己写完了策划,然后再根据策划案把游戏做出来之后,我傻了....这个游戏....好无聊....是的,当我花费了大量时间在这些更细的工作流程上,并没有对我实现游戏玩法有什么太大的帮助,而我却一直在细化自己的工作,在实现游戏玩法的时间是显得越来越漫长!而这些浪费掉的时间,是真的真的没有在玩法上得到任何帮助!因为,游戏是“交互的艺术”。 当我意识到这一点,突然就清醒了,我以前用无代码引擎快速制作的游戏、我在Minecraft服务器里用已有的功能搭配玩法,我在纸上画了一些图案并让周围的人按照指定的规则,一起参与进来并体验到快乐,这才是我一直在做的事! 玩法优先! 至此,我直接开始放飞自我! 说话方式,不再归一化: “你的金币不足!购买失败!” → “呀,钱包空空,两手空空,快去赚钱吧” (保证表达的同时,更人性化。) [血条][体力][魔法值][饱食度] → [节操][疯癫][大喇叭][肚子疼] (毫无节操,被打败了!得分:0) [排列整齐的菜单选项] → [随便倾斜的摆放] (乱中有序,绝不统一) [钢琴、吉他、大提琴、和弦、情绪] → [黑兔卖瓜瓜里的瓜~咕咕瓜呱呱呱] (各种奇奇怪怪的音色,让你发现音乐师在搞事情。) [平滑镜头、动态模糊、广角、透视] → [摄影师点了点头,顺便给你来个特写] (镜头不再是镜头,而是可以拟人,可以有表达,可以代表观众) 以上是我的举例,在制作游戏之前,我的想法总让人琢磨不透,游戏流程不按套路出牌,画面内容有时候非常夸张,文字描述上采用的方式很幽默。但如今,我确实失去了,我再也没有那么随便的想法,我被规定限制了,想法上多了好多枷锁,我深知这种思维会影响到我的游戏品质和玩法乐趣,但尽管我发现了这个问题,在制作的时候还是会按照归一化的方式进行制作,我....回不去了... 然后我痛恨自己的错误,并在这里记录下来: 1、在美术上过度专注于表现颜色的运用技巧、风格、美观,除了好看,没有起到任何表达和交流的....内涵。 (对实现玩法没有帮助,本末倒置啊本末倒置...) 2、专注寻找音色,模仿市面上常见的、流行的风格,过度在意编曲的专业性,要做超好听,忘记了实现游戏中满足情感表达的部分。 (对实现玩法没有帮助,本末倒置啊本末倒置...) 3、细化游戏内容,并且经常用现有的游戏作为参考对象,做出了模板化流水线公式的游戏流程,导致自己锁死了设定,缺乏了与玩家深入交流的步骤,遇到与设定相违背的玩法需求是,会被现有的设定框架阻碍了允许扩展思路的方向,以至于游戏流程过于死板,缺乏共情能力。 (对实现玩法没有帮助,本末倒置啊本末倒置...) 4、光线追踪、阴影、法线、贴图、纹理、环境光遮蔽等等细节,以至于在每次创建特效都要花上大量时间去追平现有3A游戏中的大众审美的程度。却忘了特效是作用在交互中,只有细微吸引眼球的作用。 (对实现玩法没有帮助,本末倒置啊本末倒置...) 5、在动作细节上,过于追求动作的流畅度,帧动画会细化到每一个像素点的运动模拟都手工逐帧画出来,尤其是像素画,要做到美感,需要耗费巨量时间。(个人结论:像素画画得好看的游戏,99%都不好玩!)一味的追求单独某个职位的上限值,只会让自己离实现游戏玩法的终点越来越远,本末倒置啊本末倒置... (对实现玩法没有帮助,本末倒置啊本末倒置...) 6、在编程中,过度执着于最优解,最流程,代码最短,效率最高,而忽略了游戏玩法实际体验的乐趣,也忽略了实现玩法的可行性。导致花费大量时间去做了一个最完美的功能之后发现,似乎这个功能也不是很好玩,或者放在某些地方可能很不合适,很可能会想抛弃这个功能,但又舍不得自己写了这么久的代码,造了这么好的轮子。应该把重心放在造10个轮子中,挑一个最合适的进行细化打磨,切记不要一步到位! (对实现玩法没有帮助,本末倒置啊本末倒置...) 7、过度依赖引擎的功能...这个我还好,因为我用Godot到目前练习实际时长只有一“坤”年。(鸡鸡),挑引擎的毛病还是比较小的,能完全满足自己使用需求的引擎,只有自己制作的引擎可以做到。能满足所有人的引擎一定是个烂引擎! 这话可能说的有点严重,但我个人会保留这个观点。原因,如果引擎能满足所有功能,意味着门槛一定会降低,门槛降低意味着人人都能做游戏,而且不需要系统性的学习就能掌握,鄙视链一定会冒出来的!一定会有人认为这是个很低端的引擎,人就是这种生物~~,一方面需要引擎功能齐全,一方面又急着展示自己的技术力,就会陷入这种自我内耗的状态,我的意见是:不管你用什么引擎,我都不会鄙视你,因为站在玩家角度的我,只看游戏是不是足够有趣。 综上所述,自我反思、自我修正、自我成长的结论。 我用无代码引擎制作的游戏,花了一年时间,1年时间都在处理美术、逻辑、玩法设计、交互设计、音乐、音效。而且还是很低成本的劣质制作,要做出我想做的游戏类型,实现完整内容需要至少一年时间。 现在转到Godot引擎,我还多了一道工序,就是要自己写代码,和面对引擎的各种BUG折磨,还有游戏BUG的折磨,时间被延长了N倍。 各游戏制作人的水平也在逐步提高,相较于以前,就需要花更多时间在游戏的视听效果上,时间再一次延长! 如果我要彻底地为我的游戏玩法服务,我必须强制自己抛开以上这些精神枷锁,好让我自己回归到制作游戏最初的那种纯洁的想法 —— 我在用游戏,跟玩家交互!
[MC1.11.2]躲猫猫插件Kenshins Hide and Seek 所有可用方块 Kenshins Hide and Seek v1.7.6.jar1.11.2 版本我逐个尝试出来的可以显示的方块。 以下这些物品都是可以显示的,具体能不能选择还需要自己测试一下: KenshinsHideAndSeek 指令是: 【添加可变方块】/hs map blockhunt blocks add 地图名 <方块英文ID> 【查看所有可变方块】/hs map blockhunt blocks list 地图名 如果需要翻译的话,可以在后面输入井号 #中文名 做注释,这样不会影响到插件正常使用。 blocks: 下面都是 <方块英文ID> 比如:/hs map blockhunt blocks add home BEDROCK ------------------------------ - ACACIA_FENCE - ACACIA_FENCE_GATE - ACACIA_STAIRS - ACTIVATOR_RAIL - ANVIL - BEACON #基岩 - BEDROCK - BIRCH_FENCE - BIRCH_FENCE_GATE - BIRCH_WOOD_STAIRS - BONE_BLOCK - BOOKSHELF - BREWING_STAND - BRICK_STAIRS - BURNING_FURNACE - CACTUS - CARPET - CAULDRON - CLAY - COAL_BLOCK - COAL_ORE - COBBLESTONE - COBBLESTONE_STAIRS - COBBLE_WALL - CROPS - DARK_OAK_FENCE - DARK_OAK_FENCE_GATE - DARK_OAK_STAIRS - DAYLIGHT_DETECTOR - DAYLIGHT_DETECTOR_INVERTED - DEAD_BUSH - DETECTOR_RAIL - DIAMOND_BLOCK - DIAMOND_ORE - DIODE_BLOCK_OFF - DIODE_BLOCK_ON - DIRT - DISPENSER - DOUBLE_PLANT - DOUBLE_STEP - DOUBLE_STONE_SLAB2 - DRAGON_EGG - DROPPER - EMERALD_BLOCK - EMERALD_ORE - ENCHANTMENT_TABLE - ENDER_PORTAL_FRAME - ENDER_STONE - END_BRICKS - END_ROD - FENCE - FENCE_GATE - FLOWER_POT - FURNACE - GLASS - GLOWING_REDSTONE_ORE - GLOWSTONE - GOLD_BLOCK - GOLD_ORE - GOLD_PLATE - GRASS - GRASS_PATH - GRAVEL - HARD_CLAY - HAY_BLOCK - HOPPER - ICE - IRON_BLOCK - IRON_FENCE - IRON_ORE - IRON_PLATE - JACK_O_LANTERN - JUNGLE_FENCE - JUNGLE_FENCE_GATE - JUNGLE_WOOD_STAIRS - LADDER - LAPIS_BLOCK - LAPIS_ORE - LEAVES - LEAVES_2 - LEVER - LOG - LOG_2 - LONG_GRASS - MAGMA - MELON_BLOCK - MOB_SPAWNER - MOSSY_COBBLESTONE - MYCEL - NETHERRACK - NETHER_BRICK - NETHER_BRICK_STAIRS - NETHER_FENCE - NETHER_WARTS - NETHER_WART_BLOCK - NOTE_BLOCK - OBSERVER - OBSIDIAN - PACKED_ICE - PISTON_BASE - PISTON_STICKY_BASE - POWERED_RAIL - PRISMARINE - PUMPKIN - PURPUR_BLOCK - PURPUR_DOUBLE_SLAB - PURPUR_PILLAR - PURPUR_SLAB - PURPUR_STAIRS - QUARTZ_BLOCK - QUARTZ_ORE - QUARTZ_STAIRS - RAILS - REDSTONE_BLOCK - REDSTONE_COMPARATOR_OFF - REDSTONE_COMPARATOR_ON - REDSTONE_LAMP_OFF - REDSTONE_LAMP_ON - REDSTONE_ORE - REDSTONE_TORCH_OFF - REDSTONE_TORCH_ON - RED_NETHER_BRICK - RED_ROSE - RED_SANDSTONE - RED_SANDSTONE_STAIRS - SAND - SANDSTONE - SANDSTONE_STAIRS - SAPLING - SEA_LANTERN - SIGN_POST - SKULL - SLIME_BLOCK - SMOOTH_BRICK - SMOOTH_STAIRS - SNOW - SNOW_BLOCK - SOUL_SAND - SPONGE - SPRUCE_FENCE - SPRUCE_FENCE_GATE - SPRUCE_WOOD_STAIRS - STAINED_CLAY - STONE - STONE_PLATE - STONE_SLAB2 - TNT - TORCH - TRIPWIRE_HOOK - VINE - WATER_LILY - WEB - WOOD - WOOD_BUTTON - WOOD_DOUBLE_STEP - WOOD_PLATE - WOOD_STAIRS - WOOD_STEP - WOOL - WORKBENCH - YELLOW_FLOWER
【Godot4】扇形检测范围原理 已知扇形为圆的一部分,圆的半径=扇形的边长。 多边形Polygon2D系列,可以实现扇形。 首先以Vector2.Zero ,【坐标x0 y0 为第一个点。】 然后设定半径的长度,【设置坐标X=半径长度 Y=0。为第2个点】(既Vector(视野距离,0)) 然后用Vector向量中的rotated方法,获取当前坐标被旋转一定角度后的新坐标。 Vector2 rotated(angle: float) const 返回将这个向量旋转 angle 的结果(单位为弧度)。另见 @GlobalScope.deg_to_rad()。 #------ 新的向量 = Vector(半径,0).rotated(弧度) #------ 旋转后的【新向量 是第3个点】 此时我们已经得到3个顶点,Polygon2D就可以连成一个三角形。 扇形其实就是由多个三角形组成,现在我们用for循环去建立更多旋转一定弧度的向量位置,就可以实现扇形。 而视野的角度,就是在弧度那设置的。弧度转角度的方法名是:deg_to_rad(角度) 角度总共有360度,所以 for i in 角度:循环出来的点就是一个扇形。 由于扇形是从0°开始展开的,所以可以根据怪物的默认朝向,将Polygon2D的旋转角度 = 视野角度的一半 此时扇形就会朝向X的正方向,此时自身的转向就会带动视野旋转了。 由于是生成的,所以不必太担心性能问题。 最后: 如果角度很大,如180度,会创建180个顶点,如果不喜欢弧度太光滑,想减少一些顶点的话: 在for循环下面加入判断: if i % 10 == 0: 这可以限制只在每个十进制中绘制一个顶点,这是取余的方法。 if i % 2 == 0: 获取的i是双数,其中2个数有一个被整除。余数为0 %是求余运算符。 if i % 10 == 0: 获取的i是每10个数中有一个被整除。余数为0
【Godot】菜单、UI、背包中的物品移动的逻辑和思路 一个是界面上可视化的移动,然后可视化的界面控制逻辑的运行,由逻辑改变程序中库存的变化。原理上其实就是一张图的事情,但是实现起来是有点麻烦,以及很多教学视频都是很长很长出好几期视频都说不完。 我个人是不喜欢用库存的,因为Godot的变量基本可以装下所有的东西,所以本质上对象节点什么的都只是一串数字。深入研究之后才发现原理这么简单。节点上的信号检测我用的是: gui_input(event: InputEvent) Slot(槽位)我是做的子节点,然后批量生成背包格子的。然后因为我是直接做的3页背包,每页18,所以很暴力的直接拆开分别For循环了18次。 每个格子都有脚本,脚本里记录Slot的号数。 所以生成出来顺便跟着号数变化,记录每一个槽位的号数。 接着给他们都加入信号。 #制作Slot操控信号: for num in 54: BagSlotList[num].gui_input.connect(Click.bind(num)) 我这里有54个格子,所以针对54个格子生成了54个信号,并且绑定了参数,用来提示当前鼠标点击的是哪个槽位。 #信号名.connect( 函数名.bind( 传递的参数 ) ) func Click(isInput,Slot): 第一个参数 isInput,是信号自带的参数位置,Slot是我自己设定的参数传递。 所以我会得到两个参数: 鼠标操作 和 槽的号数 默认信号是会传递鼠标的所有信号的,但我只需要鼠标左键点击的时候判断逻辑。 if isInput.is_pressed() and Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): 下面就是被控制之后的逻辑了。。。 后面就是基本操作了。判断槽是否有物品、判断手上是不是有物品、判断物品是否相同类型。 库存那边,我直接用的Array数组来存对象。 这里的对象都是item格式,item也是我自己做的一个单独的节点,里面记录者物品的种类、数量、名称、.....等等 同时 item 其实属于菜单中的物品, 我还会写个转换,让【菜单物品】可以转换成 【掉落物】,相反也有。 这是方便主角在地上捡起物品,又可以从背包把物品扔出去。 最后就基本的逻辑了: 移动物品的时候,点击的物品会被移动到【正在手持的物件】的节点中,并且这个节点会跟随鼠标移动。 $PickupItem.global_position = self.get_global_mouse_position() - Vector2(12,12) 点击的物品节点就会被移动到这个Pickupitem节点里。 过程也很简单 点击物品的时候: ClickSlot.remove_child(Item) <<删除 当前点击槽位的 物品节点 (remove_child 不会真的删除,只是隐藏了) $Panel/PickupItem.add_child(Item) <<在【正在手持的物件】添加 物品节点,物品就被移动过来了 move_node = Item <<用一个变量记录这个物品,方便逻辑判断【当前已持有节点】 上面是界面上的变化,但是库存还没变,所以库存也要变一下。 Pick_up_item = Bag[Slot] #【正在手持的物件】 = 【当前槽位的物品】 Bag[Slot] = null #【当前槽位的物品】= 空 接下来就自由发挥了,原理就是这样。 当然背包还涉及很多判断,比如拾取掉落物,掉落物会转换成物品形态,然后再判断库存中是否有空位可以存放物品,如果有空位,就加入到库存,顺便在界面中创建新的物品节点,然后把物品数据同步,再刷新界面显示。 数量叠加 和 位置交替: 则是判断物品的某些属性是否一致,名字一致ID一致之类的,一致的话就让槽位中的物品数量叠加上去再删除手上的那个物品节点。 如果更复杂一些就有数量限制,当两个物品叠加数量超过64的时候,就用两个物品叠加的数量减去64。 (A = 手持物品 B = 槽位中的物品) (A+B)- 64 = 叠加后剩余的物品数量 A的数量 = 64 B的数量 = 剩余值 此时可以不删除B,让B继续待在手持物中。 物品交替则是排除上面状态后的第二个状态: 槽位.remove_child(B) 删除B节点 持有位.remove_child(A) 删除A节点 持有位.add_child(B) 把B放入手持物品中 槽位.add_child(B) 把A放入槽位中 这个库存里就麻烦点,库存里不能直接删掉,所以还需要造个临时的变量来存放被挪出的B。 A - B 1. - A B 2. B A - 3. B - A 交替有两种方式,一种是交替时两个物品互换位置,另一种是手跟槽位中的物品交换(手上还拿着) 逻辑里建议直接判断库存,可以避免因卡菜单的方式导致物品被复制之类的BUG。
Godot 4.0 自学研究笔记-1 Godot 4.0 自学笔记·修改鼠标模式(MouseMode)时: 这样写会提示让你将数字转为枚举 Input.mouse_mode = 1 这样写不会提示: Input.set_mouse_mode(1) ·按本地空间旋转节点(rotate_object_local): 围绕轴(单位 Vector3)旋转局部变换,指定角度(弧度)。旋转轴是在物体的本地坐标系中。 rotate_object_local( Vector3(0,1,0), 0.5 ) ·插值(lerp)支持三维向量,但(lerpf)不行: ·开关(bool)等同于(0 or 1),(0 or X): true = 1 false = 0 将一个bool乘以任意数字。 true = 1 * x false = 0 * x 只会返回一个 0或x 的结果 ·RigidBody3D 获取碰撞点: 激活接触监视器contact_monitor,可以使用_integrate_forces(XXX)方法名,获取碰撞状态。通过信号_on_body_shape_entered()可以获取碰撞对象信息。 _integrate_forces(碰撞信息) 获取碰撞信息并记录,通过碰撞信息访问碰撞点。 碰撞信息.get_contact_collider_position(body_shape_index) 获取接触对象的信息。 PhysicsDirectBodyState3D可以提供很多方法名来获取各种碰撞信息,包括碰撞点位置、碰撞对象的法线、撞击时的力度等.... 信号的 local_shape_index 只要用就会报错误,不知道是不是BUG。 ·获取变量的类型(typeof(XXX)): typeof(变量) 返回类型 ·插值(lerp())后面不能跟*delta: 会导致结果无限放大,最终超出500范围,下面是错误的: ShiftRun = lerpf( ShiftRun, 500.0, 0.1 ) *delta*60 下面这个是正确的,最大值500.0,可以当做钳制clamp来用,限制上限。 ShiftRun = lerpf( ShiftRun, 500.0, 0.1*delta*60 ) ·_physics_process 和 _process: _physics_process是物理帧,属于游戏内部的帧数,会被Engine.time_scale游戏时间改变运算速度,_process不会受到时间影响,会根据电脑的帧数执行。所以_process更适合用来刷新UI菜单界面一类的需要立即显示的计算。_physics_process更适合当做玩家,物理计算,游戏中的物体移动等,可以被Engine.time_scale控制实现缓慢或加速的效果。 物理帧在任何时候都保持固定的帧数,就算在卡顿时也会使游戏变慢,缓慢地按帧率执行,而_process在游戏卡顿时会导致游戏中的计算出现误差。 ·Godot4.0 File 改成 FileAccess,读取不用new(): 现在判断文件是否存在可以这样写: if FileAccess.file_exists("user://Options.cfg") ·Basis universal cannot unpack level 1: Basis universal cannot unpack level 1. 换第一个 ·Godot4.0修改窗口分辨率和属性方法变化: DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS,true) 以前的OS,ProjectSettings 基本不适用了。 ·Godot 4.0 修改部分窗口属性设置改为Window: 如:游戏窗口大小、标题、窗口最大化、窗口的位置... get_viewport().set_content_scale_mode(Window.CONTENT_SCALE_MODE_CANVAS_ITEMS) ·Godot4.0 新版自定义信号参数传递: $节点.value_changed.connect( self.AAA_.bind( "111", "222" ) ) 信号名.connect( 函数名.bind( 传递的参数 ) ) 自带的参数会放在第一位,信号新建的时候不用加,自建的参数会排到后面。
【音乐】FL音色表 Hypersonic2 音色表 01、Ultra Synth US-1合成器 02、Grand Piano GP-2钢琴合成器 03、Tonewheel Organs NB-3 风琴合成器 Orpeggian(短音) 04、HS2 Preview Patch HS2 合成器精选音色 - ) 05、Phrases HS2 原声琶音组 06、HS1 Preview Patch HS1 合成器精选音色 07、Natural Drum 原声鼓 Reversed Drums 08、Natural Percussion 原声打击 - 09、Contemporary Kits 电子鼓 - 10、Contemporary Percussion 电子打击 - 11、Drum Menus 鼓音色组 - 12、Drum Loops 鼓Loop 13、Acoustic Piano 原声钢琴 - 14、Electric Piano 电钢 - 15、Clavinets Clavinets电钢 - 16、Organs 风琴组 - ) 17、Harpsichord 羽键琴 - 18、Mallets 色彩打击乐 - 19、Bells 铃类 - 20、Percussive 电子色彩打击乐 21、Synth Bass 合成贝司 - 22、Acoustic Bass 原声贝司 - 23、Electric Bass 电贝司 - 24、Acoustic Guitar 木吉他 - 25、Electric Guitar Clean 电吉他 - 26、Electric Guitar Distortion 失真吉他 - 27、String 弦乐 - 28、Orchestral 管弦乐 - 29、Hits 管弦乐重击 - 30、Vocal 人声 - 31、Brass Sections 管乐组 - 32、Solo Brass 管乐独奏 - 33、Saxes Sax组 - 34、Woodwinds 木管组 - 35、Ethnic 民族乐器 - 36、Accordions+Harmonics 手风琴+口琴 - 37、Soft Pads Pad组 38、Bright Pads Pad组 39、Moving Pads Pad组 40、Soundscapes 环境音效 41、Techno Synths Techno合成 42、Poly Synths Poly合成 43、Arpeggios 电子琶音 44、Synths Brass 合成管乐 45、Soft Leads 合成主音(柔和) 46、Hard Leads 合成主音(硬) 47、Synths FX 合成音效 48、Sound FX 采样音效 49、Test Patches 测试音 50、GM Patches GM128 51、GM Drums GM鼓组 52、Combis 音色组 GM # V! M$ U2 D, G2 O3 @8 i GM音色表 钢琴 0 Acoustic Grand Piano 大钢琴(声学钢琴) 1 Bright Acoustic Piano 明亮的钢琴 2 Electric Grand Piano 电钢琴 3 Honky-tonk Piano 酒吧钢琴 4 Rhodes Piano 柔和的电钢琴 5 Chorused Piano 加合唱效果的电钢琴 6 Harpsichord 羽管键琴(拨弦古钢琴) 7 Clavichord 科拉维科特琴(击弦古钢琴) 色彩打击乐器 8 Celesta 钢片琴 9 Glockenspiel 钟琴 10 Music box 八音盒 11 Vibraphone 颤音琴 12 Marimba 马林巴 13 Xylophone 木琴 14 Tubular Bells 管钟 15 Dulcimer 大扬琴 风琴 16 Hammond Organ 击杆风琴 17 Percussive Organ 打击式风琴 18 Rock Organ 摇滚风琴 19 Church Organ 教堂风琴 20 Reed Organ 簧管风琴 21 Accordian 手风琴 22 Harmonica 口琴 23 Tango Accordian 探戈手风琴 吉他 24 Acoustic Guitar (nylon) 尼龙弦吉他 25 Acoustic Guitar (steel) 钢弦吉他 26 Electric Guitar (jazz) 爵士电吉他 27 Electric Guitar (clean) 清音电吉他 28 Electric Guitar (muted) 闷音电吉他 29 Overdriven Guitar 加驱动效果的电吉他 30 Distortion Guitar 加失真效果的电吉他 31 Guitar Harmonics 吉他和音 贝司 32 Acoustic Bass 大贝司(声学贝司) 33 Electric Bass(finger) 电贝司(指弹) 34 Electric Bass (pick) 电贝司(拨片) 35 Fretless Bass 无品贝司 36 Slap Bass 1 掌击Bass 1 37 Slap Bass 2 掌击Bass 2 38 Synth Bass 1 电子合成Bass 1 39 Synth Bass 2 电子合成Bass 2 弦乐 40 Violin 小提琴 41 Viola 中提琴 42 Cello 大提琴 43 Contrabass 低音大提琴 44 Tremolo Strings 弦乐群颤音音色 45 Pizzicato Strings 弦乐群拨弦音色 46 Orchestral Harp 竖琴 47 Timpani 定音鼓 合奏/合唱 48 String Ensemble 1 弦乐合奏音色1 49 String Ensemble 2 弦乐合奏音色2 50 Synth Strings 1 合成弦乐合奏音色1 51 Synth Strings 2 合成弦乐合奏音色2 52 Choir Aahs 人声合唱“啊” 53 Voice Oohs 人声“嘟” 54 Synth Voice 合成人声 55 Orchestra Hit 管弦乐敲击齐奏 铜管 56 Trumpet 小号 57 Trombone 长号 58 Tuba 大号 59 Muted Trumpet 加弱音器小号 60 French Horn 法国号(圆号) 61 Brass Section 铜管组(铜管乐器合奏音色) 62 Synth Brass 1 合成铜管音色1 63 Synth Brass 2 合成铜管音色2
【知识记录】alpha、beta、rc各版本区别 alpha版:内部测试版。α是希腊字母的第一个,表示最早的版本,一般用户不要下载这个版本,这个版本包含很多BUG,功能也不全,主要是给开发人员和 测试人员测试和找BUG用的。 beta版:公开测试版。β是希腊字母的第二个,顾名思义,这个版本比alpha版发布得晚一些,主要是给“部落”用户和忠实用户测试用的,该版本任然存 在很多BUG,但是相对alpha版要稳定一些。这个阶段版本的软件还会不断增加新功能。如果你是发烧友,可以下载这个版本。 rc版:全写:Release Candidate(候选版本),该版本又较beta版更进一步了,该版本功能不再增加,和最终发布版功能一样。这个版本有点像最终发行版之前的一个类似 预览版,这个的发布就标明离最终发行版不远了。作为普通用户,如果你很急着用这个软件的话,也可以下载这个版本。 stable版:稳定版。在开源软件中,都有stable版,这个就是开源软件的最终发行版,用户可以放心大胆的用了。 商业软件 RTM版:全称为Release to Manufacture。工厂版。改版程序已经固定,就差工厂包装、光盘印图案等工作了。 OEM版:厂商定制版。 EVAL版:评估版。就是有30或者60天等使用期限的版本。 RTL版:Retail.(零售版),这个版本就是真正发售的版本,有漂亮的包装、光盘、说明书等东西和高昂的价格。
steamworks 成就与统计 踩坑笔记 有可能是我没找到批量上传成就的方法,网页直接创建成就真是个麻烦的很的一个过程! 避雨2的成就 我的游戏里有58个成就,本来打算同步一下steam,结果发现这个页面只能一个成就一个成就这样去添加,非常麻烦 ! _1_0_NAME 从此消失了,直接从_4_0_NAME开始 重点!新建过的ID删除后不会重新出现,而是变成一个新的ID,所以这里面的顺序是根据默认匹配给你的ID顺序决定的,不能中途修改顺序(也可能是我没找到方法,如果有人知道方法可以评论区说一下造福后人)。 所以这里面的成就,我第一次是一次过新建了58个成就然后全部API名字修改好了,然后发现中间少了一个A_012,于是我只能在最后补上一个成就,接着去上传图片,之后就发现没办法改顺序,导致我按顺序上传的图片错了其中一个,后面的所有成就顺序全错了! 啥也没有~ 最坑的是每一个成就图标都要单独上传,一开始我只有彩色图标,用PS批量转换成黑白了,然后发现图片如果连续点上传按钮,保存之后就会出现空白,所以只能每次点击上传按钮都要等他上传完,图片出来之后才能继续上传下一幅图片,上传速度非常慢! 所以最后理清了原理,找到网页操作的我认为的最优解了。 首先是按照游戏里成就的数量,新建相同的成就数量,然后逐个保存一次。 接着去 “成就本地化” 页面,下载“本地化数据” 然后按照steam默认的ID,填写对应语言的成就名和成就描述,然后上传上去,再回到成就页面对照名字来修改API。 可以看到左边的ID是固定死的 API名称,对应游戏里传递解锁的专属名称。 进度状态:要在 【统计数据】里新建统计,这个统计会记录成就的进度。 注意左边,又有一个ID,这个ID也一样,删了一次就少个ID(什么离谱操作?),我之前删除过,所以从6开始了...这里设置完默认的 统计类型的总量,成就那边才可以选择。 选择对应的【统计状态】,可以设定最小值和最大值。 比如我这边分别有四个成就,死亡0~10,0~100,0~1000,0~10000,在统计设置页面我设置的最大值是10000,然后在成就这边就分别设置最大值。(这里面其实是:一个是统计的最大值,一个是当前成就的最大值)而它们起到的作用只是一个进度条显示,进度不包含解锁成就的功能,只是用来看的。 好了差不多就这些了..... 踩完这所有坑之后,大概明白了,最好的顺序,可以减少很多没必要的麻烦。 总结 不到最后一步不要改API名称 先创建足够的成就数量(最好不要删除了,不想要显示可以勾上隐藏的勾子) 下载成就本地化数据,把成就名和成就描述先填好 去发布一次,方便在steam游戏商店页面看到游戏的所有(无图标的)成就 现在可以把成就图标全部塞进成就列表里了,过程很慢,可一次性把图设置好,但上传按钮一定不要连着按好几个(因为我发现按了上传的时候,地址看会看到正在编辑的成就内置ID,连着按两个上传,相当于第一个成就上传到中途被你刷新了网页上传另一张图片,最后虽然你看着图片确实上传上去了,能看到图,但保存之后,只会保留你最后点上传按钮的那张图片....这个做的真的.....) 放到最后再来改这个API名称(如果一开始就改了,本地化的时候很容易分不清哪个成就的内置ID对应这个API,比如出现:NEW_ACHIEVEMENT_4_10_NAME,一时很难确定这到底是哪个成就) cv21509449
1 下一页