Construct2/3

创建于:2017-02-24

创建人: iconboy

103 信息 416 成员
Construct2/3 引擎开发专题
potion@Construct2/3 的内容(查看所有内容
[制作分享]游戏中的对话框制作
potion 2018-09-04

我们常在游戏中见到各种各样的剧情对话,电子游戏从最早的RPG类对话框演变至今,已经产生了无数种解决方案。但总的来说,常见的对话分为两类:

最常见的galgame对话,可以看到较大的立绘图表现人物的表情动态(甚至动画),以及标记角色的名字和对话内容。

image.png

或者也有一些游戏使用pop的悬浮对话窗口直接表现,对话框与角色位置匹配,同时不干扰游戏环境的演出效果(例如可以一边行走战斗,pop框还依然出现)

image.png

分析制作方案,有2个要素:

1 资源

2 配置

由于各个游戏的需求不同所以我们先从最低需求的资源和配置来讲。

对话框资源,我们最低限度需要有一个框体和一个对话文本框。框体用来做文本的背景,文本框显示对话内容。然后再根据游戏需求的不同添加立绘用的图片加载框,角色名文本框等。

如果是pop类型的对话,也可能需要添加箭头资源(也可能需要区分对话和思考的箭头和泡泡)

image.png

配置部分则比较复杂,首先我们需要先理解对话的最基本结构。

这部分很好理解,对话就是一句一句的文本,说完一句进入下一句,所以我们可以将对话的配置设计为一连串的对话ID,比如ID 1000代表第一句话,这句完了就说ID为1001的那句:

image.png

(请暂时忽略文本里奇怪的标签)

很好,这样只要将这一串ID里的文本顺序播放,一句完毕显示下一句,最基础的对话框配置就做好了。

接下来,我们需要添加一个标记,表示1014这句话是这段对话的最后一句,这样程序当识别到这个标记就会在这段对话结束的时候关闭对话框,例如next标记0表示这是段落的最后一句话:

image.png

在添加了文本后,我们也需要区分对话是谁说的。所以还需要添加名字和立绘的配置列:

image.png

如图

  • role标识立绘用图的名字
  • side标识立绘在对话框的左侧还是右侧,在制作的时候会自动反转立绘
  • name标识说话的角色名字,显示在对话前面

关于文本打字效果:

文本打字效果是对话框的常用效果,可以有效的控制阅读节奏,同时在单调的对话中有限的制造一些演出效果。

打字效果可以控制打字速度,并且可以在每个字出现的时候产生各种效果(参考逆转裁判里的经典用法)

基于打字效果产生的更多的细节:

image.png

  • speed标记打字速度,0.5表示0.5秒打一个字
  • audio标记打字音效,即每个字出现时播放的音效
  • shake标记打字震屏效果,填写的数值表示震屏强度
  • auto标记文本是否自动下一句话(可以参考逆转裁判中犯人崩溃的桥段),一旦标记为auto则不需要按键也会自动进入下一句
  • size标记文本的字号


以下是最终效果(不过听不到声音啦)

talk_ref.gif


更多扩展:

  • flash 闪屏
  • bg 改变背景图
  • bgm 改变背景音乐
  • posXY 改变立绘坐标使之偏移
  • effect 产生某个特定的特效


pop类对话看起来比固定对话框要简单,不需要显示名字,没有立绘,受限于pop的尺寸文本也不可能做很多。但实际上,pop类对话比固定对话复杂很多:

  • pop框的尺寸需要和文本量匹配
  • 需要与说话的角色位置对应,甚至跟随移动
  • pop对话的时候,可能需要与角色行为产生关系(例如更换动画)
  • pop对话也许根本不会暂停游戏


POP框体的制作

在讲述pop的制作方法前,需要普及一下pop的资源制作方法和在UI中的使用类型。

在UI控件中有一类名为9patch的控件。和普通的精灵图片不同,9patch可以将一个图片按井字分隔为9个格子,如下图:

image.png

如果是普通的精灵图片,在缩放的时候就会产生形变和模糊

poptalkx.gif

而9patch控件可以将保证4个角不变的情况下自由拉伸并且不会模糊,实现固定倒角的随意缩放的圆角矩形:

poptalk.gif


一旦基础的pop对话框资源搞定以后,后面的事情就会简单很多:


  • 当对话框弹出后将pop框体+箭头+文本创建在指定的角色上方(固定的点)
  • 与上次讲的固定框体一样使用打字的方法讲文本一个一个打出来
  • 限制文本框的宽度,超过一定宽度(或有主动的文本回车)自动换行
  • 将pop框的尺寸与文本框的尺寸匹配(当然四周需要留一些空间)
  • 控制好框体的坐标(匹配对话框箭头的位置,如果变大需要向上“长”)
  • 对话框缩放的效果(目前GIF帧率低看不出来,其实框体的变化是更有“弹性”)


talk_pop.gif


上图是完成的效果,因为偷懒,所以pop框采用了和固定框不一样的创建方式。每说一句话都会删掉当前框体,下句话重新创建pop框体并从最小尺寸开始。


对话与角色匹配


由于pop对话的方案需要让框体出现在指定的角色头上,所以需要为对话配置对应角色的字符(比如特定的名字),由程序逻辑找到那个角色并创建对话框(例如场景中有5个一样的NPC,我们只想让第二个NPC说话,这种时候就需要为他配置特殊的标记才能找到他)


角色是否受控?游戏是否暂停?


根据情况,可以将角色置为不受控状态,或干脆暂停游戏播放固定的对话或演绎动画剧情。但也有非剧情对话的情况(比如敌人或NPC的随机喊话),需要区分处理。


对话镜头


可以配置对话出现时镜头拉到说话角色的位置,用于跟踪对话主体或跨屏演出效果


剧情段落


除了NPC或敌人不受控制的自言自语外(程序设置的某种规律的随机说话),大部分的对话都是受剧情控制的综合演出效果,这种时候往往只依靠对话表不太够用。

实际上当游戏中对话文本过多的时候,可能还需要再高一个层级的配置,用来更方便的管理对话的开始和结束,对话的类型方案等等。如果对话叫做talk的话,这个配置可以称之为story。


在story中最基本的配置除了ID外便是talk的开始ID和结束ID。还可以配置这段对话是固定对话框还是pop对话框,甚至产生某些混合方案,例如控制剧情之间的衔接关系。


演出效果的相关内容:

  • 对话
  • 动画控制
  • 镜头控制
  • 行为控制(例如移动或跳到某处)
  • 功能控制(例如某些开关自动开启)
  • 效果(特效,音乐音效)


其实大部分我还没做,慢慢实现吧……orz

所以先这样吧……

[制作分享]跳跃的小技巧:贴墙跳
potion 2018-09-04

继续延续跳跃的话题,来说说跳跃中的小技巧。

首先看看这两个GIF。

jump1.gifjump2.gif

这是一个贴墙跳上平台的实例,乍一看可能看不出区别。但实际手感却有很大的区别。

我们可以拆解一下前后两个GIF的跳跃轨迹可以看到以下的区别:

image.png

可以看到,前面一个GIF在起跳后有一个向右后再向左的弧线,后者则直上直下。


说到这里,需要科普一下平台游戏的基础知识。


在平台游戏里,角色的左右移动,除了移动速度外还有两个重要的参数:Acceleration和Deceleration,说白了就是加速度和减速度。

在很多希望体验敏捷快速的游戏中,这两个参数会被调到很大,其结果是一旦玩家按下移动就立刻启动到最大速度,一旦松手就完全静止。

但也有反其道而行的游戏,比如超级马里奥系列。主角马里奥从静止到启动至最大速度会有一个过程,而松手后也会有“惯性”(在某些冰块地表上更明显)

而大部分平台游戏则是介于两者之间,短暂的起速和短暂的骤停。


回到前面的跳跃问题,我为什么要把条约做成弧线而不是直线呢?


因为角色在贴墙跳跃的时候,移动速度是0。没错,即使你怼着墙跑,移动速度也是0。

这就意味着你贴墙跳起到达平台后,左侧有了移动空间后才可以提升移动速度。

所以,直上直下的跳跃方案,其结果是在跳跃到平台区域之前,角色的移动速度一直为0。左侧有空之后才能启动加速,这就导致贴墙跳上平台后无法立刻进入高速的移动,角色会在原地停一下。

而我改善的方案,由于跳起后先向后移动,所以可以在到达最高点之前左侧就有了移动空间。角色就可以提前进入起速,在到达平台上的时候就可以无缝前行了。


另一个原因


再看看左侧完全是墙的情况:

jump3.gif

当左侧完全是墙的时候,按照这个技巧也会产生一个后弹弧线。

这同时解决了另一个问题:当角色需要爬墙的时候不会立刻吸附在墙上。

关于爬墙是怎么实现的:

  • 角色处于“跳”或“落”的状态
  • 角色左侧或右侧贴着墙
  • 满足以上条件就进入爬墙状态

根据以上逻辑,如果我们采用直上直下的贴墙跳方案,在跳起的一瞬间角色就会进入爬墙状态,其结果是角色根本没跳起来,而是在地面高度爬了墙,并因为角色还处于地面导致立刻解除爬墙。

[制作分享]如何实现伪物理的称重解谜
potion 2018-09-04

这是最近正在开发的一个解谜功能。我希望制作一个按钮,通过踩下这个按钮打开某个机关(或别的功能)。

最初的设计非常简单,踩在上面=开机关。后来发现太简单了,加了按 ↓ 蹲下打开。

后来,我为角色添加了拿箱子的功能,突然想到了重量作为解谜要素的点子,于是这个功能开发就正式开始了。

1 重量计算


首先确定主角有一个重量值,可被举起来的物件也有重量。当角色将物体举起来的时候,将该物体的重量值累加到角色身上。

在按钮上,则需要添加一个需要多少重量的数值参数,例如我目前设置的100。

最后,判定角色踩在按钮上:

  • 为角色脚下添加一个虚拟点,比角色的高度低2个像素
  • 判定这个虚拟点和按钮重叠
  • 判定角色的重量+所持物品的重量和按钮的重量需求关系,相减得出还差多少重量才能开门

weight.gif

2 按钮的高度匹配

在这里我使用了一个小技巧:

  • 数字的插值,让重量不是直接到达相减值,而是慢慢到达
  • 为了让按钮逐步向下沉,我需要想办法让按钮的高度和当前显示的数字(缓动数字)能够匹配上。
  • 按钮的踩下高度是一个序列帧动画。计算当前重量/重量需求,可以得到一个当前重量的百分比,用这个百分百对应序列帧的帧数。这样,按钮的高度就和当前的重量匹配上了。 button1.png
  • 甚至我可以将门的打开进度,也许用这个方法可以做那种限时通过的门?

door.gif

3 修改方案

紧接着我发现一个问题:只有主角踩在按钮上的时候按钮才能称重。但是物体单独放在上面的时候重量都不会改变:

image.pngimage.pngimage.png

以上3种情况(甚至叠着多个箱子)都会无法称重。

解决方案:

  • 在按钮上添加变量,记录当前按钮上所有的物体+角色的重量,用于和重量需求做比较
  • 当按钮被创建的时候,为按钮创建一个虚拟碰撞体。这个碰撞体用来检测按钮上到底都放了什么,他们的重量是多少,并记录所有物体的重量总和
    •       碰撞体的宽度=按钮宽度    
    •       碰撞体的高度=按钮向上检测到屋顶(或其他阻挡物)
    •       image.pngimage.pngimage.png    
  • 接下来就是计算检测环节了:
    • 计算碰撞区域内的角色重量+手持物体重量,须满足角色并没有跳起来,处于地面(包括站在其他物体上)
    • 计算碰撞区域内的所有物体的重量,须满足物体没有在空中,处于地面(包括落在其他物体上),并且没有被玩家拿着)
    • 最后将所有物体的重量相加计算出当前按钮上所有物体的综合重量
  • 注意,这个解决方案并不完美,例如在L拐角的位置,按钮上方有半个阻挡块,或有其它新规则物体的情况。但在当前规则下应该足够使用了。所以当游戏添加新的规则时还需要注意不要与其冲突。

