我正在使用Phaser引擎,我希望在单击和保持事件上从鼠标的初始位置绘制一条线,并使其不断更新以随着鼠标移动而绘制到鼠标位置。我的问题是,当我尝试存储鼠标的初始位置时,它一直在变化。这似乎是一个简单的问题,但是我对这个东西不是很好。这是代码:
var unitLine;
if(game.input.activePointer.isDown) {
const firstX = game.input.x;
const firstY = game.input.y;
unitLine = game.add.graphics(100, 100);
unitLine.beginFill(0xFF3300);
unitLine.lineStyle(10, 0xffd900, 1);
unitLine.moveTo(firstX, firstY);
unitLine.lineTo(game.input.x, game.input.y);
}
即使我将它们声明为const,firstX和firstY也在发生变化。不知道该怎么办。
答案 0 :(得分:2)
问题在于,每当鼠标firstX
设置firstY
和isDown
时,基本上就覆盖了鼠标按下的每一帧。
要解决此问题,请尝试使用Phaser的game.input.onDown
函数:
var game = new Phaser.Game(500, 500, Phaser.CANVAS, 'test', {
preload: preload,
create: create,
update: update
});
function preload() {}
let firstX;
let firstY;
function create() {
game.input.onDown.add(function() {
firstX = game.input.x;
firstY = game.input.y;
}, this);
}
var unitLine;
function update() {
if (game.input.activePointer.isDown) {
unitLine = game.add.graphics(0, 0);
unitLine.beginFill(0xFF3300);
unitLine.lineStyle(10, 0xffd900, 1);
unitLine.moveTo(firstX, firstY);
unitLine.lineTo(game.input.x, game.input.y);
}
}
<script src="https://github.com/photonstorm/phaser-ce/releases/download/v2.11.1/phaser.min.js"></script>
(而且,我不得不将100, 100
更改为0, 0
)
答案 1 :(得分:0)
这是因为您要在语句中声明它们,因此每次都会重新单击该声明,并且将重新创建变量。
正确地,您需要在语句之外创建变量。
然后,要解决您的问题,我将使用布尔值将其锁定。
类似这样的东西:
var unitLine;
var firstX;
var firstY;
var needToset_XY = true;
if(game.input.activePointer.isDown) {
if(needToset_XY){
firstX = game.input.x;
firstY = game.input.y;
needToset_XY = false;
}
unitLine = game.add.graphics(100, 100);
unitLine.beginFill(0xFF3300);
unitLine.lineStyle(10, 0xffd900, 1);
unitLine.moveTo(firstX, firstY);
unitLine.lineTo(game.input.x, game.input.y);
}
这意味着在第一次之后不能更改firstX和firstY值。
如果这一切都在游戏循环中,则需要在循环之外声明前四个变量,否则它们将每次更新。