关于Egret Wing输出乱码解决方法

一丶问题

最近更新Egret发现,项目构建时会输出各种乱码,在网上也发现很多开发者同样出现这种问题,也没成功解决。
私下捣鼓了好久终于找到解决办法。(但是鉴于本人水平较差,只知道解决,不知道问题出现具体原因,望大神指导指导)

二丶解决

方法一:比较无奈的方法,卸载Egret Wing和Egret,一定要卸载干净,然后重装。(网上某位大佬的做法,虽然 也没找到原因,但是亲测有效!)
方法二:找到自家电脑里的node.js并删除,重装node.js,乱码会消失。(据说是因为电脑里自带的node.js或者是安装Egret时顺带的node.js有损坏)

目前亲测以上两种方法有效,但不保证都能解决各位的问题。。。欢迎各路大神补充解决方法(~o ̄3 ̄)~

<think>我们首先需要明确用户的需求:在EgretWing中开发一个简单的贪吃蛇游戏。EgretWingEgret引擎配套的IDE,但注意引用[1]提到Egret官方不再维护,不过用户已经决定使用Egret,并且有一个开源框架可用。因此,我们将基于Egret引擎和EgretWing IDE来编写贪吃蛇游戏。 步骤: 1. 环境准备:安装Egret引擎和EgretWing IDE。 2. 创建项目:使用EgretWing创建一个新项目。 3. 编写游戏逻辑:包括蛇的移动、食物生成、碰撞检测等。 4. 使用Egret的图形API绘制游戏界面。 5. 运行和调试。 由于引用[1]提到有一个开源的Egret游戏开发使用框架,但用户没有提供具体链接,所以我们先以基础方式实现。 详细步骤: 1. 环境准备 - 确保已经安装了Node.js(因为Egret是基于Node.js的)。 - 从Egret引擎安装:通过npm安装Egret。 ```bash npm install -g egret ``` - 下载并安装EgretWing IDE(可从Egret官网下载,尽管官方不再维护,但旧版本仍可用)。 2. 创建项目 - 打开EgretWing,选择“新建项目”,选择“游戏”项目,输入项目名称(例如:SnakeGame),选择路径,然后创建。 - 创建完成后,项目结构如下: ``` SnakeGame/ ├── src/ # 源代码 │ ├── Main.ts # 入口文件 │ └── ... ├── resource/ # 资源文件 ├── egretProperties.json # 项目配置文件 └── ... ``` 3. 编写游戏逻辑(在src目录下) - 我们将创建几个类:GameMain(主游戏类)、Snake(蛇类)、Food(食物类)等。 a. 修改Main.ts,初始化游戏: ```typescript class Main extends egret.DisplayObjectContainer { public constructor() { super(); this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this); } private onAddToStage(event: egret.Event) { // 游戏主循环 let game = new GameMain(); this.addChild(game); } } ``` b. 创建GameMain.ts(在src目录下): ```typescript class GameMain extends egret.DisplayObjectContainer { private snake: Snake; private food: Food; private timer: egret.Timer; // 用于定时移动蛇 public constructor() { super(); this.init(); } private init() { // 创建蛇和食物 this.snake = new Snake(); this.food = new Food(); // 将食物放在随机位置 this.food.setPosition(this.getRandomPosition()); this.addChild(this.snake); this.addChild(this.food); // 初始化定时器,每200毫秒移动一次 this.timer = new egret.Timer(200); this.timer.addEventListener(egret.TimerEvent.TIMER, this.onTimer, this); this.timer.start(); // 监听键盘事件 this.stage.addEventListener(egret.KeyboardEvent.KEY_DOWN, this.onKeyDown, this); } private onTimer(event: egret.TimerEvent) { // 移动蛇 this.snake.move(); // 检查是否吃到食物 if (this.snake.getHeadPosition().x == this.food.x && this.snake.getHeadPosition().y == this.food.y) { this.snake.grow(); // 蛇变长 this.food.setPosition(this.getRandomPosition()); // 重新放置食物 } // 检查碰撞(边界和自身) if (this.checkCollision()) { this.timer.stop(); console.log("Game Over"); } } private onKeyDown(event: egret.KeyboardEvent) { // 根据按键改变蛇的方向 switch (event.keyCode) { case egret.Keyboard.UP: this.snake.changeDirection(Direction.UP); break; case egret.Keyboard.DOWN: this.snake.changeDirection(Direction.DOWN); break; case egret.Keyboard.LEFT: this.snake.changeDirection(Direction.LEFT); break; case egret.Keyboard.RIGHT: this.snake.changeDirection(Direction.RIGHT); break; } } private getRandomPosition(): egret.Point { // 生成一个随机位置(注意:需要根据舞台大小调整) let x = Math.floor(Math.random() * this.stage.stageWidth / 20) * 20; let y = Math.floor(Math.random() * this.stage.stageHeight / 20) * 20; return new egret.Point(x, y); } private checkCollision(): boolean { // 检查边界 let head = this.snake.getHeadPosition(); if (head.x < 0 || head.x >= this.stage.stageWidth || head.y < 0 || head.y >= this.stage.stageHeight) { return true; } // 检查是否撞到自己 return this.snake.checkSelfCollision(); } } ``` c. 创建Snake.ts: ```typescript // 方向枚举 enum Direction { UP, DOWN, LEFT, RIGHT } class Snake extends egret.Sprite { private body: egret.Point[] = []; // 蛇身,每个元素是一个点(坐标) private direction: Direction; private size: number = 20; // 每个身体块的大小 public constructor() { super(); // 初始化蛇:长度为3,水平方向 this.body.push(new egret.Point(200, 200)); this.body.push(new egret.Point(180, 200)); this.body.push(new egret.Point(160, 200)); this.direction = Direction.RIGHT; // 绘制蛇 this.draw(); } // 绘制蛇 private draw() { this.graphics.clear(); for (let i = 0; i < this.body.length; i++) { this.graphics.beginFill(0x00FF00); // 绿色 this.graphics.drawRect(this.body[i].x, this.body[i].y, this.size, this.size); this.graphics.endFill(); } } // 移动蛇:根据方向移动 public move() { // 根据方向计算新的头部位置 let head = this.body[0]; let newHead = new egret.Point(head.x, head.y); switch (this.direction) { case Direction.UP: newHead.y -= this.size; break; case Direction.DOWN: newHead.y += this.size; break; case Direction.LEFT: newHead.x -= this.size; break; case Direction.RIGHT: newHead.x += this.size; break; } // 将新的头部添加到身体数组的开头 this.body.unshift(newHead); // 移除尾部(如果没有吃到食物,则移除尾部,而吃到食物时我们调用grow方法不删除尾部) this.body.pop(); // 重新绘制 this.draw(); } // 改变方向 public changeDirection(dir: Direction) { // 防止直接反向(例如:当前向右,不能直接向左) if ((this.direction == Direction.UP && dir == Direction.DOWN) || (this.direction == Direction.DOWN && dir == Direction.UP) || (this.direction == Direction.LEFT && dir == Direction.RIGHT) || (this.direction == Direction.RIGHT && dir == Direction.LEFT)) { return; } this.direction = dir; } // 蛇变长(吃到食物时调用) public grow() { // 在尾部添加一个元素(移动时就不会移除尾部,所以长度加1) let tail = this.body[this.body.length - 1]; this.body.push(new egret.Point(tail.x, tail.y)); } // 获取头部位置 public getHeadPosition(): egret.Point { return this.body[0]; } // 检查自身碰撞 public checkSelfCollision(): boolean { let head = this.body[0]; // 从第1个开始(因为头部是第0个) for (let i = 1; i < this.body.length; i++) { if (head.x == this.body[i].x && head.y == this.body[i].y) { return true; } } return false; } } ``` d. 创建Food.ts: ```typescript class Food extends egret.Sprite { private size: number = 20; public constructor() { super(); this.draw(); } private draw() { this.graphics.clear(); this.graphics.beginFill(0xFF0000); // 红色 this.graphics.drawRect(0, 0, this.size, this.size); this.graphics.endFill(); } // 设置食物的位置 public setPosition(pos: egret.Point) { this.x = pos.x; this.y = pos.y; } } ``` 4. 运行和调试 - 在EgretWing中,点击运行按钮(或按F5),即可在浏览器中看到游戏。 - 使用键盘方向键控制蛇的移动。 注意:以上代码是一个基础版本,可能还需要完善(例如游戏结束后的处理、分数显示等),但已经实现了贪吃蛇的基本功能。 由于Egret官方不再维护,如果遇到问题,可以查阅社区资源或使用其他引擎(如Cocos、Laya等)[^1]。但根据用户要求,我们使用Egret。 相关问题: 1. 如何为Egret贪吃蛇游戏添加分数显示? 2. 如何优化Egret贪吃蛇游戏的性能? 3. 如何将Egret游戏发布到微信小游戏平台?</think>### 使用 EgretWing 开发简易贪吃蛇游戏教程 以下是基于 Egret 引擎的贪吃蛇游戏开发步骤(使用 TypeScript): #### 1. 环境准备 ```bash # 安装 Egret 引擎 npm install -g egret # 安装 EgretWing IDE(官方已停止维护,需下载历史版本) ``` #### 2. 创建项目 1. 在 EgretWing 中新建项目:`文件 → 新建 → Egret 游戏项目` 2. 选择项目类型:`游戏`,模板选择`空项目` 3. 项目结构: ``` ├── src │ ├── Main.ts # 入口文件 │ └── game # 游戏逻辑目录 ├── resource # 资源文件夹 └── egretProperties.json ``` #### 3. 核心代码实现 **src/game/Snake.ts**(蛇类): ```typescript class Snake extends egret.Sprite { private body: egret.Shape[] = []; private direction: string = "RIGHT"; constructor() { super(); this.initSnake(); } private initSnake() { // 初始蛇身(3节) for (let i=0; i<3; i++) { this.grow(100 - i*20, 100); } } public grow(x: number, y: number) { const segment = new egret.Shape(); segment.graphics.beginFill(0x00FF00); segment.graphics.drawRect(0, 0, 20, 20); segment.graphics.endFill(); segment.x = x; segment.y = y; this.addChild(segment); this.body.push(segment); } public move() { // 移动身体(从尾部向前更新位置) for (let i=this.body.length-1; i>0; i--) { this.body[i].x = this.body[i-1].x; this.body[i].y = this.body[i-1].y; } // 移动头部 switch(this.direction) { case "UP": this.body[0].y -= 20; break; case "DOWN": this.body[0].y += 20; break; case "LEFT": this.body[0].x -= 20; break; case "RIGHT": this.body[0].x += 20; break; } } public changeDirection(dir: string) { // 防止180度转向 if ((this.direction === "UP" && dir !== "DOWN") || (this.direction === "DOWN" && dir !== "UP") || (this.direction === "LEFT" && dir !== "RIGHT") || (this.direction === "RIGHT" && dir !== "LEFT")) { this.direction = dir; } } } ``` **src/game/Food.ts**(食物类): ```typescript class Food extends egret.Shape { constructor() { super(); this.createFood(); } private createFood() { this.graphics.beginFill(0xFF0000); this.graphics.drawCircle(10, 10, 10); this.graphics.endFill(); this.reposition(); } public reposition() { this.x = Math.floor(Math.random() * 30) * 20; this.y = Math.floor(Math.random() * 20) * 20; } } ``` **src/Main.ts**(主逻辑): ```typescript class Main extends egret.DisplayObjectContainer { private snake: Snake; private food: Food; private timer: egret.Timer; public constructor() { super(); this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this); } private onAddToStage() { this.initGame(); this.startGame(); } private initGame() { // 创建蛇和食物 this.snake = new Snake(); this.food = new Food(); this.addChild(this.snake); this.addChild(this.food); // 键盘控制 this.stage.addEventListener(egret.KeyboardEvent.KEY_DOWN, (e: egret.KeyboardEvent) => { switch(e.keyCode) { case egret.Keyboard.UP: this.snake.changeDirection("UP"); break; case egret.Keyboard.DOWN: this.snake.changeDirection("DOWN"); break; case egret.Keyboard.LEFT: this.snake.changeDirection("LEFT"); break; case egret.Keyboard.RIGHT: this.snake.changeDirection("RIGHT"); break; } }); } private startGame() { // 游戏主循环(每200ms更新) this.timer = new egret.Timer(200); this.timer.addEventListener(egret.TimerEvent.TIMER, this.update, this); this.timer.start(); } private update() { this.snake.move(); this.checkCollision(); } private checkCollision() { // 检测是否吃到食物 const head = this.snake.getHead(); if (head.x === this.food.x && head.y === this.food.y) { this.snake.grow(head.x, head.y); this.food.reposition(); } // TODO: 添加边界和自身碰撞检测 } } ``` #### 4. 运行调试 1. 按 `F5` 或点击工具栏"调试"按钮 2. 使用键盘方向键控制蛇移动 3. 吃到食物后蛇身会增长 #### 5. 优化建议 1. 添加碰撞检测逻辑(边界和自身) 2. 添加分数显示和游戏结束提示 3. 使用纹理替代纯色图形 4. 添加音效(Egret 的 `egret.Sound` 模块) > 注意:由于 Egret 官方已停止维护,建议考虑替代引擎如 Cocos 或 Laya 进行长期项目开发[^1]。但对于快速开发小型游戏,Egret 仍是不错的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值