2014年3月1日土曜日

開発環境

Head First JavaScript ―頭とからだで覚えるJavaScriptの基本( Michael Morrison (著), 豊福 剛 (翻訳)、オライリージャパン)の8章(ページの部品をかき集める)、自分で考えてみよう(p.385)をDartで考えてみる。

その他参考書籍

自分で考えてみよう(p.385)

コード

sample.dart

import 'dart:html';

void main() {
  decisions.forEach((SpanElement span) {
    span
        ..onMouseOver.listen((MouseEvent event) => span.className =
            'decisionhover')
        ..onMouseOut.listen((MouseEvent event) => span.className = 'decision')
        ..onClick.listen((MouseEvent event){
          var decision = span.id == 'decision1' ? 1 : 2;
          changeScene(decision);
        });
  });
  decision2.style.visibility = 'hidden';
  start..onClick.listen((MouseEvent event) => reset())
  ..onMouseOver.listen((MouseEvent event) => start.className = 'decisionhover')
  ..onMouseOut.listen((MouseEvent event) => start.className = 'decision');
  start.style.visibility = 'hidden';
}

SpanElement decision1 = querySelector('#decision1');
SpanElement decision2 = querySelector('#decision2');
SpanElement start = querySelector('#start0');
DivElement history = querySelector('#history_figure_adventure');
List<SpanElement> decisions = [decision1, decision2];
int cur_scene = 0;

void changeScene(int decision) {
  String message = '';
  switch (cur_scene) {
    case 0:
      cur_scene = 1;
      message = '旅は分かれ道から始まります。';
      decision2.style.visibility = 'visible';
      replaceNodeText('decision1', '決定1');
      start.style.visibility = 'visible';
      break;
    case 1:
      if (decision == 1) {
        cur_scene = 2;
        message = '林の中でかわいい小さな家を見つけました。';
      } else {
        cur_scene = 3;
        message = '橋にたち、穏やかな流れを眺めます。';
      }
      break;
    case 2:
      if (decision == 1) {
        cur_scene = 4;
        message = '窓に魔女';
      } else {
        cur_scene = 5;
        message = '魔女に食われる';
        spanVisibility();
      }
      break;
    case 3:
      if (decision == 1) {
        cur_scene = 6;
        message = '巨人に食われる';
        spanVisibility();
      } else {
        cur_scene = 7;
        message = '橋の上に巨人';
      }
      break;
    case 4:
      if (decision == 1) {
        cur_scene = 8;
        message = '続く…';
      } else {
        cur_scene = 5;
        message = '魔女に食われる';
      }
      spanVisibility();
      break;
    case 7:
      if (decision == 1) {
        cur_scene = 6;
        message = '巨人に食われる';
      } else {
        cur_scene = 9;
        message = '続く';
      }
      spanVisibility();
      break;
  }
  replaceNodeText('scenetext', message);
  if (cur_scene != 0) {
    ParagraphElement p = new ParagraphElement();
    p.text = '決定 $decision -> シーン $cur_scene : $message';
    history.append(p);
  } else {
    history.children = [];
  }
}

void replaceNodeText(String id, String new_text) {
  Node node = querySelector('#$id');
  Text text_node = new Text(new_text);
  while (!node.childNodes.isEmpty) {
    node.childNodes.first.remove();
  }
  node.append(text_node);
}

void reset() {
  cur_scene = 0;
  replaceNodeText('scenetext', 'シーン説明');
  replaceNodeText('decision1', 'ゲームスタート');
  decision1.style.visibility = 'visible';
  decision2.style.visibility = 'hidden';
  start.style.visibility = 'hidden';
  history.children = [];
}

void spanVisibility() {
  decisions.forEach((SpanElement span) => span.style.visibility = 'hidden');
  start.style.visibility = 'visible';
}
シーン説明

ゲームスタート 決定2 始めから

0 コメント:

コメントを投稿