万岁!完成了

GIF.gifGIsF.gif

[实战]来做动作游戏:如何在斜45度游戏里实现跳跃高度
potion 2018-05-07

Image title

本教程内的游戏为小英雄大乱斗:https://indienova.com/g/little%20fighting,美术资源版权归属为@JKLLIN

注意:本教程只讲思路不会去详细说明如何在C2里怎么写事件。


我们要实现什么效果?

在C2里有2个非常常用的移动行为:

8 direction行为用来实现8方行走,通常我们可以用来做顶视角或45度角游戏。添加8dir就可以直接实现用键盘控制实例在画面中移动。

platform行为用来实现平台跳跃,platform的实例可以有非常简单实用的platform状态,包括jump,fall等。

那么,如果我们需要在8dir里添加跳跃该怎么实现?


基础概念

首先必须对有高度的斜45度游戏有一个基础概念:游戏的坐标体系是由XY轴(坐标)和Z轴(高度)组成的。

通过8dir行为可以直接实现对XY轴的控制,我们需要的是在这个基础上添加一个Z轴,让角色有高度。

Image title

拉尔夫出镜


逻辑和表现分离

首先我们要确定的是,为了实现这个效果,我们需要让角色的逻辑和表现分离。

为什么要拆开?

因为我们需要用8dir行为控制角色在地面的XY轴上移动,但当角色跳起来的时候,其实角色只是原地提高了Z轴高度,并没有改变XY的位置。

