站内搜索

搜索
热搜: 活动 交友 discuz

iFAction 世界需要你的想象力!

利用种子生成随机地形的教程(新手向)

 

10

主题

51

帖子

452

积分

iF村庄

Rank: 5Rank: 5

积分
452
发表于 2020-5-2 10:48:46 | 显示全部楼层 |阅读模式
众所周知,IFA的众筹上是写着可以做泰拉瑞亚那样的游戏的

那我们怎么生成泰拉瑞亚那样的随机地形呢

以下是新手向内容(具有初中的数学知识即可),大神轻点喷/害怕。

先跟我拿出一张白纸,建立平面直角坐标系

随心所欲地在上面点10个点,像这样,随便点就好了

然后把它们连起来

观察一下,聪明的你已经明白了吧?

如果没有,把折线下方的区域涂黑

阴影区域就是我们要生成的地形

SO,esay,right?

再看这里,取两个相邻的点,把它们的坐标分别记为(x1,y1)和(x2,y2),设x1<x2

您刚才把他们连接起来了,不是吗?已知两点坐标,求经过这两点的直线公式,可以吧?直线记为l1

作直线l2:x=x3,x3∈(x1,x2)且x3为整数(毕竟是给游戏用)

求l1和l2交点,记为(x3,y3)。我们知道,当x3靠近x1时,y3也更接近y1,反之接近y2。不断用这样的算法,我们就能得到连续的地形了,也就是您之前连接的曲线。

现在把纸翻面或拿一张新的纸,不要看您刚才画的。

尝试把您刚才点的点在这张纸上再点一次。

很难,绝大多数人都做不到。但是我们有时希望能复现"随机"的结果,怎么办呢?

用下面这段代码就行了(这里用的是最简单的线性同余)
WL_Math.random = function(seed, range){
    var a = 123;
    var b = 456;
    var x = seed;
    var answer = [];
    for(i=0;i<range;i++){
        x = (a*x + b)%seed;
        if(i==0) continue;
        answer.push(x);
    };
    return answer;
};

a,b的值是可调的,通过调试找到不超过seed的最大周期(大雾)

以上就是全部内容,感谢您看到这里,留个言呗。
有心情再补图吧

10

主题

51

帖子

452

积分

iF村庄

Rank: 5Rank: 5

积分
452
 楼主| 发表于 2020-5-2 10:55:11 | 显示全部楼层
备注:如果您感兴趣,请百度“噪声函数”,此处只是入门而已

28

主题

316

帖子

4583

积分

iF世界

次元文明-Original Sin

Rank: 8Rank: 8

积分
4583

摩点支持者内测用户

QQ
发表于 2020-5-2 13:01:00 | 显示全部楼层

大佬太强了

8

主题

59

帖子

669

积分

iF村庄

Rank: 5Rank: 5

积分
669

摩点支持者内测用户

发表于 2020-5-2 14:18:58 | 显示全部楼层

感谢提供写MOD圈钱的思路(bushi

0

主题

101

帖子

1048

积分

iF城镇

Rank: 6Rank: 6

积分
1048

摩点支持者

发表于 2020-5-2 20:53:24 | 显示全部楼层


简直是神来之笔,一下子就可以做若瓜莱克游戏了

10

主题

51

帖子

452

积分

iF村庄

Rank: 5Rank: 5

积分
452
 楼主| 发表于 2020-5-2 21:04:35 | 显示全部楼层
youlong 发表于 2020-5-2 20:53
简直是神来之笔,一下子就可以做若瓜莱克游戏了

算法是普遍的,还要感谢官方的脚本可以被偷梁换柱。。。可惜要做类似元气骑士的随机类游戏需要另一种算法,这种算法并不适用。感谢你提醒了我,我看下能不能做出来。

点评

加油,楼主大神一定可以的  发表于 2020-5-3 00:45

10

主题

48

帖子

318

积分

iF平原

次元文明-Original Sin

Rank: 4

积分
318
发表于 2020-5-8 11:26:48 | 显示全部楼层
小雨微亮牛逼!
炫幻到此一游~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们
QQ群:977585123
iFAction下载
Windows客户端
反馈
意见建议
iFAction

iFAction

京ICP备15053274号-1

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.