目录
- 敌机
- 敌机通用逻辑
- 制作动画
- 制作另外的敌机
- 制作自动生成敌机
- 整理自己实验写的
敌机
- 创建一个空节点 (绑定敌机逻辑,敌机相关都可以存在此节点下,编程更有逻辑,便于后续维护)
- 制作 prefab
- 制作销毁动画
- 制作第二个敌机
- 敌机0自动生成
敌机通用逻辑
老是创建了2个空节点?
父节点通用,
子节点显示? (不太理解)
创建新脚本,绑定到敌机父节点上
写通用代码 (系统自带的就没有粘贴出来了)
typescript">export class TS_enemy extends Component {
@property speed : number = 200 // 敌机移动速度 属性面板优先
start() {
}
update(deltaTime: number) {
const pos1 = this.node.position
this.node.setPosition(
pos1.x,
pos1.y - deltaTime * this.speed // 敌机向下走
)
if (pos1.y < -852) this.node.destroy() // 到底自动销毁
}
}
制作动画
body 用来播放动画
- 选中 body
- 添加动画组件
- 新建动画资源 enemy0_down
- 无法在空节点上创建 spirit 动画
- 直接在敌机上创建 spirit 动画
- 动画编辑 > 属性 > cc.spirit > spiritFrame
- 添加关键帧
- 保存 (场景左上角保存) 再关闭
小技巧 空关键帧
动画设置完后再额外多复制一帧
选中多的一帧,删除图片 (不是删除关键帧)
完成后在代码里调试一下看动画是否播放
再编辑下代码
typescript">import { _decorator, Animation, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('TS_enemy')
export class TS_enemy extends Component {
@property speed : number = 200 // 敌机移动速度 属性面板优先
@property kill : number = 0 // 判断子弹是否击中敌机
@property(Animation) anim_down : Animation = null // 建立动画绑定位,准备绑定
start() {
if (this.kill == 1) this.anim_down.play() // 播放动画
}
update(deltaTime: number) {
const pos1 = this.node.position
this.node.setPosition(
pos1.x,
pos1.y - deltaTime * this.speed // 敌机向下走
)
if (pos1.y < -852) this.node.destroy() // 到底自动销毁
}
}
运行动画无异常,不知道后续有没有问题,我现在cocos版本 3.8.5
敌机属性
敌机0属性
小技巧
在选择 Animation 的时候,如果选错
在 import 中删除,再写可以重新选择
制作另外的敌机
在场景中复制粘贴就好
修改贴图
再制作动画,详细步骤请参考之前章节
制作自动生成敌机
关键代码
typescript">@property enemy_retime_0 : number = 1 // 敌机0刷新间隔
@property(Prefab) enemy0 : Prefab = null // 敌机0模板 生成绑定位
this.schedule(this.birth0,this.enemy_retime_0) // 设置定时器 (调用方法 , 定时)
完整代码
typescript">import { _decorator, Component, instantiate, math, Node, Prefab } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('TS_enemy_sheng')
export class TS_enemy_sheng extends Component {
@property enemy_retime_0 : number = 1 // 敌机0刷新间隔
@property enemy_retime_1 : number = 10
@property enemy_retime_2 : number = 30
@property(Prefab) enemy0 : Prefab = null // 敌机0模板 生成绑定位
@property(Prefab) enemy1 : Prefab = null
@property(Prefab) enemy2 : Prefab = null
start() {
this.schedule(this.birth0,this.enemy_retime_0) // 设置定时器 (调用方法 , 定时)
}
update(deltaTime: number) {
//if (deltaTime > this.enemy_retime_0){this.birth0} // 有定时器这个没必要
}
protected onDestroy(): void { // 关闭
this.unschedule(this.birth0) // 关闭敌机0定时器
}
birth0(){
const en0 = instantiate(this.enemy0) // 实例化
this.node.addChild(en0) // 创建实体
const posx = math.randomRangeInt(-215,215) // 随机x轴位置
en0.setPosition(posx,852) // 设置生成物的坐标
}
}
整理自己实验写的
应为自己依葫芦画瓢,自己写的代码
自己添加的属性乱七八糟的
现在整理调整了一下,暂时看没问题
总结如下
- 先构建精灵样本 (定义精灵,怎么叫无所谓,要明白那个意思)
- 精灵样本里放动画,下面放 body
- body 里放行动 TS脚本
- 精灵拖进资源列生成 prefab 文件
(prefab 本来想说这应该才是完整精灵,但是一想还没有受打击外观改变,仅仅只有动画还没触发,也还没设定碰撞体积,但是可以简单理解成完整精灵) - enemy 空节点上绑定生成敌机逻辑 TS脚本
如下图
上图 boby 属性不知道写的对不对,不对的话后续再改
小技巧
在编辑 hit 动画 (受打击动画) 时,如果不还原状态 (比如只有1帧的受打击动画)
可以在第二帧加上原图片,
我自己运行发现敌机1敌机2不动
重新生成精灵,很快的
把移动脚本绑定到精灵上,不要绑定到空节点 boby 上
运行就可以正常刷新,正常移动了
还是那句话,有问题后续再改