В ожидании ввода текста хитро

Я делаю игру в стиле старых финальных фэнтезийных игр с поворотом теста по математике, поэтому всякий раз, когда пользователь пытается выполнить действие в бою, он должен ответить на вопрос. проблема в том, что я не могу заставить программу остановиться до тех пор, пока они не сделают ввод (так что в настоящее время они могут правильно задать вопрос, а затем просто продолжать выполнять действия с этим ответом или даже не помещая ответ в atall). Я пытался сделать бесконечный цикл до тех пор, пока не был использован ввод текста, но это не сработало, так как это также остановило ввод текста, вот компоненты, которые управляют боем и определяют текстовое поле (которое является текстовым полем HTML-форм):

//component to take text input for questions and mabye other stuff
Crafty.c('InputText', {
init:function() {
this.requires('Actor')
Crafty.e("HTML")
.attr({x:550, y:200, w:100, h:100})
.append("<form name='Textinput'><div id='Text'>Answer: </div><input type='text'   name='GuessAnswer' id='GuessAnswer'><input type='button' value='Go' onclick='SaveText()'></form>");
},
});

//player character during combat
//This also controls player input during combat and resolves most of the combat
//Will display and take inputs for quesions eventually
Crafty.c('BattlePlayer', {
init:function() {
var OpPos = 1;
var HealthPas = 100 + ',' + 100;
FightOver = false;
monsterBeat = false;
//Displays options for the first time with attack selected
this.requires('Actor, spr_BattlePlayer, SpriteAnimation, Keyboard')
.bind('KeyDown', function () { if (this.isDown('SPACE')) Crafty.scene('World');})
.bind('KeyDown', function () { if (this.isDown('ENTER')) HealthPas =  this.BattleSelect(OpPos, HealthPas);})
.bind('KeyDown', function () { if (this.isDown('S')) if (OpPos < 3){OpPos = OpPos +  1}; this.MenuMove(OpPos); })
.bind('KeyDown', function () { if (this.isDown('W')) if (OpPos > 1) {OpPos = OpPos - 1}; this.MenuMove(OpPos); });

Crafty.e('InputText');
Crafty.e('2D, DOM, Text')
.attr({ x: 100, y: 80 })
.text('Enemy:')
.textColor('#C8C8C8');
Crafty.e('2D, DOM, Text')
.attr({ x: 100, y: 130 })
.text('Player:')
.textColor('#C8C8C8');
Crafty.audio.stop('Footstep');
Crafty.e('HealthBar').at(1,4);
Crafty.e('HealthBar').at(1,6);
this.HealthDisplay(HealthPas);

Crafty.e('AttackSel').at(3,8);
Crafty.e('HealUnsel').at(3,13);
Crafty.e('RunUnsel').at(3,18);

var MenuPos = 1;    

},
//function for displaying what option is currently selected
MenuMove: function(OpPos) {
switch (OpPos)
{
case 1:
//Attack case
Crafty.e('AttackSel').at(3,8);
Crafty.e('HealUnsel').at(3,13);
Crafty.e('RunUnsel').at(3,18);
break;

case 2:
//Defend case
Crafty.e('AttackUnsel').at(3,8);
Crafty.e('HealSel').at(3,13);
Crafty.e('RunUnsel').at(3,18);
break;

case 3:
//Run case
Crafty.e('AttackUnsel').at(3,8);
Crafty.e('HealUnsel').at(3,13);
Crafty.e('RunSel').at(3,18);
break;

default:
//Incorrect input case
Crafty.e('AttackUnsel').at(3,8);
Crafty.e('HealUnsel').at(3,13);
Crafty.e('RunUnsel').at(3,18);
}
},

HealthDisplay: function(HealthPas) {
var Nums = HealthPas.split(',');
for (var i = 1; i<(Nums[1]/10)+1; i++)
{
    Crafty.e('HealthBlock').at(i,4);
}
for (var i = 1; i<(Nums[0]/10)+1; i++)
{
    Crafty.e('HealthBlock').at(i,6);
}
},

//function to pause game untill answer has been made
AnswerPause: function() {
MadeGuess = false;
while (MadeGuess == false)
{

}
},

//function for carrying out battle options
//Within this function Num[0] represents players health and Nums[1] represents the Enemy Health.
BattleSelect: function(OpPos, HealthPas) {
var Nums = HealthPas.split(',');
//this.AnswerPause();
switch (OpPos)
{
case 1:
//Attack case
//if the fight has been resolved, no further combat actions can be taken
if (FightOver == false)
{
if (AnsCorrect == true)
{
//takes away enemy health
Nums[1] = Nums[1] - 20;
Crafty.audio.play('attack');
}
this.EndCheck(Nums[0], Nums[1]);
//takes away player health
Nums[0] = Nums[0] - 10; 
}
break;

case 2:
//Heal case
//as this was originaly a string, minus 1 to change it to an integer
Nums[0] = Nums[0] - 1 + 21;
if (Nums[0] > 100)
{
Nums[0] = 100;
}
this.EndCheck(Nums[0], Nums[1]);
break;

case 3:
//Run case
//switch checks what room the player is in the transport them back there
this.LocationFind();
break;

default:
this.EndCheck(Nums[0], Nums[1]);
Nums[0] = Nums[0] - 10;
}

this.EndCheck(Nums[0], Nums[1]);
//put player and monster health values back to allow both to be passed back to componenet.
HealthPas = Nums[0] + ',' + Nums[1];
//Displays Player and Enemy Health via a 10 part health bar
if (OpPos != 3)
{   
Crafty.e('HealthBar').at(1,4);
Crafty.e('HealthBar').at(1,6);
this.HealthDisplay(HealthPas);
}
return HealthPas;
},

//
//function to check for winning conditions
EndCheck : function(PlayerHealth, EnemyHealth)
{
if (EnemyHealth < 1)
    {
    FightOver = true;
    monsterBeat = true;
    }
else if (PlayerHealth < 1)
    {
    FightOver = true;
    }

if (monsterBeat == true)
{   
this.bind('KeyDown', function () { if (this.isDown('ENTER')) this.LocationFind();})
Crafty.e('2D, DOM, Text')
.attr({ x: 500, y: 150 })
.text('Victory!');
}   
else if (FightOver == true)
{
this.bind('KeyDown', function () { if (this.isDown('ENTER')) this.LocationFind();})
Crafty.e('2D, DOM, Text')
.attr({ x: 500, y: 150 })
.text('Defeat!');
}
},

});

2 ответа

Я не уверен, что это будет лучшим подходом, но вы можете просто приостановить игровой цикл лукавого, пока они не закончат:

Crafty.pause(true)

И затем отмените паузу, как только вы получили вход:

Crafty.pause(false)

Это остановит такие вещи, как фоновая анимация. Кроме того, я не уверен, что он отключит отправку событий клавиатуры / мыши, что может быть важно.

Более гибкий подход может заключаться в том, чтобы иметь компоненты, которые вы заботились о прослушивании события паузы; это позволяет вам выбирать, как компоненты ведут себя, но вам придется реализовать это самостоятельно.

Всякий раз, когда нажимается эта кнопка "Перейти", она вызывает функцию с именем "SaveText()". SaveText может быть реализован, чтобы делать то, что вам нужно, или он может легко вызвать другую функцию, например, "ContinueBattle()".

Другие вопросы по тегам