但角色在画面中真的会位移到较高的位置,所以我们必须让这个跳起来的角色还有一个标记当前XY位置的真正逻辑位置。

Image title

观察角色下方的绿色方块,该方块为角色在XY轴空间中的位置


即我们需要2个精灵,一个是真正的角色表现效果,包括角色的所有动画。另一个则是角色的逻辑位置,只需要一个简单的矩形即可。


这里暂时命名这两个精灵为:

role1 角色表现

role1_logic 绿框逻辑


接下来你只要控制role1_logic的8方行走就行了。对应的role1根据状态改变动画。

上面的角色精灵role1使用set postion可以绑定在role1_logic上。注意这里不要使用pin,pin会把角色钉死在role1_logic上,role1就真的跳不起来了。


Z轴的添加思路

role1_logic添加一个litetween行为,按照以下方式进行配置:


其中tween property设置为value,即我们要用litetween改变的是一个值。

function选择easeOutQuad是一个减速的运动行为,跳起到最高点是一个不断减速的表现效果。

target Mode选择Relative,即相对差值。

target和duration填写改变值和插值时间,这两个控制跳起来的高度和速度,可以在事件里填写。


跳跃开启

在事件里启动litetween的value,让角色跳起来。


第一行先为value设置初始值=0(表示是从地面开始的)

第二行设置value目标值为40

第三行设置时间为0.5秒

第四行设置开始执行litetween,这里使用pingpong的运动模式,是一个往返循环的运动模式

跳跃结束

因为设置了pingpong的运动模式会导致角色会不停的跳不会停止。所以还需要设置当pingpong循环一个循环结束后停止litetween:


这样,从逻辑上实现一个跳跃高度就完成了。最后你只需要把litetween.value的值和role1绑定起来就大功告成了。

逻辑Z轴体现在跳跃高度上

前面讲到role1需要set postion始终跟随role1_logic,这里的XY设置除了role1.x=role1_logic.x外,还需要在Y轴上添加litetween.value的值:role1.y=role1_logic.y-role1_logic.litetween.value(注意这里减value,因为跳起来是y轴减少)

这样,就可以让角色保持XY轴不变的情况下跳起来。

Image title

Image title


行为的拆分

上面描述的情况是非常简单的同高度跳跃,即从0高度开始跳到40,再落到0。ACT游戏一般也只需要做到这个程度了。但如果你想做更复杂的,比如二段跳,那么就不能使用pingpong方法。而需要自己将角色的状态扩展为jump和fall两个状态,分别控制litetween.value的起落运动了。

扩展内容

实现了以上功能,基本你就可以做出包括空中攻击,升龙拳,打击浮空等更复杂的战斗效果了。



[实战]用FSM制作平台游戏陷阱
potion 2017-10-30

这次我们来尝试用C2制作平台游戏里的地刺陷阱:

Image title

1 准备资源

首先我们准备好要做的陷阱,以地刺陷阱为例,我们需要为地刺陷阱的精灵制作4个动画:

close 关闭动画

Image title

born 出生动画

Image titleImage titleImage title

idle 开启动画

Image title

dead 消亡动画

Image titleImage titleImage titleImage titleImage titleImage title

每个帧动画都有自己的碰撞区域,在地刺的各个状态下都可以进行伤害检测。

这里有个特殊的设置,close关闭状态的动画,碰撞检测设置为全部图片尺寸。这是为了在触发陷阱时能够取到碰撞区域。

同时,为了方便以后添加各种不同类型的地刺,我们创建了fam_sting的family:

---------------------------------------------------------------------------------------------------------

2 设置变量

为fam_sting创建4个私有变量,分别是:

1 type:地刺的逻辑类型(这里我们会制作3种逻辑的地刺)

2 start:启动时间,触发时延迟多久启动,或用来控制地刺的间隔形态

3 on:开启状态的持续时间

4 off:关闭状态的持续时间


---------------------------------------------------------------------------------------------------------

3 添加行为

为fam_sting添加timer和FSM这两个行为,其中FSM行为需要安装rex的FSM行为插件


---------------------------------------------------------------------------------------------------------

4 FSM的动画切换:

FSM也有 idle, close, on, off这4个状态,对应动画起同样的名字,在这里,我们先添加好on FSM enter to state的动画改变事件。即当每个地刺实例改变状态的时候,同时改变精灵的动画资源:


---------------------------------------------------------------------------------------------------------

5 3种不同的type:

在这里,我们设计3种不同的type,对应3种陷阱模式:

type = 0 陷阱常态打开,即我们常见的碰到即死的地刺

type = 1 固定节奏开关的地刺陷阱,表现为开启一段时间,关闭一段时间

type = 2 触发型地刺陷阱,当有角色进入陷阱区域就会把陷阱弹出来,一段时间后自动收回去

以上3种陷阱模式,需要在精灵实例上手动填写私有变量内容,控制陷阱类型,以及对应的参数:


---------------------------------------------------------------------------------------------------------

6 type 0:

非常简单,直接为精灵的私有变量填写为type = 0 即可。

事件也很简单,保持FSM在idle状态:


效果参考:

Image title

---------------------------------------------------------------------------------------------------------

7 type 1:

固定时间的事件逻辑需要用到timer。逻辑按顺序如下:

第4行: 当精灵被创建时,将状态置为close

              随后开启一个与变量start数值相同的timer,名为start

第5行: 当start计时器结束时,将状态置为on,这个时候根据之前设置的FSM事件,会开始播放born动画

第8行:当born动画播放完毕时,进入idle状态,并根据on变量开启一个名为on的timer

第6行:当on计时器时间结束,进入off状态,根据FSM设置,同时会进入dead动画

