笔记:自由/约束的绳索效果

始终在吃瓜前线 :yum:

对了,你们嘲笑我我真的不在乎,心里一点波动都没有,我不是小孩,早就不在乎别人的看法了。你们如果想让我难受,你们就把你们的烂代码拿出来,我看不了烂代码,我看到烂代码会头痛,给你们的友情提示。
不带代码的贴我不会再回复了(但是会看,看你们气急败坏的样子),不想浪费时间,而且手也累了。

心里没有波动就不会在这BB了。

你说得对,去这里骂,别打扰楼主。骂我的来这里,不要打扰其他人

  1. 你在指责楼主把问题复杂化而让你愤怒
  2. 楼主的文章是5年前的
  3. 楼主的文章并没收钱,是分享的。
  4. 如果你遇到有困惑,不妨直接在楼层请教,如有更好的建议,建议你用更好的措辞提出解决方案,让更多和你一样有同样困惑的人,因为你的建议而拨云见日。

Cocos自带的也可以实现,不过,楼主的方法确实可以尝试

理解但不赞同。技术分享本来就是自愿的行为,就像捐款一样,你总不能指责别人捐的少吧?看到不满意或者不对的答案你可以发表自己的观点和建议,但是吐槽和抱怨纯属无效沟通浪费时间。

名词的含义难道不是更便于交流嘛?楼主明显是教学的,都解释了名词的含义了。你这明显是自己狭隘了,单纯觉得别人炫技、装B。如果不用名词,那三角函数为什么要有cos、sin、tan,大家都说这个边比那个边嘛?

鸦哥,分享还要躺枪 :laughing:

  1. 你跟我们讨论的不是同一个问题,你这个是真模拟(物理引擎的模拟),这里讨论的是假模拟,不带任何物理效果。
  2. 你这种方法模拟出来很真实,但是非常消耗性能,性能其实都不重要,重要的是关节多了之后cocos的物理引擎容易崩溃。
  3. 你试试用50个紧挨着的圆形之间用关节连在一起模拟一下,稍微移动一下就崩溃了。
  4. 你试试用10个圆形,每个圆形之间间隔一定距离来模拟。你会发现每两个圆形之间的间隔还得用直线来绘制,那就不像绳子了。
  5. 你试试用10个紧挨着的长条矩形,之间用关节连在一起,来模拟。你会发现只有限制了关节旋转角度在正负20度的时候才会比较真实。但是真实的绳子,每个节点之间是没有角度限制的。
  6. 这里讨论的是假模拟,不依靠物理引擎,节点可以任意多,在我的电脑上1000个节点没有任何压力。用1000个紧挨着的小圆点来模拟一条绳子,你觉得会不会很真实呢?但是没有物理效果。

我同意你的第1条观点,接收到了第2.3条观点,不认同你的第4条观点,因为我是带着解决方案骂的街。所以你想给我传达的意思是,骂人是不对的,是吧?

我同意我狭隘,我不同意你的其他观点。

原来带着解决方案就可以骂街吗
我按lz的方法十分钟写出来了, 比你写的简单多了, 你自己看不懂就来骂分享的?完了自己弄出来在这秀优越感吗

带着解决方案不可以骂街,我错了。
但是以后我看到没有意义的代码我还是会骂。
不仅是别人的代码,我自己的代码我也会骂。
如果你看了原文,你会知道我没有在秀优越感,如果秀优越感,我会着重强调我的方案哪里好,但是我并没有。我只是把子节点跟随父节点的逻辑写了出来,扔在哪里给其他人看。
把你的方案拿出来,给大家用一下。
感谢

lineTestUI.ts
import * as cc from 'cc';

import {lineTestRope} from './lineTestRope';

const {ccclass,property} = cc._decorator;

@ccclass('lineTestUI')

export class lineTestUI extends cc.Component {

    _touchLocation: cc.Vec2;

    _arrayRope: cc.Node[] = [];

