質問する
質問する
スプライトが質問して応答を待つ、ステージが質問して応答を待つ、を試してみましょう。
動作例 【タブレット非推奨】
スプライト、ステージが質問をします。
『A』キーやスペースキーを使うので、タブレットでの利用は推奨しません。
※ TypeScratcherロゴをクリックで表示、緑の旗クリックで動作開始
メッセージ
緑の旗を押して開始します。
(1) スペースキーを押すと『ねこ』が質問します。
(2) Aキーを押すと、『ステージ』が質問をします。
(3) 答えが「はい」「いいえ」以外の場合は、再度の質問をします。
(4) 答えが「はい」「いいえ」の場合、スレッドはすべて終了します。
(5) 再開するときは「緑の旗」を押してください。
sub/images.ts
typescript
import { Typescratcher as Ts } from "@tscratch3/typescratcher";
// 【画像読み込み】
import catSvg from './assets/cat.svg';
import WaterSvg from './assets/water.svg';
/* ネコ */
export const CatImage = new Ts.Image( { catSvg } );
/* 水中 */
export const WaterImage = new Ts.Image( { WaterSvg } );index.ts
typescript
import { Typescratcher as Ts } from "@tscratch3/typescratcher";
import type { Sprite } from "@tscratch3/typescratcher";
// イメージを取り込む
import { CatImage, WaterImage } from './sub/images';
// ステージの幅
const StageWidth = Ts.StageBounds.w;
const StageHeight = Ts.StageBounds.h;
// 【スプライト】(Spriteネコ)
const cat = new Ts.Sprite( 'cat' );
// 画像をスプライトへ追加
cat.Costume.add( CatImage );
cat.Motion.position.xy = [ 0, 0 ];
// 【ステージ】(water)
const stage = new Ts.Stage();
stage.Backdrop.add( WaterImage );
// 変数
const answer = Ts.Variable.string( '' );
Ts.Variable.monitoring( { '答え': answer } );
answer.hide(); // 隠す
/** 質問中のフラグ */
let askingNow = false;
// 旗が押されたときの「ねこ」のスレッド
cat.Event.flagPresser().func = async function* ( this:Sprite ){
answer.hide(); // 変数(answer)を隠す
askingNow = false;
this.Motion.position.xy = [ 0, 0 ];
};
/** スプライト(ねこ)に質問をさせるメッセージ */
const ASKING = 'ASKING';
// スペースキーが押されたときの「ねこ」のスレッド
cat.Event.keyPresser( Ts.Keyboard.SPACE ).func = async function* ( this:Sprite ) {
if( askingNow === true )
return;
// 質問処理中でないときメッセージ(ASKING)を送る
this.Broadcast.send( ASKING );
}
// メッセージ「ASKING」を受け取ったときの「ネコ」のスレッド
cat.Broadcast.receiver( ASKING ).func = async function* ( this:Sprite ) {
askingNow = true;
// 質問をして応答を待つ
// 応答が返ったとき変数(answer)に答えを入れる
answer.text = await this.Sensing.askAndWait( '今日はご機嫌よろしいですか?' );
answer.show();
if( answer.text == 'はい' ) {
this.Looks.bubble.say( 'YES' ); // フキダシ(言う)
}else if( answer.text == 'いいえ' ) {
this.Looks.bubble.think( 'no....' ); // フキダシ(考える)
}else{
// 答えが「はい」「いいえ」でない場合
this.Looks.bubble.say( '' ); // フキダシを消す
askingNow = false;
// 彩度、質問をするため、メッセージを送る
this.Broadcast.send( ASKING );
}
}
/** メッセージID(ステージに質問させる) */
const ASKING_STAGE = "ASKING_STAGE";
// キー「A」が押されたときの「ステージ」のスレッド
stage.Event.keyPresser( 'A' ).func = async function* ( this:Stage ) {
if( askingNow === false ){
askingNow = true;
// メッセージを送り、終わるまで待つ
await this.Broadcast.sendAndWait( ASKING_STAGE );
askingNow = false;
}
}
// メッセージ「ASKING_STAGE」を受け取ったときの「ステージ」のスレッド
stage.Broadcast.receiver( ASKING_STAGE ).func = async function* ( this:Sprite ) {
answer.hide();
// 質問をして応答を待つ
// 応答が返ったとき変数(answer)に答えを入れる
answer.text = await this.Sensing.askAndWait( 'ステージだよ。「はい」か「いいえ」で答えて' );
answer.show();
if( answer.text == 'はい' || answer.text == 'いいえ' ){
return;
}
// 答えが「はい」「いいえ」でない場合
// 彩度、質問をするためのメッセージを送る
this.Broadcast.send( ASKING_STAGE );
}
// 開始
Ts.engine.start();index.tsについて
『await this.Sensing.askAndWait('今日はご機嫌よろしいですか?')』: 質問をして答えが返るのを待ちます。
スプライトから質問をすると、フキダシで質問文を表示します。
ステージから質問すると、質問欄の上部に質問文を表示します。