第9行:当dead动画结束时,进入close状态,开启off计时器

第7行:off计时器结束,重新回到on状态,回到前面第5行的逻辑


type1类型的陷阱,就是固定间歇的发动和关闭效果:

Image title

通过修改start的值,,为每个精灵做出一些间隔,也可以制作出这种花样来

Image title

Image title

---------------------------------------------------------------------------------------------------------

8 type 2:

与type1类似,type2基本也是靠timer来控制:


与之前不同的是,type2添加了与角色的overlapping判定:当角色与close状态的地刺重叠时,才发动start计时器。这里添加了一个ready状态进行中转等待,表明不在之前的4个状态里的任何一个。

type2的配置最大的区别在于start的时间,我们可以统一设置为0.2秒,这个时间不再是之前的项目启动后的机关间歇,而是当触发机关时给玩家预留的逃离时间。

Image title

---------------------------------------------------------------------------------------------------------

9 同类应用:

相同的方法也可以用在其他陷阱上,以下是一些例子:

Image title

Image title



超炫!C2下制作角色的围巾拖尾效果
potion 2017-07-07

很多游戏的主角都有围巾,比如风之旅人,比如魔界战记


围巾在角色移动的时候可以有漂亮的拖尾效果,正巧这两天在制作新案的角色,就打算制作一个可以飘起来的围巾

(只讲思路,具体功能如何是用请自行查找手册或案例)

先上角色:

Image title

首先你需要有一个主角,并且在脖子的地方最好有围巾。我们的目标是,在角色背后添加一条围巾,围巾的连接点在角色背后,只要角色移动就会被带动起来。


方案1物理系统

C2的物理没有柔体,所以只能尝试是用连接obj的方法(joint)来制作:

首先制作6个连接obj,最后一节添加个破损,效果如下:


为每一段obj修改imagepoint,为了能够将他们连接起来,每个obj都需要有0和1两端的imagepoint


接下来给obj添加物理行为,将第一节set postion在角色身上:

接下来在事件里连接每节obj:


这里我尝试是用的是limit revolute joint的连接方式,可以限制每节的旋转角度,防止围巾乱甩:

Image title

看起来效果还行,不过群里有人吐槽说围巾显得太沉了,我自己也觉得效果不太满意,尤其是跳起来的时候甩动的效果不是很理想。

给说这话的人打个码:


所以我决定尝试其他方法


方案2:拖尾效果

所谓拖尾效果就是移动物体产生轨迹拖尾的效果,常见的就是水果忍者那种滑屏效果。

在3D游戏里,拖尾通常用mesh连接的方法做,通过创建边连接的一堆mesh创建轨迹,再给这个mesh赋予一张完整的贴图。但这在C2里行不通,C2里只能依靠创建大量obj来制作,每个obj贴图独立,然后通过fadelitetween等方法,实现尾巴的缩小和消失。

下面来说说如何实现这个效果,首先你需要有一个obj精灵,用于大量创建的元素就是他了。因为我的美术风格是像素的,所以创建一个像素的球:


给予这个精灵fade行为,并在角色移动的时候不断在角色围巾的位置不断创建即可,别忘了给角色加imagepoint


事件表:


效果:

Image title

注意:为了实现拖尾的上下摆动,可以在跑步的不同帧将imagepoint设置为不同的高度位置,这样创建出来的拖尾就会有起伏。

因为精灵在fade后会自动销毁,所以可以做出还效果不错的拖尾效果。但这个效果还不够好,看起来像一堆球连起来,移动速度快的时候中间还有空隙。

为了解决这个问题,需要在两个球之间增加插值补间。即,当发现下个点过远的时候,在两点之间再补差几个球填充中间的空隙。


方案3:拖尾效果+补间插值方案


为了创建插值,我们需要整理一下思路:

    1 需要知道两个坐标,即当两个球过远的时候,这两个球的坐标

    2 通过坐标可以获得两者的距离

    3 通过距离判断往两者之间插入多沙个部件

所以新变量创建:


pos_xy1记录当前的坐标,pos_xy2记录上一个坐标,dis记录两者之间的距离,balance控制补间数量。

首先在开始时记录一次坐标,初始化一下位置赋予相同坐标,防止一开始坐标为0导致出现第一次的拉扯效果:


pos_xy采用 "," 分割记录,获得坐标格式为 “x,y",稍后通过tokenat再拆回来


设置档角色在移动,跳跃,下落的时候,将pos2的值给pos1,再由pos1获取新的位置,由此可以得到前后两帧的位置。

将两帧的距离计算出来,赋予dis


继续写子事件。For语句重复次数由disbalance两个值决定,这个值可以通过设置balance控制,我这里写得值是5。即当两者距离为50像素时,中间插值10个补间。

在循环内开始创建,这里使用了lerp —— 通过lerp计算出两点之间的补间位置。lerp的最后一个值可以填写0-1之间的浮点数,通过改变这个值就可以每次创建不同补间位置。这个值因为知道补间数量就很好获取了。


最后设置其他一些事件,控制角色在非移动状态下不会创建拖尾。得到最终的结果(拖尾使用litetween逐渐缩小),非常流畅,而实际大约也只有60个左右的精灵被创建:

Image title

方案3:持续的效果优化

接下来就是优化效果了,我需要一个逐渐变宽,最后再收小的围巾效果,用litetween不太容易做出来,所以我改用了sine:


同时尝试修改了资源,让其不再平整:


运行看看效果:

Image title

一边调整一边测试效果,最终让我发现了奥义:


将精灵改为多帧的动画,调整speed并改为循环。将前后2帧改为不同的颜色。奇迹出现了:

Image title

最后的步骤,将精灵修改为platform,去掉默认操作,这样拖尾精灵也会被重力影响,出现微量的下坠,完成撒花。

Image title




6月轮值版主Potion任职自述
potion 2017-06-08

自述:Poiton,药水仔

游戏行业老炮,7年美术,7年策划,最近在自己做独立游戏。

C2实战案例:

去年在steam上试用了C2的免费版,10月份辞职后开始正式做练习,11月RunningDead(僵尸弹射)启动制作,4周时间完成游戏制作。几经周折(申请绿光,接入steam啥的)目前已在steam发布。

今年春节前参加GGJ,和AV爷爷合作,48小时完成了BlindBlade(盲剑)

通过这些游戏案例,我深深地体验到C2是一个简洁高效的游戏开发工具。所以目前也致力于在QQ群及其他地方推广C2,帮助新人。

