设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2661|回复: 44
打印 上一主题 下一主题

[有事请教] 想知道怎么才能使新旧两个数组不同

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
跳转到指定楼层
1
发表于 2022-3-16 19:54:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
500星屑
本帖最后由 任小雪 于 2022-3-16 20:09 编辑

想知道怎么才能使类似以下的新旧两个变量(其实是数组)最终变得不同
var person = new Object();
var person2 = person;
person.name = 'jack';
console.log(person.name);//jack
console.log(person2.name);//jack
嗯,其实是想两个新旧数组不同,具体,是因为$dataMap的事件和$gameMap的事件需要用到,想搞个无限生成新事件的脚本,然后姿势不够。
push和slice的用法都自学掌握了一点了,但。。。总之就是姿势不够。
不知道这个问题解决起来复杂不复杂,要是太复杂就算了。

赋值这东西,真发现新的遗漏姿势点呢,虽然冷还被恶心到了
摸索了一个下午的成果是发现新旧变量总是会互相干扰(如果是一开始直接旧的给新的赋值的话),因为作为测试的事件是传送阵,所以最好的结果是,一触发赋值和push,旧传送阵和新传送阵就重叠着一起跑向xy设置的坐标点,没错,真的是跑

最佳答案

查看完整内容

var eventTest1 = $dataMap.events[1]; eventTest1.note = '1'; var eventTest2= JsonEx.makeDeepCopy(eventTest1); eventTest2.note = '2'; console.log(eventTest1.note );//1 console.log(eventTest2.note );//2 我看你上面的回答…… 你若是想复制事件可以搜索“复制事件”。

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
来自 2楼
 楼主| 发表于 2022-3-20 08:08:28 | 只看该作者
本帖最后由 任小雪 于 2022-3-20 08:10 编辑

◆脚本:var a=JsonEx.makeDeepCopy($dataMap.events[5]);
:  :a.id=$gameMap._events.length;
:  :a.x=0;
:  :a.y=0;
:  :$dataMap.events[$gameMap._events.length]=a;
:  :console.log($dataMap.events);
◆脚本:var a=JsonEx.makeDeepCopy($gameMap._events[5]);
:  ://a._eventId=$gameMap._events.length;//实测发现是这句有问题,现在注释掉的话,会导致新旧事件共用一个事件(也可能是ID)
:  :a._realX=0;
:  :a._realY=0;
:  :a._x=0;
:  :a._y=0;
:  :a.x=0;
:  :a.y=0;
:  :$gameMap._events[$gameMap._events.length]=a;
:  :console.log($gameMap._events);
◆脚本:SceneManager.goto(Scene_Map);

点评

唔,可能最终是因为$gameMap没法随意增减,只能读取$dataMap,而以上我改的$dataMap,不是实际的$dataMap?  发表于 2022-3-20 10:25
回复

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12065
在线时间
1413 小时
注册时间
2020-3-21
帖子
365

极短23获奖

3
发表于 2022-3-16 19:54:28 | 只看该作者
var eventTest1 = $dataMap.events[1];
eventTest1.note = '1';
var eventTest2= JsonEx.makeDeepCopy(eventTest1);
eventTest2.note = '2';

console.log(eventTest1.note );//1
console.log(eventTest2.note );//2

我看你上面的回答……
你若是想复制事件可以搜索“复制事件”。

点评

image图像只生成一个,我再研究一波,  发表于 2022-3-16 22:42
好  发表于 2022-3-16 22:40
回复

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36407
在线时间
10794 小时
注册时间
2009-3-15
帖子
4813
4
发表于 2022-3-16 20:12:04 | 只看该作者
本帖最后由 soulsaga 于 2022-3-16 20:17 编辑

