Phaser3 JS:我在使用 rexPlugin 时遇到错误
Phaser3 JS : I got an error with rexPlugin
我有这个错误“未捕获的类型错误:无法读取未定义的属性(读取'_currentQuest')main.js:67
我尝试更改我的代码,但一直以来我都遇到此错误...
如果有人帮助我,那就太好了。
不知道我可以在我的代码中更改什么,因为我看到了教程并且我写得像 tuto / answer
var questString = [
["type", "key", "next", "end"],
["q", "Va parler à Connor", "", ""],
["","", "Fini", "", ""],
["q", "Fini", "", "1"],
].map(x => x.join(",")).join("\n");
class SceneStart extends Phaser.Scene {
constructor() {
super({key: 'sceneStart'})
}
//Chargement des images
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("door", "javascript/assets/doors.png");
this.load.image("wall", "javascript/assets/walls.png");
/**
this.load.image("fireStart1", "javascript/assets/fireStart1.png");
this.load.image("fireStart2", "javascript/assets/fireStart2.png");
this.load.image("fireStart3", "javascript/assets/fireStart3.png");
*/
}
handleMeeting(player, Connor){
if(player._currentQuest){
console.info(player._currentQuest.currentQuest)
let options = player._currentQuest.currentQuest.options;
if (options[0].next == "Va parler à Connor") {
console.log("test mon reuf");
player._currentQuest.manager.getNextQuestion(options[0].next);
} else if (options[0].next == "Fini"){
this.doorStart.visible = true;
player._currentQuest.manager.getNextQuestion(options[0].next);
this.physics.add.collider(player, doorStart, collision, undefined, this);
}
}
}
checkDoorStatus(player, door){
return door.visible == false;
}
create() {
cursor = this.input.keyboard.createCursorKeys(); //touches des fleches
platforms = this.physics.add.staticGroup();
this.print = this.add.text(380, 180, '', { fontSize: '12px', align: 'right' }).setOrigin(1);
this.plugins.get('rexquestplugin').add({
questions: questString,
quest: true
}).on('quest', function (currentQuest, manager, quest) {
// La quête est fini
if (currentQuest.end === 1) {
manager.setData('endAt', currentQuest.key);
manager.emit('complete', manager, quest);
} else {
// Prochaine étape de la quête
if(player._currentQuest ){
this.print.text = this.print.text + 'done\n';
}
this.print.text += `${currentQuest.key}...`;
this.player._currentQuest = { currentQuest, manager}
}
}, this).on('complete', function (manager, quest) {
delete this.player._currentQuest;
this.print.text = this.print.text + 'done\n';
this.print.text += `\nDoor is unlocked!`;
}, this).getNextQuestion();
//Les animations
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
/**
* this.anims.create({
* key : "fireMouvement",
* frames : [
* {key : "fireStart1"},
* {key : "fireStart2"},
* {key : "fireStart3"}],
* framerate : 7,
* repeat : -1
* })
*/
player = this.physics.add.sprite((w / 2), h, "player"); //joueur
player.setScale(1, 1);
player.body.setSize(30, 35);
player.setCollideWorldBounds(true); //collision avec la bordure
Connor = this.physics.add.sprite(160, 300, "player")
Connor.setScale(1, 1);
Connor.body.setSize(30, 35);
wall1 = this.add.sprite(200, 146, "wall");
wall1.setScale(0.3);
wall2 = this.add.sprite(200, 445, "wall");
wall2.setFlip(false, true);
wall2.setScale(0.3);
wall3 = this.add.sprite((w - 200), 146, "wall");
wall3.setScale(0.3);
wall4 = this.add.sprite((w - 200), 445, "wall");
wall4.setFlip(false, true);
wall4.setScale(0.3);
doorStart = this.physics.add.staticSprite((w / 2), 28, "door"); //Porte principale
doorStart.setScale(0.3);
doorStart.body.setSize(300, 55);
doorStart.body.setOffset(-56, 472);
doorStart.rotation += -20.42;
doorStart.visible = false;
platforms.add(wall1);
platforms.add(wall2);
platforms.add(wall3);
platforms.add(wall4);
this.physics.add.collider(platforms, player); //collision
this.physics.add.collider(this.player, this.Connor, this.handleMeeting, undefined, this);
//Fonction de collision qui éxecute le code dedans quand la fonctions est appelé
function collision() {
this.scene.start("labyrintheStart");
}
}
update() {
// Tous les mouvement sont controler par ce code
if (cursor.left.isDown){
player.setVelocityX(-200); //vitesse de deplacements
player.anims.play("playerWalkLeft", true); //animations du personnage
player.setFlip(false, false); //oriantation de l'image
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
//--------
}
}
class LabyrintheStart extends Phaser.Scene {
constructor() {
super({key: 'labyrintheStart'});
}
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("wall", "javascript/assets/walls.png");
this.load.image("door", "javascript/assets/doors.png");
}
create() {
cursor = this.input.keyboard.createCursorKeys();
platforms = this.physics.add.staticGroup();
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
player = this.physics.add.sprite(34, h, "player");
player.setScale(1, 1);
player.body.setSize(30, 35);
wall1 = this.add.sprite(9, h - 126, "wall");
wall1.setScale(0.05);
doorDroite = this.physics.add.staticSprite(w - 35, (h / 2) - 20, "door");
doorDroite.setSize(18, 80);
doorDroite.setScale(0.08);
platforms.add(wall1);
this.physics.add.collider(platforms, player);
player.setCollideWorldBounds(true);
function collisionDroite() {
this.scene.start("labyrintheDeux");
}
this.physics.add.collider(player, doorDroite, collisionDroite, undefined, this);
}
update() {
if (cursor.left.isDown){
player.setVelocityX(-200);
player.anims.play("playerWalkLeft", true);
player.setFlip(false, false);
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
}
}
/**
class LabyrintheDeux extends Phaser.Scene {
constructor() {
super({key: "labyrintheDeux"});
}
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("wall", "javascript/assets/wall.png");
this.load.image("doorStart", "javascript/assets/door.png");
}
create() {
cursor = this.input.keyboard.createCursorKeys();
platforms = this.physics.add.staticGroup();
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
player = this.physics.add.sprite((w - w) + 70, h, "player");
player.setScale(1, 1);
player.body.setSize(30, 35);
wall = this.add.sprite((w - w) + 6, h - 126, "wall");
door = this.physics.add.staticSprite((w / 2) - 20, 30, "door");
door.rotation += 20.42;
door.setSize(50, 10);
platforms.add(wall);
this.physics.add.collider(platforms, player);
player.setCollideWorldBounds(true);
function collision() {
this.scene.start("");
}
this.physics.add.collider(player, door, collision, undefined, this);
}
update() {
if (cursor.left.isDown){
player.setVelocityX(-200);
player.anims.play("playerWalkLeft", true);
player.setFlip(false, false);
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
}
}
*/
var config = {
type: Phaser.AUTO,
width: 1346,
height: 561,
backgroundColor: "#FFFFFF", //#FFFFFF
physics: {
default : "arcade",
arcade : {
debug : true,
}
},
scene: [SceneStart, LabyrintheStart /**, LabyrintheDeux*/]
};
let game = new Phaser.Game(config);
var h = window.innerHeight;
var w = window.innerWidth;
var platforms;
var cursor;
var player;
var doorGauche;
var doorDroite;
var doorUp;
var doorStart;
var wall1;
var wall2;
var wall3;
var wall4;
// A rajouter plus tard
/**
*
function collisionUp() {
this.scene.start("labyrintheTrois");
}
*
* this.physics.add.collider(player, doorGauche, collisionUp, undefined, this);
*
* doorUp = this.physics.add.staticSprite((w / 2) - 20, 8, "door");
* doorUp.setScale(0.08);
* doorUp.setSize(80, 18);
* doorUp.setOffset(55, 491);
* doorUp.rotation += -20.42;
*/
<script src="//cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
<script id="js" type="text/javascript" src="javascript/main.js"></script>
<script></script>
有几点需要修正:
全局变量和属性的混合,二选一坚持.
- 简单的解决方案将所有
this.player
替换为 player
在开始任务之前定义玩家变量。 (因为任务试图访问 player
变量)
- 简单的解决方案将
player
定义移动到任务定义 this.plugins.get('rexquestplugin')
的顶部。
变量Connor
未定义
- 简单的解决方案将
var Connor;
添加到您的代码中
在这里您可以看到已实施的更改:
// FIX number 3
var Connor;
var questString = [
["type", "key", "next", "end"],
["q", "Va parler à Connor", "", ""],
["","", "Fini", "", ""],
["q", "Fini", "", "1"],
].map(x => x.join(",")).join("\n");
class SceneStart extends Phaser.Scene {
constructor() {
super({key: 'sceneStart'})
}
//Chargement des images
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("door", "javascript/assets/doors.png");
this.load.image("wall", "javascript/assets/walls.png");
/**
this.load.image("fireStart1", "javascript/assets/fireStart1.png");
this.load.image("fireStart2", "javascript/assets/fireStart2.png");
this.load.image("fireStart3", "javascript/assets/fireStart3.png");
*/
}
handleMeeting(player, Connor){
if(player._currentQuest){
console.info(player._currentQuest.currentQuest)
let options = player._currentQuest.currentQuest.options;
if (options[0].next == "Va parler à Connor") {
console.log("test mon reuf");
player._currentQuest.manager.getNextQuestion(options[0].next);
} else if (options[0].next == "Fini"){
this.doorStart.visible = true;
player._currentQuest.manager.getNextQuestion(options[0].next);
this.physics.add.collider(player, doorStart, collision, undefined, this);
}
}
}
checkDoorStatus(player, door){
return door.visible == false;
}
create() {
cursor = this.input.keyboard.createCursorKeys(); //touches des fleches
platforms = this.physics.add.staticGroup();
this.print = this.add.text(380, 180, '', { fontSize: '12px', align: 'right' }).setOrigin(1);
// FIX number 1
player = this.physics.add.sprite((w / 2), h, "player"); //joueur
player.setScale(1, 1);
player.body.setSize(30, 35);
player.setCollideWorldBounds(true); //collision avec la bordure
this.plugins.get('rexquestplugin').add({
questions: questString,
quest: true
}).on('quest', function (currentQuest, manager, quest) {
// La quête est fini
if (currentQuest.end === 1) {
manager.setData('endAt', currentQuest.key);
manager.emit('complete', manager, quest);
} else {
// Prochaine étape de la quête
if(player._currentQuest ){
this.print.text = this.print.text + 'done\n';
}
this.print.text += `${currentQuest.key}...`;
// Fix number 1
player._currentQuest = { currentQuest, manager}
}
}, this).on('complete', function (manager, quest) {
// Fix number 1
delete player._currentQuest;
this.print.text = this.print.text + 'done\n';
this.print.text += `\nDoor is unlocked!`;
}, this).getNextQuestion();
Connor = this.physics.add.sprite(160, 300, "player")
Connor.setScale(1, 1);
Connor.body.setSize(30, 35);
wall1 = this.add.sprite(200, 146, "wall");
wall1.setScale(0.3);
wall2 = this.add.sprite(200, 445, "wall");
wall2.setFlip(false, true);
wall2.setScale(0.3);
wall3 = this.add.sprite((w - 200), 146, "wall");
wall3.setScale(0.3);
wall4 = this.add.sprite((w - 200), 445, "wall");
wall4.setFlip(false, true);
wall4.setScale(0.3);
doorStart = this.physics.add.staticSprite((w / 2), 28, "door"); //Porte principale
doorStart.setScale(0.3);
doorStart.body.setSize(300, 55);
doorStart.body.setOffset(-56, 472);
doorStart.rotation += -20.42;
doorStart.visible = false;
platforms.add(wall1);
platforms.add(wall2);
platforms.add(wall3);
platforms.add(wall4);
this.physics.add.collider(platforms, player); //collision
// Fix number 1
this.physics.add.collider(player, Connor, this.handleMeeting, undefined, this);
//Fonction de collision qui éxecute le code dedans quand la fonctions est appelé
function collision() {
this.scene.start("labyrintheStart");
}
}
update() {
// Tous les mouvement sont controler par ce code
if (cursor.left.isDown){
player.setVelocityX(-200); //vitesse de deplacements
player.anims.play("playerWalkLeft", true); //animations du personnage
player.setFlip(false, false); //oriantation de l'image
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
//--------
}
}
class LabyrintheStart extends Phaser.Scene {
constructor() {
super({key: 'labyrintheStart'});
}
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("wall", "javascript/assets/walls.png");
this.load.image("door", "javascript/assets/doors.png");
}
create() {
cursor = this.input.keyboard.createCursorKeys();
platforms = this.physics.add.staticGroup();
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
player = this.physics.add.sprite(34, h, "player");
player.setScale(1, 1);
player.body.setSize(30, 35);
wall1 = this.add.sprite(9, h - 126, "wall");
wall1.setScale(0.05);
doorDroite = this.physics.add.staticSprite(w - 35, (h / 2) - 20, "door");
doorDroite.setSize(18, 80);
doorDroite.setScale(0.08);
platforms.add(wall1);
this.physics.add.collider(platforms, player);
player.setCollideWorldBounds(true);
function collisionDroite() {
this.scene.start("labyrintheDeux");
}
this.physics.add.collider(player, doorDroite, collisionDroite, undefined, this);
}
update() {
if (cursor.left.isDown){
player.setVelocityX(-200);
player.anims.play("playerWalkLeft", true);
player.setFlip(false, false);
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
}
}
var config = {
type: Phaser.AUTO,
width: 400,
height: 200,
backgroundColor: "#000000", //#FFFFFF
physics: {
default : "arcade",
arcade : {
debug : true,
}
},
scene: [SceneStart, LabyrintheStart /**, LabyrintheDeux*/]
};
let game = new Phaser.Game(config);
var h = window.innerHeight;
var w = window.innerWidth;
var platforms;
var cursor;
var player;
var doorGauche;
var doorDroite;
var doorUp;
var doorStart;
var wall1;
var wall2;
var wall3;
var wall4;
<script src="//cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
顺便说一句: 你应该总是删除你不使用的代码,这可能会导致错误。希望对您有所帮助。
我有这个错误“未捕获的类型错误:无法读取未定义的属性(读取'_currentQuest')main.js:67
我尝试更改我的代码,但一直以来我都遇到此错误...
如果有人帮助我,那就太好了。 不知道我可以在我的代码中更改什么,因为我看到了教程并且我写得像 tuto / answer
var questString = [
["type", "key", "next", "end"],
["q", "Va parler à Connor", "", ""],
["","", "Fini", "", ""],
["q", "Fini", "", "1"],
].map(x => x.join(",")).join("\n");
class SceneStart extends Phaser.Scene {
constructor() {
super({key: 'sceneStart'})
}
//Chargement des images
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("door", "javascript/assets/doors.png");
this.load.image("wall", "javascript/assets/walls.png");
/**
this.load.image("fireStart1", "javascript/assets/fireStart1.png");
this.load.image("fireStart2", "javascript/assets/fireStart2.png");
this.load.image("fireStart3", "javascript/assets/fireStart3.png");
*/
}
handleMeeting(player, Connor){
if(player._currentQuest){
console.info(player._currentQuest.currentQuest)
let options = player._currentQuest.currentQuest.options;
if (options[0].next == "Va parler à Connor") {
console.log("test mon reuf");
player._currentQuest.manager.getNextQuestion(options[0].next);
} else if (options[0].next == "Fini"){
this.doorStart.visible = true;
player._currentQuest.manager.getNextQuestion(options[0].next);
this.physics.add.collider(player, doorStart, collision, undefined, this);
}
}
}
checkDoorStatus(player, door){
return door.visible == false;
}
create() {
cursor = this.input.keyboard.createCursorKeys(); //touches des fleches
platforms = this.physics.add.staticGroup();
this.print = this.add.text(380, 180, '', { fontSize: '12px', align: 'right' }).setOrigin(1);
this.plugins.get('rexquestplugin').add({
questions: questString,
quest: true
}).on('quest', function (currentQuest, manager, quest) {
// La quête est fini
if (currentQuest.end === 1) {
manager.setData('endAt', currentQuest.key);
manager.emit('complete', manager, quest);
} else {
// Prochaine étape de la quête
if(player._currentQuest ){
this.print.text = this.print.text + 'done\n';
}
this.print.text += `${currentQuest.key}...`;
this.player._currentQuest = { currentQuest, manager}
}
}, this).on('complete', function (manager, quest) {
delete this.player._currentQuest;
this.print.text = this.print.text + 'done\n';
this.print.text += `\nDoor is unlocked!`;
}, this).getNextQuestion();
//Les animations
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
/**
* this.anims.create({
* key : "fireMouvement",
* frames : [
* {key : "fireStart1"},
* {key : "fireStart2"},
* {key : "fireStart3"}],
* framerate : 7,
* repeat : -1
* })
*/
player = this.physics.add.sprite((w / 2), h, "player"); //joueur
player.setScale(1, 1);
player.body.setSize(30, 35);
player.setCollideWorldBounds(true); //collision avec la bordure
Connor = this.physics.add.sprite(160, 300, "player")
Connor.setScale(1, 1);
Connor.body.setSize(30, 35);
wall1 = this.add.sprite(200, 146, "wall");
wall1.setScale(0.3);
wall2 = this.add.sprite(200, 445, "wall");
wall2.setFlip(false, true);
wall2.setScale(0.3);
wall3 = this.add.sprite((w - 200), 146, "wall");
wall3.setScale(0.3);
wall4 = this.add.sprite((w - 200), 445, "wall");
wall4.setFlip(false, true);
wall4.setScale(0.3);
doorStart = this.physics.add.staticSprite((w / 2), 28, "door"); //Porte principale
doorStart.setScale(0.3);
doorStart.body.setSize(300, 55);
doorStart.body.setOffset(-56, 472);
doorStart.rotation += -20.42;
doorStart.visible = false;
platforms.add(wall1);
platforms.add(wall2);
platforms.add(wall3);
platforms.add(wall4);
this.physics.add.collider(platforms, player); //collision
this.physics.add.collider(this.player, this.Connor, this.handleMeeting, undefined, this);
//Fonction de collision qui éxecute le code dedans quand la fonctions est appelé
function collision() {
this.scene.start("labyrintheStart");
}
}
update() {
// Tous les mouvement sont controler par ce code
if (cursor.left.isDown){
player.setVelocityX(-200); //vitesse de deplacements
player.anims.play("playerWalkLeft", true); //animations du personnage
player.setFlip(false, false); //oriantation de l'image
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
//--------
}
}
class LabyrintheStart extends Phaser.Scene {
constructor() {
super({key: 'labyrintheStart'});
}
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("wall", "javascript/assets/walls.png");
this.load.image("door", "javascript/assets/doors.png");
}
create() {
cursor = this.input.keyboard.createCursorKeys();
platforms = this.physics.add.staticGroup();
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
player = this.physics.add.sprite(34, h, "player");
player.setScale(1, 1);
player.body.setSize(30, 35);
wall1 = this.add.sprite(9, h - 126, "wall");
wall1.setScale(0.05);
doorDroite = this.physics.add.staticSprite(w - 35, (h / 2) - 20, "door");
doorDroite.setSize(18, 80);
doorDroite.setScale(0.08);
platforms.add(wall1);
this.physics.add.collider(platforms, player);
player.setCollideWorldBounds(true);
function collisionDroite() {
this.scene.start("labyrintheDeux");
}
this.physics.add.collider(player, doorDroite, collisionDroite, undefined, this);
}
update() {
if (cursor.left.isDown){
player.setVelocityX(-200);
player.anims.play("playerWalkLeft", true);
player.setFlip(false, false);
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
}
}
/**
class LabyrintheDeux extends Phaser.Scene {
constructor() {
super({key: "labyrintheDeux"});
}
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("wall", "javascript/assets/wall.png");
this.load.image("doorStart", "javascript/assets/door.png");
}
create() {
cursor = this.input.keyboard.createCursorKeys();
platforms = this.physics.add.staticGroup();
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
player = this.physics.add.sprite((w - w) + 70, h, "player");
player.setScale(1, 1);
player.body.setSize(30, 35);
wall = this.add.sprite((w - w) + 6, h - 126, "wall");
door = this.physics.add.staticSprite((w / 2) - 20, 30, "door");
door.rotation += 20.42;
door.setSize(50, 10);
platforms.add(wall);
this.physics.add.collider(platforms, player);
player.setCollideWorldBounds(true);
function collision() {
this.scene.start("");
}
this.physics.add.collider(player, door, collision, undefined, this);
}
update() {
if (cursor.left.isDown){
player.setVelocityX(-200);
player.anims.play("playerWalkLeft", true);
player.setFlip(false, false);
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
}
}
*/
var config = {
type: Phaser.AUTO,
width: 1346,
height: 561,
backgroundColor: "#FFFFFF", //#FFFFFF
physics: {
default : "arcade",
arcade : {
debug : true,
}
},
scene: [SceneStart, LabyrintheStart /**, LabyrintheDeux*/]
};
let game = new Phaser.Game(config);
var h = window.innerHeight;
var w = window.innerWidth;
var platforms;
var cursor;
var player;
var doorGauche;
var doorDroite;
var doorUp;
var doorStart;
var wall1;
var wall2;
var wall3;
var wall4;
// A rajouter plus tard
/**
*
function collisionUp() {
this.scene.start("labyrintheTrois");
}
*
* this.physics.add.collider(player, doorGauche, collisionUp, undefined, this);
*
* doorUp = this.physics.add.staticSprite((w / 2) - 20, 8, "door");
* doorUp.setScale(0.08);
* doorUp.setSize(80, 18);
* doorUp.setOffset(55, 491);
* doorUp.rotation += -20.42;
*/
<script src="//cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
<script id="js" type="text/javascript" src="javascript/main.js"></script>
<script></script>
有几点需要修正:
全局变量和属性的混合,二选一坚持.
- 简单的解决方案将所有
this.player
替换为player
- 简单的解决方案将所有
在开始任务之前定义玩家变量。 (因为任务试图访问
player
变量)- 简单的解决方案将
player
定义移动到任务定义this.plugins.get('rexquestplugin')
的顶部。
- 简单的解决方案将
变量
Connor
未定义- 简单的解决方案将
var Connor;
添加到您的代码中
- 简单的解决方案将
在这里您可以看到已实施的更改:
// FIX number 3
var Connor;
var questString = [
["type", "key", "next", "end"],
["q", "Va parler à Connor", "", ""],
["","", "Fini", "", ""],
["q", "Fini", "", "1"],
].map(x => x.join(",")).join("\n");
class SceneStart extends Phaser.Scene {
constructor() {
super({key: 'sceneStart'})
}
//Chargement des images
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("door", "javascript/assets/doors.png");
this.load.image("wall", "javascript/assets/walls.png");
/**
this.load.image("fireStart1", "javascript/assets/fireStart1.png");
this.load.image("fireStart2", "javascript/assets/fireStart2.png");
this.load.image("fireStart3", "javascript/assets/fireStart3.png");
*/
}
handleMeeting(player, Connor){
if(player._currentQuest){
console.info(player._currentQuest.currentQuest)
let options = player._currentQuest.currentQuest.options;
if (options[0].next == "Va parler à Connor") {
console.log("test mon reuf");
player._currentQuest.manager.getNextQuestion(options[0].next);
} else if (options[0].next == "Fini"){
this.doorStart.visible = true;
player._currentQuest.manager.getNextQuestion(options[0].next);
this.physics.add.collider(player, doorStart, collision, undefined, this);
}
}
}
checkDoorStatus(player, door){
return door.visible == false;
}
create() {
cursor = this.input.keyboard.createCursorKeys(); //touches des fleches
platforms = this.physics.add.staticGroup();
this.print = this.add.text(380, 180, '', { fontSize: '12px', align: 'right' }).setOrigin(1);
// FIX number 1
player = this.physics.add.sprite((w / 2), h, "player"); //joueur
player.setScale(1, 1);
player.body.setSize(30, 35);
player.setCollideWorldBounds(true); //collision avec la bordure
this.plugins.get('rexquestplugin').add({
questions: questString,
quest: true
}).on('quest', function (currentQuest, manager, quest) {
// La quête est fini
if (currentQuest.end === 1) {
manager.setData('endAt', currentQuest.key);
manager.emit('complete', manager, quest);
} else {
// Prochaine étape de la quête
if(player._currentQuest ){
this.print.text = this.print.text + 'done\n';
}
this.print.text += `${currentQuest.key}...`;
// Fix number 1
player._currentQuest = { currentQuest, manager}
}
}, this).on('complete', function (manager, quest) {
// Fix number 1
delete player._currentQuest;
this.print.text = this.print.text + 'done\n';
this.print.text += `\nDoor is unlocked!`;
}, this).getNextQuestion();
Connor = this.physics.add.sprite(160, 300, "player")
Connor.setScale(1, 1);
Connor.body.setSize(30, 35);
wall1 = this.add.sprite(200, 146, "wall");
wall1.setScale(0.3);
wall2 = this.add.sprite(200, 445, "wall");
wall2.setFlip(false, true);
wall2.setScale(0.3);
wall3 = this.add.sprite((w - 200), 146, "wall");
wall3.setScale(0.3);
wall4 = this.add.sprite((w - 200), 445, "wall");
wall4.setFlip(false, true);
wall4.setScale(0.3);
doorStart = this.physics.add.staticSprite((w / 2), 28, "door"); //Porte principale
doorStart.setScale(0.3);
doorStart.body.setSize(300, 55);
doorStart.body.setOffset(-56, 472);
doorStart.rotation += -20.42;
doorStart.visible = false;
platforms.add(wall1);
platforms.add(wall2);
platforms.add(wall3);
platforms.add(wall4);
this.physics.add.collider(platforms, player); //collision
// Fix number 1
this.physics.add.collider(player, Connor, this.handleMeeting, undefined, this);
//Fonction de collision qui éxecute le code dedans quand la fonctions est appelé
function collision() {
this.scene.start("labyrintheStart");
}
}
update() {
// Tous les mouvement sont controler par ce code
if (cursor.left.isDown){
player.setVelocityX(-200); //vitesse de deplacements
player.anims.play("playerWalkLeft", true); //animations du personnage
player.setFlip(false, false); //oriantation de l'image
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
//--------
}
}
class LabyrintheStart extends Phaser.Scene {
constructor() {
super({key: 'labyrintheStart'});
}
preload() {
this.load.plugin('rexquestplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexquestplugin.min.js', true);
this.load.image("player", "javascript/assets/player.png");
this.load.image("run1", "javascript/assets/run1.png");
this.load.image("run2", "javascript/assets/run2.png");
this.load.image("playerLeftRun1", "javascript/assets/playerLeftRun1.png");
this.load.image("playerLeftRun2", "javascript/assets/playerLeftRun2.png");
this.load.image("wall", "javascript/assets/walls.png");
this.load.image("door", "javascript/assets/doors.png");
}
create() {
cursor = this.input.keyboard.createCursorKeys();
platforms = this.physics.add.staticGroup();
this.anims.create({
key : "playerWalkUp",
frames : [
{key : "run1"},
{key : "run2"}],
frameRate : 7,
repeat : 0
})
this.anims.create({
key : "playerWalkLeft",
frames : [
{key : "playerLeftRun1"},
{key : "playerLeftRun2"}],
frameRate : 7,
repeat : 0
})
player = this.physics.add.sprite(34, h, "player");
player.setScale(1, 1);
player.body.setSize(30, 35);
wall1 = this.add.sprite(9, h - 126, "wall");
wall1.setScale(0.05);
doorDroite = this.physics.add.staticSprite(w - 35, (h / 2) - 20, "door");
doorDroite.setSize(18, 80);
doorDroite.setScale(0.08);
platforms.add(wall1);
this.physics.add.collider(platforms, player);
player.setCollideWorldBounds(true);
function collisionDroite() {
this.scene.start("labyrintheDeux");
}
this.physics.add.collider(player, doorDroite, collisionDroite, undefined, this);
}
update() {
if (cursor.left.isDown){
player.setVelocityX(-200);
player.anims.play("playerWalkLeft", true);
player.setFlip(false, false);
} else if (cursor.right.isDown){
player.setVelocityX(200);
player.anims.play("playerWalkLeft", true);
player.setFlip(true, false);
} else if (cursor.up.isDown){
player.setVelocityY(-200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, false);
} else if (cursor.down.isDown){
player.setVelocityY(200);
player.anims.play("playerWalkUp", true);
player.setFlip(false, true);
} else {
player.setVelocity(0);
player.setTexture("player");
}
if ((cursor.left.isDown && cursor.up.isDown) || (cursor.left.isDown && cursor.right.isDown) || (cursor.left.isDown && cursor.down.isDown) || (cursor.right.isDown && cursor.up.isDown) || (cursor.right.isDown && cursor.down.isDown)){
player.setVelocity(0);
player.setTexture("player");
}
}
}
var config = {
type: Phaser.AUTO,
width: 400,
height: 200,
backgroundColor: "#000000", //#FFFFFF
physics: {
default : "arcade",
arcade : {
debug : true,
}
},
scene: [SceneStart, LabyrintheStart /**, LabyrintheDeux*/]
};
let game = new Phaser.Game(config);
var h = window.innerHeight;
var w = window.innerWidth;
var platforms;
var cursor;
var player;
var doorGauche;
var doorDroite;
var doorUp;
var doorStart;
var wall1;
var wall2;
var wall3;
var wall4;
<script src="//cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
顺便说一句: 你应该总是删除你不使用的代码,这可能会导致错误。希望对您有所帮助。