版主计划:2017.6.1-6.30

这个月已经过去1/4了,而且其实和平时也没太大区别。想来先去,还是趁这个机会做几篇制作技巧的教程给大家吧。

鉴于美术出身,可能更多会去讨论效果相关的制作技巧,敬请期待。

RunningDead开发阶段日志
potion 2017-03-04

记录一下RunningDead开发阶段每天记录的review。真实的全力开发周期为6周,之后的零散时间做小修改和接入Steam就没有记录了。

第一周 RD Weekly Review 11月6日 - 13日

本周RD项目正式开工。虽然上周一次断电导致初步测试未完成,但是经过撰写“RD实现思路”文档,早已将基础功能实现的方案确定下来,所以重新开始再写一遍变得非常顺畅。11月7日凌晨 3点就完成了第一个测试版本。第一个版本包括:

  • 所有单位都用64*64的彩色方块处理
  • 对回合概念的结构设计,包括准备阶段,可以操作阶段,战斗阶段3个回合,并对各回合内能做的事进行了限制
  • 最基础的弹射和伤害
  • 3种不同的敌人,生命不同,需要攻击的次数不同
  • 子弹在墙壁多次反弹后会加重力下降
  • 一些基础的文本显示内容
  • 操作瞄准线,以及瞄准线的显示隐藏
  • 每回合敌人下移一行
  • 子弹的补充效果

11月8日对该版本进行了进一步的修改:

  • 通过func进行随机的刷怪,在此过程中对制作随机的方法有了基本概念
  • 敌人随回合数增加提升生命值
  • 随机产生4种不同的子弹:普通子弹,三连发,加速小子弹,三向散射
  • 制作了回合计数和最高的分
  • 子弹消失后挪动子弹的起始位置,使每回合有不同的操作难度

这个版本是弹射测试的第一版,完成了最基础的功能,使游戏已经可以玩起来。

11月8日创建弹射测试2文件,开始进一步的修改:

  • 增加了敌人死后产生GOLD的功能,并随回合数提升奖励
  • 增加了升级系统,可以用GOLD升级伤害值
  • 除了普通的子弹外,将随机的其他三种子弹做了开启开关,并通过花费GOLD解锁
  • 解锁子弹时更换子弹
  • 子弹解锁后添加了掉落系统,可以随机掉落3种额外的子弹,并可以随时更改子弹类型,消耗存货
  • 制作了简单的弹出UI,操作界面功能
  • 制作了增加金币的GM命令

这个版本增加的升级系统完全改变了游戏玩法,但也因为没有整体的设计过,导致界面太难理解,不容易学习,之后做了一些改善:

  • 一开始的指引圈,教玩家点击操作射击
  • 金币足够时自动弹出升级UI

11月9日创建了弹射测试3

  • 尝试了屏幕特效,增加了屏幕扭曲,模糊,加亮等效果。虽然在手机上效率非常低,但也尝试了effect的使用方法,以及通过定时器控制effect的方案
  • 这个版本还添加了WebStore,通过该功能存储了玩家的BEST记录到网页
  • 增加了游戏音效,发现部分导入音效无法创建OGG文件,最后用GOLDWAVE自己转了格式
  • 添加了碰撞特效,并在碰撞时增加了碰撞扭曲的效果
  • 大量修改了升级界面的UI显示,增加了很多说明文字,例如添加了更容易理解的UPGRADE和BUY等字样,将不同子弹的伤害值显示出来
  • 之后11月10日又创建了弹射测试4做微调,增加了TIP用的小红点

这个版本在弹射测试4基本完结,游戏的核心玩法也基本完全验证:

  • 游戏的核心玩法很有乐趣,以瞄准的操作为基础,要求玩家不但要准,还要能够尽可能把子弹往里“塞”,使其能够产生更多次的反弹,达成单回合收益最大,
  • 通过简单的敌我双方等级成长以及回合分数作为节奏控制和游戏目标,形成最基本的游戏乐趣
  • 后续的难点在于如何脱离方块的外观产生更加游戏化的表现
  • 依照原始设计方案,方块和子弹将更换为人和僵尸,并以45度视角进行美术设计,但该视角下角色会有层叠,并且会有非矩形的轮廓,基于这两个问题会导致玩家很难对子弹的反弹进行准确判断,导致手感下降
  • 子弹和敌人一个尺寸也会产生碰撞尺寸的错觉
  • 一行10个单位在更换为角色时会显得屏幕上过于密集,效果不佳
  • 攻血数字难表现

经过一番纠结,最终决定一边制作资源,一边将画面尺寸修改,于是在11月11日创建了弹射测试5_尺寸修改版本:

  • 首先将敌人尺寸由原来的64*64修改为90*90,加大尺寸使画面单位变少,不那么密集
  • 修改刷怪为单双斜排,一来解决了角色尺寸在斜角时空隙过大显得可以通过的问题,二来错位效果也更加美观错落。实际体验效果并没有对游戏性改变太多
  • 将做好的角色跑步动画加入游戏中,并随机的动画起始帧
  • 修改了碰撞区域,改为75的高度,15的上下层重叠
  • 添加了Z-sort为角色排序
  • 添加了底图的背景移动动画
  • 为不同子弹修改了颜色
  • 将数字放置在了角色胸前,并PIN TO IMAGE,根据动画随时调整位置
  • 将子弹LOOT也放入了TIPS计数里

这个版本看起来没那么差,但之前预计的碰撞框失准问题也暴露了出来

11月12日创建弹射测试6_角色调整:

  • 绘制了僵尸动画
  • 绘制了背景公路的图
  • 增加了黑色边缘遮罩
  • 去掉了影响效率的模糊效果
  • 修改了瞄准箭头资源
  • 增加了角色瞄准时的转向
  • 增加了角色移动中的转向
  • 为角色增加了阴影
  • 调整了僵尸初始位置的高度
  • 尝试WEBFONT,电脑上没问题,手机无法正确显示

总结:

  • 本周经过快速的制作DEMO,验证了游戏的核心玩法,并高强度学习了C2的大量功能
  • 结果证明游戏方向基本没问题,核心玩法得以证明
  • 碰撞手感问题需解决
  • 游戏结构需要重新整理
  • 游戏的外围机制需要重新设计
  • 第二周将集中解决这些问题

第二周 RD Weekly Review 11月14日 - 20日

