1
2
3
4
5
6
7
title:这是后面补充的

后面我又进一步的体验了这款游戏,游戏在恐怖氛围的营造上让人印象深刻,谜题的设计上中规中矩,游戏的交互和操作上不尽人意,使用键盘游玩更是地狱。

对应于它恐怖游戏的


# 小小梦魇

小小梦魇,一直都听说是一个不错的游戏,但是实际上我上手玩了一下之后,我深刻地意识到了这可能是我今年玩过的第一款大便。

实际上,这款游戏按照比较客观地评价来说,应该不算是烂,而算是中庸地一个设计,但是问题是,我给它的期望很高,但是这款游戏的操作手感……着实让人难受。

下面我会指出几个我认为游戏中做的比较好的和垃圾的几点:

优点:

电门-电线-开关

这个结构确实是一个十分常见的解密元素的设计,电线作为一个线状的东西可以很好的引导玩家的视线,从而做到引导玩家进行解密。

但是在本作中,游戏巧妙地运用了拖动视野这个功能将这个解密设得十分精妙。

游戏的第一章中,有一关需要将电门断电,我以为是要对边上的一个配电箱进行操作,但是根本碰不到那个配电箱。过了一会儿,游戏提示我需要按住上下左右拖动视野。

不看不知道,一拖动视野,赫然看见从屋顶拉了根线,拉向我刚刚进来时打开的门的后面。再次将门关上,霍,原来是个开关,在这个门的后面。

或许 [[灵感:拖动你那受限的视野]] 可以作为一个独立游戏的核心机制设计?

游戏的氛围渲染

总体来说,游戏营造了一个孤独恐怖的氛围,这一点做的还不错。

缺点

接下来我要骂骂咧咧地写下这个游戏的缺点了

nt的引导设计

游戏中没有任何的初次引导,甚至连什么按钮对应什么功能都没告诉我。确实,我们一般推崇没有硬性引导的游戏,但是这并不代表游戏就应该直接把引导的部分删去。

哪里能上去?哪里需要俯身?哪里可以进行攀爬?都没有告诉玩家。玩家需要自己摸索,只有在你两分钟还卡在一个位置,游戏才会告诉你啊,按什么按键有什么功能?

这丝毫不合理,所能带给玩家的只有挫败感,游戏在很多的时候都会有这这样的问题。

不明确的引导设计

游戏中没有明确的引导设计,你基本上不知道你需要干什么,或者是需要往哪里走。带给玩家的感受就是,哦,貌似我需要通过这扇门,而在更糟糕的情况下,玩家根本不知道需要做什么。

这个游戏又不像是 mc,或者是其他的没有明确的引导设计的游戏一样,那些游戏的答案没有定数,可以说是条条大路通罗马;或者说主线之外的东西带给了玩家十分丰富的探索体验。

在《小小梦魇》中,玩家能选择的只有一条路,这毕竟是解密类的游戏,这样的设计无可厚非,更多的额外地方,应该是作为彩蛋的。但是游戏中又并没有明显地将游戏的主要内容和彩蛋部分划分开来,甚至在彩蛋中添加了本身只应该存在在主要部分中的标志性烛灯和蘑菇人。

我tm在那个彩蛋的部分找了半天有没有前进的路,最后查攻略才知道这tm只是个彩蛋而已,而正确的路在上一个房间。

  • 玩家不知道这是彩蛋还是核心的关卡
  • 玩家不知道正确的路应该是在哪里

不明确的操作反馈

在玩小小梦魇的时候,我一直在想,给这些东西是干什么用的。

具体而言:这个能爬吗?这个跳的上去吗?这个能被推动吗?这个地上的纸是有什么用吗?

然而如果有人拿着问我这个问题,我能回答的也只有是:试试之后才能知道。

“无意义的设计”游戏中有很多这种设计:不单是无意义,更多的还有是欺骗玩家的设计。

抓取投掷功能