    start () {

        let root = this.node.getChildByPath("root");

        this._arrayRope = root.children;

        for (let i = 0;i < this._arrayRope.length;i++) {

            if (!this._arrayRope[i].getComponent(lineTestRope)) {

                this._arrayRope[i].addComponent(lineTestRope);

            }

        }

    }

    protected onEnable (): void {

        this.node.on(cc.Node.EventType.TOUCH_START,this.onTouchMove,this);

        this.node.on(cc.Node.EventType.TOUCH_MOVE,this.onTouchMove,this);

    }

    /**触摸移动 */

    onTouchMove (event: cc.EventTouch) {

        let start_pos = event.getUILocation();

        this._touchLocation = start_pos;

        this.calcNodePos();

    }

    /**计算节点位置 */

    calcNodePos () {

        for (let index = this._arrayRope.length - 1;index >= 0;index--) {

            let script = this._arrayRope[index].getComponent(lineTestRope);

            if (index == this._arrayRope.length - 1) {

                script.calcSelf(this._touchLocation);

            } else {

                let last = this._arrayRope[index + 1].getComponent(lineTestRope);

                script.calcSelf(last.getSelfPoint());

            }

            script.calcTarget();

        }

    }

}


lineTestRope.ts
import * as cc from 'cc';

const { ccclass, property } = cc._decorator;

@ccclass('lineTestRope')

export class lineTestRope extends cc.Component {

    _ptSelf: cc.Vec2;

    _angle: number;

    _length: number;

    _ptTarget: cc.Vec2;

    start() {

        let pos = this.node.getWorldPosition();

        this._ptSelf = cc.v2(pos.x,pos.y);

        this._ptTarget = cc.v2(pos.x,pos.y);

        this._length = 30;

    }

    /**传目标节点位置和自身节点计算自身节点位置 */

    calcSelf (ptTarget: cc.Vec2) {

        let target_pos = ptTarget.clone();

        let dir = target_pos.subtract(this._ptSelf).normalize();

        this._angle = Math.atan2(dir.y,dir.x);

        dir = dir.multiplyScalar(-1 * this._length);

        this._ptSelf = ptTarget.add(dir);

        this.node.setWorldPosition(this._ptSelf.x,this._ptSelf.y,0);

    }

    /**根据自身节点坐标算出目标节点坐标 */

    calcTarget () {

        let dx = this._length * Math.cos(this._angle);

        let dy = this._length * Math.sin(this._angle);

        this._ptTarget = cc.v2(this._ptSelf.x + dx,this._ptSelf.y + dy);

    }

    getSelfPoint () {

        let pos = this.node.getWorldPosition();

        return cc.v2(pos.x,pos.y);

    }

    getTargetPoint () {

        return this._ptTarget;

    }

}

照着写的, 我写的烂

就是看你原文了哥们, 一晚上没弄出来给你弄着急了

  1. getTargetPoint这个函数有什么用?
  2. _ptTarget这个数据谁用了?
  3. 这个逻辑复杂到要拆分出lineTestRope.ts这个文件吗?
  4. 你拆分出了lineTestRope.ts这个文件,告诉我你要在那种情况下复用它?
  5. 你写一堆没有的代码,是在给准备看你代码的人挖的坑吗?
  6. 你是想要分享给其他人看,还是想自己做个笔记?
  7. 如果是想做自己的笔记,去用印象笔记。
  8. 如果你想给别人看,请把你的代码打扮的干净利落。

额, 因为我只抄了lz的根节点自由的实现代码, 但复制的时候都复制了, 那个数据和函数是约束根节点的代码里面的, 你这挑刺可以, 认
写着玩的, 帖子我收藏了, 想用的时候随时改写一个很简单

活久见,你们要用技术一较高下么,这么玩我真插不上话了

我不是针对谁,我是说在座的各位,写的都不能真正商用,太小朋友过家家了