11月14日,继续对弹射测试进行改进:

  • 修改了背景图的颜色
  • 改善了子弹的转向问题,不旋转角度,而是设置motion angle,但子弹朝向问题又出现了
  • 制作了角色的死亡动画,效果还不错,但动画效果还有待改善
  • 添加了“连锁消除”的功能,玩起来更加有意思了
  • 制作了啃咬的音效,很带感
  • 为了改善手感,弹射初始角度偏移y-50

11月15日

  • 调整了角色尺寸,改为80*90
  • 每行角色数量也调整为8-7-8
  • 添加了死亡后的影子
  • 开始新的游戏功能设计,确定了几个基本要素:
    • 不在游戏中途要求玩家中断并作出选择
    • 有趣的单局体验,并持续循环
    • 随机的道具和敌人,让每局的难度和机会富有变化
    • 重复的自我挑战,连续游戏时间在10分钟以上

11月16日

  • 重新整理了设计结构,划分了文件,添加了文件夹,并为事件标注了说明
  • 修改了几个音效
  • 重新设计游戏逻辑的实现思路

11月17日

  • 尝试修改角色的像素分辨率,最终决定批量替换为1/2尺寸资源
  • 重新制作了开始游戏逻辑,包括开始游戏按钮,游戏开始自动刷怪等内容
  • 修改金币为全局记录的数字,重新游戏时不重置

11月18日

  • 完成了像素角色的重新绘制
  • 增加了金币道具
  • 增加了升级道具
  • 修改了游戏失败,可以花钱复活
  • 暂时去掉了原来的升级界面和子弹解锁

11月19日

  • 将大部分文字改为Sprite text
  • 修改turn.turn变量为全局变量,但turn下的单双排因为是布尔值,所以暂时没动

11月20日

  • 因为找到了toggle switch插件,所以解决了turn上存布尔值变量不方便切换的问题,删除了turn
  • 制作了下方的更换子弹功能,添加了triple, power, scatter三种子弹的item
  • 子弹更换功能改为切换效果,发射子弹后再扣除计数
  • 子弹选择框的弹动效果,如果点到没效果的选项会回弹,发射完子弹也会回弹
  • 原tiny子弹恢复为正常尺寸,改为power,伤害恢复正常
  • power子弹功能,当发射后,将所有fam_mon的solid属性关掉,实现穿透效果,回合结束后再恢复回来

本周游戏基础功能已完成。碰撞手感,游戏结构,外围设计也都如期解决。重新绘制了1/2尺寸的资源使游戏效果更好。开发在产品化的道路上稳固前进中。下周集中在以下内容:

  • 内容随机的整理,可能会用到dict的录入,以及pattern gen(本周没有想太清楚结构,下周要重新整理)
  • 通过权重解锁内容
  • 新僵尸资源的制作和替代,资源配置可能会用role的不同动画来做,新类型角色包括自爆
  • 新的敌人的制作和替代,包括会跳跃的和带护盾的
  • 新道具的制作,包括挡板和炸弹
  • 单回合连续碰撞奖励,连续击杀奖励
  • 任务奖励系统
  • 研究ADMOB或其他

第三周 RD Weekly Review 11月21日 - 27日

11月21日

  • 绘制了屏幕下方的界面
  • 再次整理,删除了没用的界面和逻辑
  • 全局数据添加:globalturn用于控制游戏进度

11月22日

  • 添加了role的死亡效果,旋转坠落
  • 添加死亡音效
  • 制作了新道具档板,获得后在屏幕下方产生5个,可以反弹子弹
  • 档板碰撞一次就消失
  • 档板碰撞会加速,同时会恢复重力
  • 制作了新的敌人robot,出现在屏幕左侧,会发出激光
  • bullet碰到激光后生命-100

11月23日

  • 开始写全局控制刷怪的方法,暂时没用globalturn的方法

11月24日

  • 刷怪机制完成,配置了50关的循环
  • 制作了顶端UI
  • 绘制了notes界面的基础效果

11月25日

  • 添加police角色,增加护盾的功能(护盾数值显示逻辑有逻辑错误,暂时修复但原因不明)
  • 添加robot2

11月26日

  • 制作了忍者僵尸
  • 制作了拳击手僵尸
  • 制作了小屁孩僵尸*3

第四周 RD Weekly Review 11月28日 - 12月3日

11月27日

  • ADMOB申请和测试
  • 游戏打包APK
  • 制作了小丑,会闪避一次玩家攻击

11月28日

  • ADMOB测试完成
  • 连击系统,10连击显示nice shot,并给与金币奖励
  • 清屏奖励,清屏时显示perfect clear,并给与金币奖励

11月29日

  • 添加自爆矿工,没有生命值,可以对6格敌人一击必杀
  • 尝试修改数字排序的错误,暂时先把zsorter放到main里
  • 修改nice shot,触发时重置,即可重复触发
  • 修改防爆警察死亡不随路面移动的错误
  • 暂时关闭箭头的缩放效果
  • 暂时关掉等级气泡
  • 把游戏发到了indienova,算是正式公开了,同时在C2群里以及贴吧也发了一份

11月30日

  • 绘制新僵尸bomber
  • 下午和AV出来和咖啡,随意的聊了聊,了解了C2做的H5游戏无法加密,很容易被人盗走,需要做服务端验证或存储部分数据。AV推荐了野狗云。
  • 另外了解到了可以将GROUP开关提升效率的好方法
  • indienova和其他地方的整体反馈都不错,并得到了一些有意义的建议和改建思路

12月1日

  • 家里停水,白天躲到外面去了
  • 把bomber僵尸的功能完成了,添加了新道具bomb,在100turn以后刷
  • 添加了新的全局变量gold_thistime和gametimes,并存储到webstorage,用来记录这是第几次游戏,以及每次游戏获得的金币数量,数据名用gametimes拼出,这样多玩几次就能记录出大概每次获得多少金币的多条数据了
  • C2打折,查看了一下agreement,里面解释说个人版累计收益达到5000刀以上必须换商业版,90刀购买了个人版
  • 购买了绿光的权限
  • 尝试了导入字体,最后发现一直无法成功的smallfonts是因为.fon格式的问题。另外字体文件要放到texture里

12月2日

  • 绘制Dr.Dead的图
  • 设计升级界面
  • 突然有了感染僵尸的想法,打算加进去