在第一大关中,你丫的抓取抛掷功能只能用于触发彩蛋,那么请问,你tm地上设计那么多可以抓取的,可以抛掷的东西有什么用?

你说是为了营造氛围?那你就设计一个可以与主角产生物理效果不就行了,取消掉左键拾取谢谢。
你说是为了丰富游戏的内容?抱歉,仅仅是这样的东西并不能提高游戏的趣味性,它没有任何的功能,而且也并不有趣。

跳跃功能

首先,你并不能够通过一个物体的高度判断它能不能被爬上去,同样高度的物品有可能你能抓住并且爬上去,也有可能,你只能攀上去……

其次,就算是同一个物体,侧面爬不上去,但是欸,你给他换个位置又能爬上去了。

这对于玩家的感知判断具有极大的干扰性,并且给予了玩家极大的挫败感。

寻找一个攀爬点需要我寻找半天,之前从未告诉我过冰箱的隔层是可以当作梯子攀爬的,后面在需要攀爬网状格子的时候也从来网状的格子的笼子实际上是可以攀爬的。当我以为就这样的时候,游戏又让你卡在一个地方,直到你发现哦,锁链也是能够攀爬的。

不确定,这是游戏给我最大的感受,什么东西能爬,什么东西不能。

拖拽物品

问一下玩这个游戏的人:什么物品可以被拖拽?抱歉我也不知道,我只知道当你认为不能拖动的时候往往它可以被拖动。

在游戏中的一关里,玩家需要拆除一个被钉上的木板,才能进入出口。同样的主角,能扯动钉了钉子的模板,拖不动一个木板。

这还不可笑吗吗?游戏中出现了十分明显的引导缺失。

实际上游戏中提示你冰箱可以被拉开的时候设计得就不错呀,在冰箱上面有一个黑手印,这样不就行了,在玩家见到拖拽的物品得时候全部给它打上黑手印……

举个例子:双人成行中,但凡是需要钉钉子的木板,都被涂上了鲜艳的黄色,玩家永远不会陷入:我的钉子到底要钉在哪里? 的窘迫境地。

视角模式与操作模式

简而言之就是 3d游戏,2d视角。

游戏的x轴

游戏采用了2.5d中较为偏向于平面的一个视角,在这种视角下,游戏三维空间的“深度“并不能被很好的感知。但是游戏中却设计了许多需要对玩家所处的深度进行操作的场景。

在双人成行中,当视角切换为较为横板的视角的时候,一方面,玩家的操作方式会变为横板游戏的操作方式,另外一方面,游戏的x轴也会变得对于游戏而言不重要。

在这样的视角之下,跑酷、躲避水蛭……都变成了一件无比折磨的事情。

冗余的宽容

在游戏中,玩家时常可以走到建筑的后面去,而这个时候,走到后面并没有什么作用,既不能带来丰富的体验,玩家判断自己的位置甚至都存在困难,那么这个时候,你设计一个可以建筑的后方有什么用呢?

在游戏的狗屎的操作手感+固定视角的加持之下,看不到主角在哪里成为了一个十分ex的体验。

在第一章的某一关中,我因为被一个小小的突起卡住了而无法前进,而且这个地方我看不见主角……

阅读全文 »

# 杂谈
# 设备

新买的显示器总是会或多或少有一些颜色的偏差,至于我的屏幕则在初始状态下发绿,在sRGB和DP-3模式下显得发红。

如何调整显示器的显示模式使其恢复到标准的显示模式成为了一个学问。

阅读全文 »

# 杂谈
# 设备

这是我第一次购买显示器这一类电脑外设……总而言之也是挺折磨的一次购物体验……
或许是我个人的原因?反正我挑挑挑选选了半天才找到合适的电脑。 从了解电脑显示器的各种指标属性,再到收集数据,最后通过按照各种指标的重要性给其综合打分,并计算性价比……

