phaserjs+typescript游戏开发之camera实现

ops/2025/1/19 15:34:35/

以下是一个使用 Phaser.jsTypeScript 实现的示例,包含玩家移动、摄像机跟随并限制在游戏世界范围内的基本功能。

TypeScript 和 Phaser.js 实现的完整代码

  1. 安装 Phaser.js(使用 npm)

首先,确保你已经安装了 Node.jsnpm。然后在你的项目中安装 Phaser.js:

bash复制编辑npm init -y
npm install phaser
  1. 项目结构

假设你有以下项目结构:

bash复制编辑/your-project/srcindex.ts/distindex.htmlpackage.json
  1. TypeScript 代码:index.ts
typescript复制编辑import Phaser from 'phaser';class MainScene extends Phaser.Scene {private player: Phaser.Physics.Arcade.Sprite;private cursors: Phaser.Types.Input.Keyboard.CursorKeys;private objects: Phaser.Physics.Arcade.StaticGroup;private camera: Phaser.Cameras.Scene2D.Camera;private readonly WORLD_WIDTH = 2000;private readonly WORLD_HEIGHT = 1500;constructor() {super('mainScene');}preload() {this.load.image('player', 'https://phaser.io/images/sprites/phaser-dude.png');this.load.image('object', 'https://phaser.io/images/sprites/block.png');}create() {// 设置物理世界的边界this.physics.world.setBounds(0, 0, this.WORLD_WIDTH, this.WORLD_HEIGHT);// 创建随机对象this.objects = this.physics.add.staticGroup();for (let i = 0; i < 50; i++) {const x = Phaser.Math.Between(0, this.WORLD_WIDTH);const y = Phaser.Math.Between(0, this.WORLD_HEIGHT);const object = this.objects.create(x, y, 'object').setScale(0.5).refreshBody();}// 创建玩家对象this.player = this.physics.add.sprite(400, 300, 'player');this.player.setCollideWorldBounds(true);// 创建摄像机并让其跟随玩家this.camera = this.cameras.main;this.camera.startFollow(this.player);this.camera.setBounds(0, 0, this.WORLD_WIDTH, this.WORLD_HEIGHT);// 设置键盘输入this.cursors = this.input.keyboard.createCursorKeys();}update() {const speed = 300;// 初始化玩家速度this.player.setVelocity(0);if (this.cursors.left.isDown) {this.player.setVelocityX(-speed);} else if (this.cursors.right.isDown) {this.player.setVelocityX(speed);}if (this.cursors.up.isDown) {this.player.setVelocityY(-speed);} else if (this.cursors.down.isDown) {this.player.setVelocityY(speed);}}
}const config: Phaser.Types.Core.GameConfig = {type: Phaser.AUTO,width: 800,height: 600,physics: {default: 'arcade',arcade: {debug: false,},},scene: MainScene,
};const game = new Phaser.Game(config);
  1. HTML 文件:index.html

dist 目录中,创建一个简单的 HTML 文件,用于加载和启动 Phaser 游戏。

html复制编辑<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Phaser 3 + TypeScript Example</title><script src="https://cdn.jsdelivr.net/npm/phaser@3/dist/phaser.min.js"></script>
</head>
<body><script src="dist/index.js"></script>
</body>
</html>
  1. TypeScript 配置文件:tsconfig.json

创建一个 tsconfig.json 文件以配置 TypeScript:

json复制编辑{"compilerOptions": {"target": "ES6","module": "ES6","moduleResolution": "node","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"outDir": "./dist","baseUrl": "./src"},"include": ["src/**/*.ts"]
}
  1. 构建和运行项目

首先,编译 TypeScript 文件并启动本地服务器。

  1. 安装开发依赖:
bash复制编辑
npm install --save-dev typescript http-server
  1. 编译 TypeScript 文件:
bash复制编辑
npx tsc

这将把 TypeScript 文件编译成 dist 目录中的 index.js 文件。

  1. 启动本地服务器:
bash复制编辑
npx http-server ./dist

然后,访问 http://localhost:8080 来查看你的 Phaser 游戏。


代码讲解

  1. Phaser 配置:

    typescript复制编辑const config: Phaser.Types.Core.GameConfig = {type: Phaser.AUTO,width: 800,height: 600,physics: {default: 'arcade',arcade: { debug: false },},scene: MainScene,
    };
    
    • type: Phaser.AUTO:根据浏览器支持自动选择 WebGL 或 Canvas 渲染。
    • widthheight:设置游戏画布的大小。
    • physics:启用 Arcade 物理引擎并关闭调试模式。
    • scene: MainScene:指定使用 MainScene 类作为游戏的场景。
  2. MainScene 类:

    MainScene 继承自 Phaser.Scene,并实现了游戏的主要逻辑。

    • preload:加载资源(玩家和对象的图像)。
    • create:创建游戏对象,设置物理世界边界,初始化玩家和摄像机。
    • update:每帧更新玩家的位置,处理键盘输入。
  3. 摄像机跟随:

    typescript复制编辑this.camera.startFollow(this.player);
    this.camera.setBounds(0, 0, this.WORLD_WIDTH, this.WORLD_HEIGHT);
    
    • startFollow:让摄像机跟随玩家。
    • setBounds:设置摄像机的视野范围,限制在世界边界内。
  4. 玩家控制:

    typescript复制编辑if (this.cursors.left.isDown) {this.player.setVelocityX(-speed);
    }
    

    使用键盘的箭头键控制玩家移动,通过 setVelocityXsetVelocityY 设置玩家的速度。


运行效果

  1. 玩家可以通过键盘箭头键在游戏世界中移动。
  2. 摄像机会自动跟随玩家,且受到游戏世界边界的限制。
  3. 游戏界面会呈现一个 800x600 的视图,玩家和一些随机生成的静态对象会被渲染出来。

扩展建议

  1. 添加更多的游戏对象,如敌人、道具等。
  2. 实现碰撞检测,例如玩家与对象、敌人之间的碰撞。
  3. 摄像机缩放,可以通过 camera.setZoom() 实现视野缩放。
  4. UI 元素,比如得分、生命值、提示文本等。

通过这个框架,你可以使用 Phaser.js 和 TypeScript 创建一个简单的 2D 游戏,并在此基础上添加更多的功能。


http://www.ppmy.cn/ops/151417.html

相关文章

Python编程与机器学习:解锁气象、海洋、水文领域的新实践

专题一、Python软件的安装及入门 1.1 Python背景及其在气象中的应用 1.2 Anaconda解释和安装以及Jupyter配置 1.3 Python基础语法 专题二、气象常用科学计算库 2.1 Numpy库 2.2 Pandas库 2.4 Xarray库 专题三、气象海洋常用可视化库 3.1可视化库介绍Matplotlib、Carto…

STM32 FreeRTOS中断管理

STM32 FreeRTOS 中断管理 一、中断优先级配置 在STM32上使用FreeRTOS时&#xff0c;合理配置中断优先级是非常重要的。STM32使用8位宽的寄存器来配置中断的优先等级&#xff0c;但实际只使用了高4位&#xff08;7:4&#xff09;&#xff0c;因此提供了最大16级的中断优先级。中…

Git克隆报错

Git clone命令出现"fatal repository not found"错误 有时候使用Git命令"git clone [url]“将远程仓库中的代码爬取下来的时候系统会报错"fatal repository not found”。出现这个错误的一个可能的原因是本地已存储的git账号密码与爬取仓库所属的账号密码不…

后盾人JS -- 好用的 JavaScript Symbol 类型

Symbol使用场景介绍 举个例子&#xff0c;当leader让你去机房取某个电脑的时候&#xff0c;机房那么多电脑&#xff0c;你怎么知道取哪个 所以这个时候symbol的作用就显现出来了&#xff08;上面有什么贴纸的&#xff0c;什么型号的电脑&#xff09; 声明定义Symbol的几种方…

Vscode——SSH连接不上的一种解决办法

一、完整报错: > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ > IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! > Someone could be eavesdropping on you right now (man-in-the

Coconut:基于连续潜在空间推理,提升大语言模型推理能力的新方法

Coconut&#xff08;连续思维链&#xff09;提出了一种新的大语言模型推理范式&#xff0c;该范式在潜在空间中进行运算&#xff0c;利用模型隐藏层生成的连续思维状态取代传统的基于文本的推理方式。系统将这些状态以输入嵌入的形式反馈至模型&#xff0c;通过广度优先搜索方法…

Python从0到100(八十四):神经网络-卷积神经网络训练CIFAR-10数据集

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

QT笔记- Qt6.8.1安卓开发配置

1. Qt添加组件Android, 注意登录时需连接VPN, 选好组件下载时可退出VPN.2. 手动下载安装java的jdk&#xff0c;版本jdk20及以下, 注意, 即便安装最新版本的Android SDK一般也不支持高版本的jdk.3. 安卓SDK, NDK, OpenSSL在Qt设置-设备-Android中按Qt提供的方式安装.4. 环境变量…