Cocos3.4以后移除了SystemEvent 改用input来注入键盘事件
所以要注册按键事件如下`
想使用什么事件就用什么事件
/**初始化 */
InitialWork() {
this.TheGameManager = find('Canvas/GameManager').getComponent(GameManager);
//按键注册
// this.node.on(Input.EventType.KEY_DOWN, this.KeyDownEvent, this) 这个用不了 不是这么用的
input.on(Input.EventType.KEY_DOWN, this.KeyDownEvent, this) //这个是单次按下一次
input.on(Input.EventType.KEY_UP, this.KeyUpEvent, this) //这个是单次放开按下一次
// input.on(Input.EventType.KEY_PRESSING, this.KeyDownEvent, this) //这个会持续触发
console.log('键盘初始化完成')
}
start() {
this.InitialWork()
}
因为key_pressing虽然会一直触发,但是他无法一开始就触发,他会停顿一下,我不想要这样的效果。我希望的是一按下就马上持续触发,所以还是得自己写一个状态,来控制摄像头移动。
这个是使用enum来方便我的使用
/**方向 */
export enum Direction {
/**上 */
'up' = 0,
/**下 */
'down' = 1,
/**左 */
'left' = 2,
/**右 */
'right' = 3,
/**居中 */
'mid' = 4
}
使用垂直和水平状态来确定
/**垂直状态 */
VerticalFlag: Direction = Direction.mid;
/**水平状态 */
HorizontalFlag: Direction = Direction.mid;
下面是摄像机移动相关的代码 不算很多
结合注释来看吧
//移动逻辑相关代码
/**垂直状态 */
VerticalFlag: Direction = Direction.mid;
/**水平状态 */
HorizontalFlag: Direction = Direction.mid;
/**移动速度 从GameManager中获取 */
CameraMoveSpeed: number = 1;
/**游戏系统管理器 */
TheGameManager: GameManager;
/**初始化 */
InitialWork() {
this.TheGameManager = find('Canvas/GameManager').getComponent(GameManager);
//按键注册
// this.node.on(Input.EventType.KEY_DOWN, this.KeyDownEvent, this) 这个用不了 不是这么用的
input.on(Input.EventType.KEY_DOWN, this.KeyDownEvent, this) //这个是单次按下一次
input.on(Input.EventType.KEY_UP, this.KeyUpEvent, this) //这个是单次按下一次
input.on(Input.EventType.KEY_PRESSING, this.KeyDownEvent, this) //这个会持续触发
console.log('键盘初始化完成')
}
start() {
this.InitialWork()
}
/**键盘被按下的时候的情况
* 会更改状态
*/
KeyDownEvent(key: EventKeyboard) {
let Camera = this.TheGameManager.GameCamera.node;
if (key.keyCode == KeyCode.KEY_A) {
this.HorizontalFlag = Direction.left
}
if (key.keyCode == KeyCode.KEY_D) {
this.HorizontalFlag = Direction.right
}
if (key.keyCode == KeyCode.KEY_S) {
this.VerticalFlag = Direction.down
}
if (key.keyCode == KeyCode.KEY_W) {
this.VerticalFlag = Direction.up
}
}
/**键盘被松开的时候的情况
* 会更改状态
* 因为防止左右两个按键同时按下 所以要再加一个对手按键是否被按下的判定
* 看一下当前状态是不是反过来就行
* 否则移动的时候会卡
*/
KeyUpEvent(key: EventKeyboard) {
let Camera = this.TheGameManager.GameCamera.node;
if (key.keyCode == KeyCode.KEY_A && this.HorizontalFlag != Direction.right) {
this.HorizontalFlag = Direction.mid
}
if (key.keyCode == KeyCode.KEY_D && this.HorizontalFlag != Direction.left) {
this.HorizontalFlag = Direction.mid
}
if (key.keyCode == KeyCode.KEY_S && this.VerticalFlag != Direction.up) {
this.VerticalFlag = Direction.mid
}
if (key.keyCode == KeyCode.KEY_W && this.VerticalFlag != Direction.down) {
this.VerticalFlag = Direction.mid
}
}
/**摄像头移动 */
CameraMoving() {
let DeltaPosX = 0
let DeltaPosY = 0
// 算一个X和Y的距离出来 给摄像机加上
if (this.HorizontalFlag != Direction.mid) {
DeltaPosX = this.CameraMoveSpeed * (this.HorizontalFlag == Direction.right ? 1 : -1)
}
if (this.VerticalFlag != Direction.mid) {
DeltaPosY = this.CameraMoveSpeed * (this.VerticalFlag == Direction.up ? 1 : -1)
}
if (DeltaPosX != 0 || DeltaPosY != 0) {
let Camera = this.TheGameManager.GameCamera.node;
Camera.setWorldPosition(new Vec3(Camera.getWorldPosition().x + DeltaPosX, Camera.getWorldPosition().y + DeltaPosY))
}
}
update() {
this.CameraMoving()
}