我认为这样的一套选择方式是可以最大程度帮助我选择到自己心仪的产品的。

阅读全文 »

# matlab

在写脚本的时候用到这些功能并不多,但是偶尔还是需要用到,每次都得重新查……这次整理一下记录几个常见的控制程序走停的函数pause、input、error、warning、quit、exit、。

阅读全文 »

MATLAB的编程环境下,和数学上的矩阵是一个意义(坐标索引从 1 开始)。我们多使用矩阵和向量这两个数学意义上的数据结构。

所以以下把多维(除一维)数组称为矩阵,一维数组称为数组或向量。对于那种每一维的长度不同的多维数组,在matlab和数学研究中,我们一会给它补0,变成矩阵。
1、1*n的矩阵是一维数组(向量)
2、 m*n的矩阵是m(m>1)维数组

1
2
3
4
5
6

这里提供了三种比较常用的办法,其一般使用场景如下:
- size() 矩阵(二维)
- length()数列(一维)
- ndims() 高维矩阵(三维)

1 size()

1.1 功能

主要用来获得矩阵的各个维数的大小,或者指定维数的大小。

1.2 语法

size():获取矩阵的行数和列数

1
2
3
4
d = size(X)
[m,n] = size(X)
m = size(X,dim)
[d1,d2,d3,...,dn] = size(X)
  1. s = size(A),当只有一个输出参数时,返回一个行向量,该行向量的第一个元素是矩阵的行数r,第二个元素是矩阵的列数c。即s = [r, c]
  2. [r, c] = size(A),当有两个输出参数时,size函数将矩阵的行数r返回到第一个输出变量,将矩阵的列数c返回到第二个输出变量。
  3. 如果在size函数的输入参数中再添加一项,并用1或2为该项赋值,则size将返回矩阵的行数或列数。
    其中:
    r = size(A,1):返回的时数组A的行数
    c = size(A,2) :返回的时数组A的列数

2 length()

2.1 功能

用来获得数组长度,即一维数组的长度或者多维数组中最大的维数行数或列数中的较大值

2.2 语法

1
numberOfElements = length(array)

length()size()使用区别:一般情况下,
获取一维数组的长度用length()函数;
获取多维数组的维数大小用size()

3 numel()

3.1 功能

计算一个数组所有的元素数或指定下标的元素总数。

3.2 语法

1
2
n = numel(A)
n = numel(A, index1, index2, ...indexn)

4 ndims()

4.1 功能

获取矩阵的维数

一般来说,多维数组我们用数学意义上的矩阵来理解。多维矩阵,从数学意义上来理解,即矩阵的元素不是数字。

4.2 语法

1
n = ndims(A)

4.3 例子

1
2
3
4
5
6
7
n1 =  ndims( [1 2 3;4 5 6] );   % n1 = 2  二维矩阵

a = cat( 3,[1 2 3;4 5 6],[5 6 7;8 9 10] );
n2 = ndims(a) % n2 = 3 三维矩阵
% a 是构造的三维矩阵,第一层是[1 2 3;4 5 6],第二层是[5 6 7;8 9 10]

n3 = size(a) % n3 = [2,3,2],即2行3列2层。
阅读全文 »

# matlab

(一)基本运算与矩阵输入

1 创建数组

一维数组称为向量,二维数组称为矩阵
可以使用中括号“[ ]”,直接输入数值来创建数组,也可以通过MATLAB内置函数来创建特殊数组

1.1 直接创建

元素间使用空格或者英文逗号间隔,使用英文分号执行换行操作

1
2
3
4
5
6
7
>>A=[1 2 3;4 5 6;7 8 9]

A =

1 2 3
4 5 6
7 8 9
阅读全文 »

# matlab

一、语法知识

1、循环控制语句:

1)for~end:用于要求重复多次执行for与end之间的程序语句。允许嵌套。其一般格式为

1
2
3
4
5
for 变量 = 起始值 :增量 :终点

