В ожидании ввода текста хитро
Я делаю игру в стиле старых финальных фэнтезийных игр с поворотом теста по математике, поэтому всякий раз, когда пользователь пытается выполнить действие в бою, он должен ответить на вопрос. проблема в том, что я не могу заставить программу остановиться до тех пор, пока они не сделают ввод (так что в настоящее время они могут правильно задать вопрос, а затем просто продолжать выполнять действия с этим ответом или даже не помещая ответ в 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()".