12月3日

  • 将lv+2和lv+3道具制作完成
  • 绘制了mon1-3的尸变动画
  • 将感染状态制作完成,被感染的普通人类死后会变成僵尸弹射
  • 将升级方案定为以下几种:
    • 几率出现lv+2的道具
    • 几率出现lv+3的道具
    • 解锁ninja
    • 解锁boxer
    • 解锁kids
    • 解锁bomber
    • 解锁???(暂定为感染僵尸)
    • 增加kill loot
    • 增加gold loot
    • 增加wall的承受反弹次数
    • 增加初始登记
    • 增加mon1的感染概率
    • 增加mon2的感染概率
    • 增加mon3的感染概率
  • 增加以上功能所需变量并部分带入功能中
  • 修改了police的bug
  • 调整了难度
  • every100中添加了10层新的循环数据
  • 实验了一下自制spritefont

12月4日

  • 绘制了新角色感染者infecter
  • 添加感染者道具和僵尸,感染者碰到的普通人类会立刻感染
  • 修改了感染逻辑,解决了BUG(之前部分角色感染后没有效果反馈)
  • 制作了背景音乐,三段音乐以1-1-2-3的方式循环

第五周 RD Weekly Review 12月5日 - 12月11日

12月5日

  • 实现mute功能
  • 制作ability界面,可以选择和查看能力和说明
  • 使用了csv导入数据,目前添加数据为名字,说明,花费
  • 整理资源文件夹结构

12月6日

  • 添加全局变量store_lv控制购买进度排序,记录在webstorage
  • 使用gametimes控制第一次游戏不显示购买
  • 当store大于14(csv条目数)时,不显示购买
  • 添加csv字段seq控制道具开启顺序失败,逆向找index太复杂,添加一张新表解决
  • 暂时删除失败复活,修改为显示获得金币,当前turn和best,本次获得金币
  • 记录每个ability激活状态,存在webstorage

从11月7日开始的开发,至12月6日彻底完工,历时一个月。稍后将整理出开发日志。

12月7-8日

  • 制作游戏截图和视频,提交绿光
  • 中途因为发现截图和视频都是竖屏的感觉不好,于是开始大规模修改制作横屏版本
  • 修改了ability的存储bug
  • 修改了csv预读取的位置

12月9日

  • 绿光比想象中更排斥手机游戏的UI布局,在考虑要不要修改为PC端的方案:
    • 修改为键盘/手柄操作:
      • 方向箭头常态出现,左右键控制旋转,空格发射
      • 修改切换角色功能,上下切换
      • 修改开始游戏的界面,添加退出游戏,上下切换,空格确认
      • 修改商店界面,左右键选择,空格确认
    • 修改界面为左右布局
      • 左侧显示角色状态等级,金币获得,回合数
      • 右侧显示僵尸数量和切换,并常态显示能力激活状态
      • ESC呼出设置:音乐开关,帮助窗口,语言选择,退出游戏
    • 修改屏幕上下空间
  • 以上方案预估2天,而且似乎要单独拆分版本
  • 已完成键盘/手柄部分:
    • 操作发射。键盘为按住方向键上,之后调整角度空格发射,手柄为摇杆+A
    • 更换角色。左右键控制更换,如果没有则跳过
    • 商店界面左右键切换和确定
    • 开始游戏界面确定
  • 修改note界面导致按键短时间无效的BUG
  • 录入了Itch.io的游戏发布平台,并申请了Paypal账号,资料填写妥当但还未发布
  • Steam绿光70%反对,估计没戏了,但我还要努力尝试一下,修改UI风格和操作看看反馈,就当实验了。截图留念。

Image title

12月10-11日

  • 重新绘制了PC版界面,重新制作了截图和视频
  • 待解决问题:
    • Boxer导致被感染僵尸会穿透的问题
      • 墙面采用手写反弹方法,左右为180-self.angle,上为-self.angle
      • 去掉之前Boxer的关闭solid相关方法
      • 由于C2不提供solid反弹开关的action,改为默认关闭,碰撞再打开制定的obj
    • 开始游戏箭头会出现
    • 如何提示ability的详细信息?tooltips?不用鼠标怎么办?
    • 开始游戏画面修改为开始和退出游戏?或是之后就不再显示开始画面了,跳过按进入这一步
    • 新手教学
    • 以及note界面的开启方法
    • 音乐开关方法
    • 本地化方案

第六周 RD Weekly Review 12月12日 - 12月23日

12月12日

  • 制作了界面上的按键提示
  • rex的nickname似乎只能查找到一个实例,最后放弃
  • 修改了反弹次数不减的bug

12月13日

  • hhhh+1s
  • 和bilibili的人聊了一下B站明年要添加的独立游戏版块

12月14日

  • hentai和僵尸hentai
  • 手柄检测提示
  • 添加60关的间断和补充,现在到every100(目前是60)的上限时不再添加敌人,直至敌人杀干净再刷N行。为后续改变场景和小BOSS做准备
  • 修复感染僵尸时,动画未结束bulletnum变成0导致提前结束回合的BUG
  • 和indienova的人聊了一下发行,看来上steam需要做进一步的修改

整理一下新计划:

  • 音乐开关
  • 教学小动画
  • 本地化制作
  • 添加BOSS或奖励关卡
  • 绘制新地图并添加地图更换
  • 角色解锁功能
  • 开始游戏画面选择角色

12月15日

  • 设置界面制作完成,包括分辨率,语言,声音,重新开始游戏,退出游戏,回到游戏
  • 本地化开始制作,预计明天完成

Image title

12月16日

  • 本地化工作基本完成
  • ability暂时用tooltip
  • 绘制了疯王子僵尸

12月17日

  • 制作更换skin
  • 制作skin界面,目前卡在csv里的变量名上了

12月18日

  • 更好skin的激活的成就系统基础功能

12月19日-21日

  • skin系统整理,预计会包括以下skin:
    • skin1 蓝僵尸 默认激活
    • skin2 黄僵尸 蓝色人类击杀100
    • skin3 绿僵尸 绿色人类击杀100
    • skin4 特警僵尸 特警击杀50
    • skin5 小丑僵尸 小丑击杀50
    • skin6 机器僵尸 镭射机器人击杀50
    • skin7 普通矿工 矿工击杀100
    • skin11 疯王子 累计获得10000金币
    • skin8 变态 变态击杀10
    • skin9 单身狗 单身狗击杀10
    • skin12 G胖
    • skin13 印度诺娃 
    • skin10 咸鱼
    • skin20 长者 best 500

