飞机大战知识点总结
上一节03已经实现了飞机的触摸跟随功能,这节实现简单的子弹发射功能,实现的效果图如下
1.制作子弹的Prefab,实现单发的发射功能
2. 把子弹的图片移动到Canvas
下,并定位到飞机前方,
3. 在Script
文件内创建子弹Bullet.ts
,将Bullet.ts
添加到组件中
4. assets
文件内创建Prefabs文件
用来存放预制体,将上一步的子弹图片Bullet1
拖进Prefabs文件
,
5. 删除Canvas
下的Bullet1
文件,后边我们直接从Prefabs预制体中
拿子弹
Bullet.ts
子弹的发射逻辑
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('Bullet')
export class Bullet extends Component {
// 子弹飞行速度,每秒400
@property
speed:number = 400;
update(deltaTime: number) {
// position:获取当前位置
const pos = this.node.position;
// 设置飞行距离为y轴的:pos.y+this.speed*deltaTime
this.node.setPosition(pos.x,pos.y+this.speed*deltaTime,pos.z)
}
}
上边完成的单发的逻辑,
下边实现第一张图的效果,继续编写上一节03的Player.ts
import { _decorator, Component, EventTouch, Input, input, instantiate, Node, Prefab, Vec3 } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('Player')
export class Player extends Component {
/**
* 先定义以下字段
* sendRate:number 子弹发射频率
* sendTime:number 子弹发射时间
* bulletParent:Node 用来存放所有生成的子弹
* bulletPost1:Node 第一种子弹的世界坐标位置
* bulletPrefab1:Prefab 第一种子弹的预制体
*
* 逻辑分析:
* 判断发射时间,sendTime+=dt >= sendRate 就需要发射子弹了,将sendTime重置为0
* 通过instantiate(bulletPrefab1)拿到子弹1的预制体,赋值给bullet1
* 生成的所有子弹都要放在文件bulletParent内,所有通过addChild()方法,将bullet1 添加进去
* 最后设置bullet1的世界坐标位置为:bulletPost1的worldPosition
*/
@property
sendRate:number = 0.5;
sendTime:number = 0;
@property(Node)
bulletParent:Node = null;
@property(Node)
bulletPost1:Node = null;
@property(Prefab)
bulletPrefab1:Prefab = null;
protected update(dt: number): void {
this.sendTime += dt;
if(this.sendTime>= this.sendRate){
this.sendTime = 0;
const bullet1 = instantiate(this.bulletPrefab1)
this.bulletParent.addChild(bullet1)
bullet1.setWorldPosition(this.bulletPost1.worldPosition)
}
}
// 下边是上一届触摸的内容,可忽略
protected onLoad(): void {
// 1. 注册触摸事件
input.on(Input.EventType.TOUCH_MOVE,this.onTouchMove,this);
}
protected onDestroy(): void {
// 2.注销触摸事件
input.off(Input.EventType.TOUCH_MOVE,this.onTouchMove,this);
}
// 触摸方法
onTouchMove(event:EventTouch){
// this.node.position:获取自身Player的位置
// event中 getDeltaX(),getDeltaY():用来获取移动过程中的位置偏移
// 通过这个偏移,来控制Player的位置偏移
// this.node.setPosition:设置x,y,z轴的位置
const p = this.node.position;
// 要移动的:目标坐标
let targetPos = new Vec3(p.x+event.getDeltaX(),p.y+event.getDeltaY(),p.z);
if(targetPos.x < -230){
targetPos.x = -230
}
if(targetPos.x > 230){
targetPos.x = 230
}
if(targetPos.y < -380){
targetPos.y = -380
}
if(targetPos.y > 380){
targetPos.y = 380
}
this.node.setPosition(targetPos)
}
}
把对应的文件拖进去
需要注意bulletPost1
距离飞机的位置,也就是子弹发射的位置,是跟随飞机的。