首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
安装和启动
Dashboard使用
Hello World 项目
项目结构
制作2D 游戏
环境搭建
创建主角
创建第一个脚本
制作地图
完善角色
制作动画
播放动画
游戏管理器
相机和卷轴
菜单制作
游戏状态
绑定按钮事件
监听跳跃结束
层级
完整代码
当前位置:
首页>>
技术小册>>
cocos游戏开发入门
小册名称:cocos游戏开发入门
PlayerController: ``` import { _decorator, Component, Vec3, EventMouse, input, Input, Animation } from "cc"; const { ccclass, property } = _decorator; export const BLOCK_SIZE = 40; @ccclass("PlayerController") export class PlayerController extends Component { @property(Animation) BodyAnim:Animation = null; private _startJump: boolean = false; private _jumpStep: number = 0; private _curJumpTime: number = 0; private _jumpTime: number = 0.1; private _curJumpSpeed: number = 0; private _curPos: Vec3 = new Vec3(); private _deltaPos: Vec3 = new Vec3(0, 0, 0); private _targetPos: Vec3 = new Vec3(); private _curMoveIndex: number = 0; start () { //input.on(Input.EventType.MOUSE_UP, this.onMouseUp, this); } setInputActive(active: boolean) { if (active) { input.on(Input.EventType.MOUSE_UP, this.onMouseUp, this); } else { input.off(Input.EventType.MOUSE_UP, this.onMouseUp, this); } } reset() { this._curMoveIndex = 0; } onMouseUp(event: EventMouse) { if (event.getButton() === 0) { this.jumpByStep(1); } else if (event.getButton() === 2) { this.jumpByStep(2); } } jumpByStep(step: number) { if (this._startJump) { return; } this._startJump = true; this._jumpStep = step; this._curJumpTime = 0; const clipName = step == 1 ? 'oneStep' : 'twoStep'; const state = this.BodyAnim.getState(clipName); this._jumpTime = state.duration; this._curJumpSpeed = this._jumpStep * BLOCK_SIZE/ this._jumpTime; this.node.getPosition(this._curPos); Vec3.add(this._targetPos, this._curPos, new Vec3(this._jumpStep* BLOCK_SIZE, 0, 0)); if (this.BodyAnim) { if (step === 1) { this.BodyAnim.play('oneStep'); } else if (step === 2) { this.BodyAnim.play('twoStep'); } } this._curMoveIndex += step; } onOnceJumpEnd() { this.node.emit('JumpEnd', this._curMoveIndex); } update (deltaTime: number) { if (this._startJump) { this._curJumpTime += deltaTime; if (this._curJumpTime > this._jumpTime) { // end this.node.setPosition(this._targetPos); this._startJump = false; this.onOnceJumpEnd(); } else { // tween this.node.getPosition(this._curPos); this._deltaPos.x = this._curJumpSpeed * deltaTime; Vec3.add(this._curPos, this._curPos, this._deltaPos); this.node.setPosition(this._curPos); } } } } ``` GameManager.ts: ``` import { _decorator, CCInteger, Component, instantiate, Label, math, Node, Prefab, Vec3 } from 'cc'; import { BLOCK_SIZE, PlayerController } from './PlayerController'; const { ccclass, property } = _decorator; enum BlockType { BT_NONE, BT_STONE, }; enum GameState { GS_INIT, GS_PLAYING, GS_END, }; @ccclass('GameManager') export class GameManager extends Component { @property({ type: Prefab }) public boxPrefab: Prefab | null = null; @property({ type: CCInteger }) public roadLength: number = 50; private _road: BlockType[] = []; @property({ type: Node }) public startMenu: Node | null = null; @property({ type: PlayerController }) public playerCtrl: PlayerController | null = null; @property({ type: Label }) public stepsLabel: Label | null = null; start() { this.setCurState(GameState.GS_INIT); this.playerCtrl?.node.on('JumpEnd', this.onPlayerJumpEnd, this); } init() { if (this.startMenu) { this.startMenu.active = true; } this.generateRoad(); if (this.playerCtrl) { this.playerCtrl.setInputActive(false); this.playerCtrl.node.setPosition(Vec3.ZERO); this.playerCtrl.reset(); } } setCurState(value: GameState) { switch (value) { case GameState.GS_INIT: this.init(); break; case GameState.GS_PLAYING: if (this.startMenu) { this.startMenu.active = false; } if (this.stepsLabel) { this.stepsLabel.string = '0'; // 将步数重置为0 } setTimeout(() => { //直接设置active会直接开始监听鼠标事件,做了一下延迟处理 if (this.playerCtrl) { this.playerCtrl.setInputActive(true); } }, 0.1); break; case GameState.GS_END: break; } } generateRoad() { this.node.removeAllChildren(); this._road = []; // startPos this._road.push(BlockType.BT_STONE); for (let i = 1; i < this.roadLength; i++) { if (this._road[i - 1] === BlockType.BT_NONE) { this._road.push(BlockType.BT_STONE); } else { this._road.push(Math.floor(Math.random() * 2)); } } for (let j = 0; j < this._road.length; j++) { let block: Node | null = this.spawnBlockByType(this._road[j]); if (block) { this.node.addChild(block); block.setPosition(j * BLOCK_SIZE, 0, 0); } } } spawnBlockByType(type: BlockType) { if (!this.boxPrefab) { return null; } let block: Node | null = null; switch (type) { case BlockType.BT_STONE: block = instantiate(this.boxPrefab); break; } return block; } onStartButtonClicked() { this.setCurState(GameState.GS_PLAYING); } checkResult(moveIndex: number) { if (moveIndex < this.roadLength) { if (this._road[moveIndex] == BlockType.BT_NONE) { //跳到了空方块上 this.setCurState(GameState.GS_INIT); } } else { // 跳过了最大长度 this.setCurState(GameState.GS_INIT); } } onPlayerJumpEnd(moveIndex: number) { if (this.stepsLabel) { this.stepsLabel.string = '' + (moveIndex >= this.roadLength ? this.roadLength : moveIndex); } this.checkResult(moveIndex); } } ```
上一篇:
层级
该分类下的相关小册推荐:
暂无相关推荐.