【Cocos TypeScript 零基础 8.1】
双发子弹
增加一个mode属性控制
update(deltaTime: number) {
if (this.mode == 1) {this.bul1(deltaTime)}
else if (this.mode = 2) {this.bul2(deltaTime)}
}
bul1(deltaTime: number){
this.time1 += deltaTime
if (this.time1 >= this.rate) {
this.time1 = 0 // 重置发射计时
const zidan1 = instantiate(this.bullet1) // 实例化
this.zidan_weizhi.addChild(zidan1) // 位置上创建实体
let pw = this.node.getWorldPosition()
zidan1.setWorldPosition(pw.x,pw.y + 40,pw.z)
}
}
bul2(deltaTime: number){
this.time1 += deltaTime
if (this.time1 >= this.rate) {
this.time1 = 0 // 重置发射计时
const zidan1 = instantiate(this.bullet2) // 实例化
this.zidan_weizhi.addChild(zidan1) // 位置上创建实体
let pw = this.node.getWorldPosition()
zidan1.setWorldPosition(pw.x + 20,pw.y + 40,pw.z)
const zidan2 = instantiate(this.bullet2) // 实例化
this.zidan_weizhi.addChild(zidan2) // 位置上创建实体
pw = this.node.getWorldPosition()
zidan2.setWorldPosition(pw.x - 20,pw.y + 40,pw.z)
}
}
子弹碰撞回调销毁
start() {
let collider = this.getComponent(Collider2D);
if (collider) {collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)}
}
onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D) {
this.node.destroy()
}
子弹穿过敌机问题
老师也愚见了和我一样的问题
所有碰撞体Allow Sleep 取消选中 (休眠)
可以解决远距离不发生碰撞问题
敌机动画播放问题
播放指定动画需要名字
@property name1 : string = '' // 动画名前缀
this.anim.play(`${this.name1}_down`) // 播放死亡动画
延时
一直不知道怎么延时
this.scheduleOnce( 函数,时间 )
这个函数的意思是延时 时间(秒) 做函数动作
简易示例
this.scheduleOnce( // 延迟1次计时器
function(){this.node.destroy()}, // 方法销毁
2 // 时间(秒)
)
小技巧
@ccclass('ts_bullet_att')
代码里 名字对应的的是属性器里名字
碰撞规则
当前敌机之间是可以互相碰撞,并减少掉血的
所以需要去设置一个碰撞规则
这个图需要横着和竖着兼顾
勾选可以理解成 是否碰撞
再到属性栏去设置物理性质
玩家属性增加
增加受伤无敌时间
(老师的无敌方法是跳过扣血,播放动画等动作
我的地方法是关闭该组件)
增加血量
受伤播放受伤动画
死亡播放死亡动画
玩家完整代码
import { _decorator, Animation, Collider2D, Component, Contact2DType, EventTouch, input, Input, instantiate, math, Node, Prefab, Vec3 } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('ts_player')
export class ts_player extends Component {
@property(Prefab) bullet1 : Prefab = null // 子弹外观
@property(Prefab) bullet2 : Prefab = null // 子弹外观
@property mode : number = 1 // 子弹开火模式
@property rate : number = 0.4 // 子弹发射频率
time1 : number = 0 // 过去的时间
@property(Node) linshi : Node = null // 子弹临时生成位置
@property hp : number = 3 // 玩家初始血量
collider : Collider2D = null // 准备打开碰撞监听
@property(Animation) play : Animation = null // 准备播放动画
protected onLoad(): void { // 打开监听
input.on(
Input.EventType.TOUCH_MOVE, // 设置获取的类型
this.onmove, // 赋值给onmove函数
this
)
}
protected onDestroy(): void { // 关闭监听
input.off(
Input.EventType.TOUCH_MOVE,
this.onmove,
this
)
}
onmove(event:EventTouch){ // 飞机移动函数
const p = this.node.position; // 获取坐标
let pos1 = new Vec3( // 创建一个新的变量.来存储将要变更坐标,以便于判断
p.x + event.getDeltaX(), // 当前X坐标 + 移动的X坐标
p.y + event.getDeltaY(),
)
if (pos1.x < -240) pos1.x = -240 // 限制左边
if (pos1.x > 240) pos1.x = 240 // 限制右边
if (pos1.y < -426) pos1.y = -426 // 限制下边
if (pos1.y > 426) pos1.y = 426 // 限制上边
this.node.setPosition(pos1.x , pos1.y) // 设置新的位置
}
start() { // 应该类似于初始化函数
this.collider = this.getComponent(Collider2D);
if (this.collider) {this.collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)} // 打开触发回调 开始触发
}
onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D) { // 碰撞开始触发函数
this.hp -= 1
if (this.hp <= 0) {
this.play.play(`player_down`)
this.scheduleOnce(function(){this.node.destroy()},2) // 2秒后销毁玩家 在des外面必须套一层fun
}else {
this.play.play(`player_hit`)
this.enabled = false // 关闭触发器?表示该组件自身是否启用
this.scheduleOnce(function(){this.enabled = true},1) // 打开触发器,形成1秒无敌时间
}
}
update(deltaTime: number) { // 开火模式控制
if (this.mode == 1) {this.bul1(deltaTime)}
else if (this.mode = 2) {this.bul2(deltaTime)}
}
bul1(deltaTime: number){
this.time1 += deltaTime
if (this.time1 >= this.rate) {
this.time1 = 0 // 重置发射计时
const zidan1 = instantiate(this.bullet1) // 实例化
this.linshi.addChild(zidan1) // 位置上创建实体
let pw = this.node.getWorldPosition()
zidan1.setWorldPosition(pw.x,pw.y + 40,pw.z)
}
}
bul2(deltaTime: number){
this.time1 += deltaTime
if (this.time1 >= this.rate) {
this.time1 = 0 // 重置发射计时
const zidan1 = instantiate(this.bullet2) // 实例化
this.linshi.addChild(zidan1) // 位置上创建实体
let pw = this.node.getWorldPosition()
zidan1.setWorldPosition(pw.x + 20,pw.y + 40,pw.z)
const zidan2 = instantiate(this.bullet2) // 实例化
this.linshi.addChild(zidan2) // 位置上创建实体
pw = this.node.getWorldPosition()
zidan2.setWorldPosition(pw.x - 20,pw.y + 40,pw.z)
}
}
}
死亡后不发射子弹?
我都把玩家都销毁了,发射子弹不存在的
现在觉得玩家飞机都可以做成精灵
游戏开始时生成
原文地址:https://blog.csdn.net/adminwxs/article/details/145121574
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!