assign
JAVASCRIPT 代码复制
  1. var person2 = JSON.parse(JSON.stringify(person)


点评

也许是我的想法和mv本身的机制还差那么一点,啧  发表于 2022-3-16 21:45
这个法子貌似失败了($dataMap可以,另一个不行),events.isStarting is not a function,嗯再试试小怪兽的  发表于 2022-3-16 21:38
好,谢了  发表于 2022-3-16 20:19
网上搜JS拷贝  发表于 2022-3-16 20:17
主要是想要新数组从旧数组身上得到所有数据,然后,对新数组做部分修改时,不影响旧数组的数值(是解决这个东西的法子吧?)  发表于 2022-3-16 20:16
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
5
发表于 2022-3-16 20:19:50 | 只看该作者
这是因为你赋值后,引用类型的变量地址指向的是同一块堆内存,所以会相互影响。

点评

搜索到的东西有点复杂,嗯,我研究一下  发表于 2022-3-16 20:37
希望有用能用,然后无限生成新事件能做成(虽然貌似新生成的传送阵很怪,希望到时不会..难道先弄个通用的空事件,用的时候让其传送在生出新事件..  发表于 2022-3-16 20:32
要我说的话,直接用ES6的extends关键字继承是最方便的。  发表于 2022-3-16 20:31
下午几个钟已经收获这个冷知识了,所以才来问,js拷贝?  发表于 2022-3-16 20:21
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
6
发表于 2022-3-16 20:55:36 | 只看该作者
本帖最后由 小怪兽奇奇侠 于 2022-3-16 21:11 编辑

我的想法其实很简单,不复杂,就是你新创建一个子类,让这个子类继承父类就可以,就拿你的代码举例,可以这样改一下:
class Obj{constructor(){}}
var person = new Obj();
person.name = 'jack';
class Person2 extends Obj{}
person2=new Person2()
person2.name='rose'
console.log(person.name + person2.name) //jackrose

点评

貌似成功了,我再改改就发出来  发表于 2022-3-16 22:24
更准确来讲是无法用new实例化的  发表于 2022-3-16 22:24
我刚刚看了一下,你所说的datamap是静态类,无法被继承的。  发表于 2022-3-16 22:23
unexpected identifier  发表于 2022-3-16 21:59
那个用$dataMap.events[1]举个例子?不过,我感觉mv新事件的生成的机制,和我的想法还有不少的差距,也许。。。还是日常搞不定  发表于 2022-3-16 21:52
回复

使用道具 举报

Lv5.捕梦者

梦石
16
星屑
12065
在线时间
1413 小时
注册时间
2020-3-21
帖子
365

极短23获奖

7
发表于 2022-3-16 22:08:39 | 只看该作者
var person = new Object();
person.name = 'jack';

var person2 = JsonEx.makeDeepCopy(person);
person2.name = 'nick';

console.log(person.name);//jack
console.log(person2.name);//nick


深拷贝(新开内存区将数据复制过来)与浅拷贝(只传递数值地址指针)的区别。

点评

好像还是。。。二者的事件是同一的,我再看看  发表于 2022-3-16 22:26
成功啦!  发表于 2022-3-16 22:23
还真的是啊,嗯,还有一半,不知道最终能不能行  发表于 2022-3-16 22:20
core文件里面是有的,奇怪了。。。大佬能不能以$dataMap.events[1]举个例子?  发表于 2022-3-16 22:18
直接复制吧,输的话总输错。这里的x是小写,而不是大写…… 绝大部分插件需要深拷贝的时候用的都是这个接口。  发表于 2022-3-16 22:18
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
8
 楼主| 发表于 2022-3-16 23:23:48 | 只看该作者
本帖最后由 任小雪 于 2022-3-16 23:53 编辑

◆注释:事件复制脚本,
:  :有瑕疵,只能看(暂时走到这里,有空有需要再继续研究,嗨~)。
:  :
//◆脚本:
var a=JsonEx.makeDeepCopy($dataMap.events[5]);
a.id=$dataMap.events.length;
a.x=0;
a.y=0;
$dataMap.events.push(a);
console.log($dataMap.events);
//◆脚本:
var a=JsonEx.makeDeepCopy($gameMap._events[5]);
a._eventId=$gameMap._events.length;
a._realX=0;
a._realY=0;
a._x=0;
a._y=0;
a.x=0;
a.y=0;
$gameMap._events.push(a);
console.log($gameMap._events);
//◆脚本:
SceneManager.goto(Scene_Map);

点评

可能可以参考图块载入那里: return $dataMap.events这种形式或者把相关的代码那一段改一下?  发表于 2022-3-18 09:18
发现不能简单地goto,否则,不确定$gamemap会不会变为空(忘了测试,不过,如果给变空的那里的设置开关条件,设置特定条件如生成事件时不变空不知...  发表于 2022-3-17 23:13
才想起来,$dataMap.events还是$gameMap._events是没有长度的。。。不过也不排除还有其他问题,唉,后面再探究吧  发表于 2022-3-17 00:51
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
9
 楼主| 发表于 2022-3-18 16:35:13 | 只看该作者
本帖最后由 任小雪 于 2022-3-18 17:45 编辑

◆注释:成功但没有完全成功,
:  :暂时发现生成新事件后,
:  :大概是少了获取事件id的法子(可能只是与被复制事件有关的,不过,也可能不只是id,而是整个this)
也可能单纯只是原本的this不行,然后,具体到某个之后却可以?
◆脚本:
:  :Game_Event.prototype.event = function() {
:  :if(this._eventId){
:  :    return $dataMap.events[this._eventId];
:  :}else{
:  :    return $dataMap.events[5];
:  :};
:  :};
◆脚本:Game_Event.prototype.findProperPageIndex = function() {
:  :if(this.event()){    var pages = this.event().pages;
:  :}else{    var pages = $dataMap.events[5].pages;};
:  :    for (var i = pages.length - 1; i >= 0; i--) {
:  :        var page = pages;
:  :        if (this.meetsConditions(page)) {
:  :            return i;
:  :        }
:  :    }
:  :    return -1;
:  :};
◆脚本:Game_Event.prototype.page = function() {
:  :if(this.event()){
:  :    return this.event().pages[this._pageIndex];
:  :}else{
:  :    return $dataMap.events[5].pages[this._pageIndex];
:  :};
:  :};
◆脚本:var a=JsonEx.makeDeepCopy($dataMap.events[5]);
:  :a.id=$gameMap._events.length;
:  :a.x=0;
:  :a.y=0;
:  :$dataMap.events[$gameMap._events.length]=a;
:  :console.log($dataMap.events);
◆脚本:var a=JsonEx.makeDeepCopy($gameMap._events[5]);
:  :a._eventId=$gameMap._events.length;
:  :a._realX=0;
:  :a._realY=0;
:  :a._x=0;
:  :a._y=0;
:  :a.x=0;
:  :a.y=0;
:  :$gameMap._events[$gameMap._events.length]=a;
:  :console.log($gameMap._events);
◆脚本:SceneManager.goto(Scene_Map);

大佬们有没有什么简单的建议

点评

虽然估计可以通过方向和坐标有限地获取事件的id,但是,这个法子也有极限(事件不能重叠)  发表于 2022-3-18 18:37
暂时只能猜测原因是触碰时,无法获取当前被触碰事件的id  发表于 2022-3-18 18:36
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
26
在线时间
701 小时
注册时间
2021-3-24
帖子
549
10
发表于 2022-3-18 17:33:21 | 只看该作者
直接转字符串在转回来...
全家活光光~
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
11
 楼主| 发表于 2022-3-18 17:49:38 | 只看该作者
清澈淌漾 发表于 2022-3-18 17:33
直接转字符串在转回来...

指两个数组之间的js拷贝吗?那个已经解决了,现在只是在摸索着复制事件(看过芯大佬和仇九大佬的,然后,思路跟我不一样,我暂时水平也真的不够,而我的法子的……现在是只能复制后,几乎只能看(如果只有一个事件的n个复制事件,是可以的,但是两个及以上就暂时行不通,也可能还有其他bug)……具体,说不清,因为我真的不太懂

点评

算了,又到了该放弃的时候了……  发表于 2022-3-18 18:29
一个实体类和另一个实体类的区别就是 基本属性 比如一个方块的 x y 颜色 缩放 当然事件的属性更多,分出来 基础属性 就大概清楚了  发表于 2022-3-18 18:09
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-18 14:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表