12月22日

  • 疯王子和Hentai添加进游戏,低几率出现掉落金币
  • 修复了webstorage的存储bug
  • BUG:小丑会反弹(小丑会反弹不会穿透了,因为小丑用的solid开关)
  • BUG:更换僵尸回合后会闪一下之前更换僵尸的BUG(目前锁定问题在更换皮肤上)

12月23日

  • 修复小丑BUG
  • 修复僵尸闪烁BUG
  • 添加分辨率存储功能,默认全屏
【经验】Steam4C2插件使用总结
potion 2017-02-26

我的RunningDead已经基本完成了,还在做最后的成就调试工作。虽然因为工作原因发布日期遥遥无期,但还是要趁现在把正在用的Steam4C2写一下使用总结,做个备忘。


1 准备工作

Steam4C2是C2的插件,使用者可以通过这款插件,结合steamwork的SDK进行steam游戏的接入开发。

在一切开始前,你需要有一款通过绿光的游戏,这样你会成为steamworks。虽然绿光很快就没了,但不妨碍,新的发行方式同样会使你成为steamworks的开发者。

在steam发布游戏,C2目前能够做到的方式只有使用NW.js将游戏打包为exe。其实如果你没有做steam成就或overlay的需求,那么通过绿光后直接用steamworks的工具包上传游戏包就行了。但如果你想要添加成就或overylayUI,那么就需要用到Steam4C2插件了。

那么首先第一步,你需要购买下载插件。目前插件分为basic版和完整版,据说完整版有更多的内容,比如steam云的操作以及使用steamwork的统计系统,这是我问作者问题的时候作者说的,具体没看到不好瞎说。但感觉basic版本已经够用了。

Steam4C2的插件分为不同的版本,下载时需要选择与NW版本对应的插件:


同时要确保你的steamworks的SDK下载的是最新的版本。

目前NW.js 0.19.2的插件版本针对于nw0.19.0-rc1似乎有BUG,最好避开

下载后的压缩包里包括3个文件:

NW19-rc1-Steam4C2-Basic-V1.3.c2addon是插件本体,直接将其拖入C2,点击安装后重启C2即可安装成功。

Basic_Features_list.pdf是功能说明文件,里面列举了basic版本中支持的各种功能

Quick_Start.pdf是简单的安装和使用说明,参考里面的内容安装你会被坑,请对照下面的部分避免被坑。


在你下载的steamworks文件夹内,找到redistributable_bin文件夹,在这个文件夹里可以看到以下文件:

将你需要dll文件导入到C2的Files文件夹里,在我的项目中,我只提供win64的版本,所以只导入了win64文件夹里的steam_api64.dll文件

其次,你需要将steam_app_id.txt导入Files文件夹里,这个文件内只存放一串ID,这个ID就是你的游戏在Steam的唯一数字ID。

注意!坑的地方来了!

appid是用来与你在steam的游戏ID做对应关系的,官方文档和steamwork提供的文件都是这steam_app_id.txt,然而我无论如何都无法调通。

最后我不得不写信给作者。他提示让我试试将文件名改为steam_appid.txt,奇迹发生了,我TM居然连上了。

所以各位如果遇到同样的问题,请修改文件名。

最终C2的Files里添加了这两个文件:

2 调试方法

好了,万事具备,可以开始正式使用插件了。

但在使用之前,你需要首先使用steamworks将自己的游戏进行第一次上传。这样以后你就可以不用每次都上传steam后再测试了。

而此时,在Steam的游戏库中就有你的游戏了,当然只有你自己能看到。


以下几点要注意

在C2中,使用预览是无法调试steam4C2功能的,必须导出NW.js

导出后可以测试steam是否连通,如果连通了,屏幕右下角就会弹出steam的小弹窗

导出后可以在本地测试steam的成就功能

OverlayUI的功能必须上传至steam,从steam打开的游戏才可以测试(Overlay就是steam自己的UI,可以打开steam的社区,聊天等东西,我这次没有使用)

Steam成就需要在steamwork的网站页面里配置后才能弹出,配置内容包括图片和名字,可以做本地化。这部分后面会细说。

Steam的游戏库中可以看到自己游戏的成就,但看起来会和其他已上线游戏不一样。其他游戏可以看到未解锁成就的ICON,但我自己的只能看到最近解锁的那个,锁定成就那里会出现+X的数字,这个应该是正式发布后才会正常的。

3 Steamworks成就配置

接下来,就可以开心的添加Steam成就了。

登陆你的steamworks,找到统计与成就的页签,选择进入成就界面。注意统计功能目前无法使用,自己写代码去连估计是可行的,或者按作者说的,买完整版插件。

点击新成就创建你的成就,其中API名称为C2里会使用到的成就的KEY,这个名字可以自己起,也可以干脆用默认的。

进度状态是与统计系统关联的,因为Basic版不支持,所以这次我没有使用。

显示名称和描述分别是成就的标题和描述,一般描述会写成就的达成条件。

设置部分不用管,隐藏功能可以使成就在steam的成就列表里隐藏,这次我隐藏了“长者”的成就。

两个图标,分别是已达成和未达成,需自己制作上传。图片需为64x64的JPG

保存后还可以再编辑,也可以删除。

在统计与成就的页签下还有一个成就本地化的页签,点开后可以开启不同语言版本的成就,我勾选了中文和英文:

一旦勾选,在成就界面就可以选择语言填写不同的成就描述了:

本地化成就还允许填写本地化字符串,可以做多语言成就的key使用。


一切都好了以后,成就就算添加完成了。使用steamworks的发行功能提交编辑的修改。


4 C2成就编写

以下是Steam4C2的event:

以下是action:


回到C2开始编写成就。涉及到成就达成的条件每个游戏都不一样,这里就不再赘述。

在我的游戏中,我使用了字典配置了所有24个成就的开启状态,并将这些值使用webstorage保存在本地。

当判断成就达成就Unlock对应的成就key:

因为成就只会Unlock一次,所以我也懒得再判断是否成就达成了就不再开启成就了。但测试的时候,可以自己设置快捷键重置成就状态。

最后一个小坑标注:因分辨率的不同使得游戏在全屏的情况下会出现左右的黑边裁切。而steam的成就tips很可能会因此被裁掉一半,感谢一下傅老师帮我解决了这个问题。修改全屏下的显示效果即可。

以下是最终的成就提示效果,不要在意右侧的成就调试信息……


另外,overlay虽然我没用到,也截个图给大家:


鉴于最近发生的一些事,最后标注一下 —— 本文只在Indienova发,请自觉勿转载。

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册