12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import { _decorator, Component, RigidBody, Collider, v3, MeshRenderer, MeshCollider, CCObject, Vec2, Vec3, ERigidBodyType } from 'cc';
- import { GameNode } from './GameNode';
- import { Main } from './Main';
- const { ccclass, property } = _decorator;
- @ccclass('TileItem')
- export class TileItem extends Component {
- static TileItem: any;
- auto_rotation = false;
- collider: Collider[] = [];
- rigid: RigidBody = null;
- removed:boolean=false
- removedPos:Vec3//消除的时候做一个向中间靠拢的动画
- playRmovedEff:boolean=false
- private static starttime = Date.now();
- private static getY() {
- let n = Date.now() - this.starttime;
- return n / 10;
- }
- start() {
- this.collider = this.node.children[0].getComponents(Collider);
- }
- //禁用碰撞
- _enableCollider: boolean = false;
- set enableCollider(b) {
- let worldRotation = this.node.children[0].worldRotation.clone();
- this.node.worldPosition = this.node.children[0].worldPosition.clone();
- this.node.children[0].position = v3();
- this.node.children[0].worldRotation = worldRotation;
- this.rigid.useGravity = b;
- // this.collider.enabled = b;
- // this.rigid.enabled = b;
- }
- get enableCollider() {
- return this._enableCollider;
- }
- destoryCollider() {
- this.node.children[0].position = v3();
- this.node.children[0].eulerAngles = v3()
- this.collider.map(a => a.enabled = false)
- this.rigid.destroy();
- }
-
- addCollider(): RigidBody {
- let _render = this.node.children[0].getComponent(MeshRenderer);
- this.rigid = _render.node.addComponent(RigidBody);
- this.collider.map(a => a.enabled = true)
- return this.rigid;
- }
-
- update() {
- if(this.auto_rotation) {
- this.node.setRotationFromEuler(0, TileItem.getY(), 0);
- }
- if(this.rigid.isValid){
- /*let plate = Main.I._GameNode.plate;
- const gooseWorldPos = this.node.worldPosition;
- const plateWorldPos = plate.worldPosition;
- // 检测是否超出盘子范围(示例:XZ 平面限制)
- const maxX = 2, maxZ = 2; // 盘子半径
- if (Math.abs(gooseWorldPos.x - plateWorldPos.x) > maxX ||
- Math.abs(gooseWorldPos.z - plateWorldPos.z) > maxZ) {
- // 施加反向力(推回盘子中心)
- const forceDir = new Vec3(
- plateWorldPos.x - gooseWorldPos.x,
- 0,
- plateWorldPos.z - gooseWorldPos.z
- ).normalize().multiplyScalar(10); // 力的大小
- this.rigid.applyForce(forceDir);
- }*/
- }
- }
- }
|