RectBlockView.ts 3.06 KB
// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html

import { MapView } from "../kernel/battle/map/MapView";
import { RectBlockData } from "../kernel/battle/map/RectBlockData";
import BlockView from "./BlockView";
import RectBlockCollider from "./RectBlockCollider";

const { ccclass, property } = cc._decorator;

@ccclass
export default class RectBlockView extends BlockView {

    get owner(): RectBlockData { return this._owner as RectBlockData }

    private _offsetX: number = 0;
    private _offsetY: number = 0;

    private _colliderNode: cc.Node;

    //#region  LIFE-CYCLE CALLBACKS:

    // onLoad () {}

    init(owner: RectBlockData, mapView: MapView): void {

        this._offsetX = owner.viewPixelPosX - owner.pixelPos.x;
        this._offsetY = owner.viewPixelPosY - owner.pixelPos.y;

        this._colliderNode = this.node.getChildByName('collider');
        this._colliderNode.removeFromParent();
        this._colliderNode.setPosition(owner.viewPixelPosX, owner.viewPixelPosY);
        mapView.colliderLayer.addChild(this._colliderNode);
        this._colliderNode.getComponent(RectBlockCollider).setMainNode(this.node);
        this._colliderNode.getComponent(cc.PhysicsBoxCollider).size.width = owner.widthPixel - 2; //大格子碰撞体缩小一些,避免被三角格子包围时穿透
        this._colliderNode.getComponent(cc.PhysicsBoxCollider).size.height = owner.heightPixel - 2;

        super.init(owner, mapView);

        this._light && this._light.setContentSize(this.owner.widthPixel, this.owner.heightPixel);
    }

    protected onImageLoaded(): void {
        this._img.setContentSize(this.owner.widthPixel + 6, this.owner.heightPixel + 6); //格子图片边缘有3像素的空白,撑满
    }

    protected onUpdateMoveState() {
        this._needMove = (this.node.position.y != (this.owner as RectBlockData).viewPixelPosY);
    }

    protected onPositionChange(x: number, y: number): void {
        super.onPositionChange(x, y);

        let viewPosX = x + this._offsetX;
        let viewPosY = y + this._offsetY;

        this._img.setPosition(viewPosX + this._imgOffset.x, viewPosY + this._imgOffset.y);
        this._imgEffect.setPosition(viewPosX, viewPosY);
        this._txt.setPosition(viewPosX + this._txtOffset.x, viewPosY + this._txtOffset.y);
        this._imgSkillIcon.setPosition(viewPosX, viewPosY);

        this._colliderNode.setPosition(viewPosX, viewPosY);
        this._light && this._light.setPosition(viewPosX, viewPosY);
    }

    onDead(): void {
        this._colliderNode.destroy();
        super.onDead();
    }

    // protected onDestroy(): void {
    //     this._colliderNode = null;
    // }

    // update (dt) {}

    //#endregion

    //#region public

    setColliderEnable(value: boolean) {
        this._colliderNode.getComponent(cc.PhysicsCollider).enabled = value;
    }

    //#endregion
}