程序语句

end %一般要输出循环运算结果,还应在end后加“,变量名”,运行时按enter键

2)while~end:与c++类似,while也不规定循环次数,其终止时刻由while后面的条件表达式决定,若条件成立,则重复执行while与end之间的程序语句,否则结束循环。其一般格式为

1
2
3
4
5
while 条件表达式

程序语句

end   %与for~end语句类似,要想输出运算结果,在end后加“,变量名”,再按enter键
2、条件选择语句

1)if~end:其一般格式为

1
2
3
4
5
if 逻辑表达式

程序语句

end
2)ifelseif···elseend:elseif~else是进一步的if条件语句,其一般格式为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if 逻辑表达式1

   程序语句1

elseif 逻辑表达式2

程序语句2

······

else

程序语句n

end

1
【注意:在多分支条件选择语句中,if和elseif是互相独立且互相排斥的条件选择语句,else后的语句执行的条件是先前所有的条件语句均不成立】

3)switch~end:开关语句是一种多分支条件选择语句,他执行特定选择语句,当且仅当变量或表达式的值相符。其一般格式为

1
2
3
4
5
6
7
8
9
10
11
12
13
switch 表达式

case值1
程序语句

case值2
程序语句

······

otherwise
程序语句
end

阅读全文 »

# matlab

简单for循环

for循环用来循环处理数据。
例:输出1~100的和

1
2
3
4
5
6
7
8
9
10
>> clear
>> sum = 0;
>> for i = 1:100
sum = sum +i;
end
>> sum

sum =

5050

解释:i从1到100,每次增加一个,该共循环100次
注意:分号的位置;不能使用“+=”符号;每写一层循环,必须以end结尾

带有步长的for循环

例:输出1到10之间的奇数和

1
2
3
4
5
6
7
8
9
10
11

>> clear
>> sum = 0;
>> for i = 1:2:10
sum = sum + i;
end
>> sum

sum =

25

解释:i = 1:2:10中间的2表示步长,表示从1到10,每次增加2,即1,3,5,7,9五个数之和;步长也可以为负数

对向量和矩阵的遍历

  1. 对向量的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>> clear
>> A = rand(1,4);
>> for i = A
i
end

i =

0.9572


i =

0.4854


i =

0.8003


i =

0.1419

解释:rand函数用于随机生成0~1之间的数,rand(1,4)生成1*4的列向量。

  1. 对矩阵的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
>> A = magic(4);
>> A

A =

16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

>> for i = A;
i
end

i =

16
5
9
4


i =

2
11
7
14


i =

3
10
6
15


i =

13
8
12
1

解释:magic(n)函数用于生成任意一行或一列或主副对角线之和相等的方阵,对矩阵的循环遍历是依次取出矩阵中的每一列元素

break和continue的使用

break用于终止离它最近的一层for循环;
continue用于跳过离它最近的一层for循环,接着执行下一次循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>> x = 1;
>> for i = 1:2:10
if i > 7
break
else
x = x* i
end
end

x =

1


x =

3


x =

15


x =

105
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
>> sum = 0;
>> for i = 1:6
if i == 4
continue
else
sum = sum + i
end
end;

sum =

1


sum =

3


sum =

6


sum =

11


sum =

17

多层for循环

for循环可以按照需要进行嵌套。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
>> for i = 1:2:6
for j = 1:3
y = i * j
end
end

y =

1


y =

2


y =

3


y =

3


y =

6


y =

9


y =

5


y =

10


y =

15

阅读全文 »

# matlab

前言

函数——是编程的核心概念之一,是能够完成相对独立功能的代码封装成的模块。

在主程序中通过函数名和实参调用它,通过接口(即函数的输入、输出参数)来实现“通讯”。所以在调用函数时,你只要知道“被调用的函数是用来做什么的”,以及“如何对应它的输入、输出参数”就行了。

阅读全文 »
0%