[AS3] レゴとダイヤブロック

2009/08/24

こんにちは。きんくまです。

デモ(ソースは一番下に)

 
うちにはレゴがあるんですが、3歳のうちの子供だとまだ力が弱く、
うまくはめたりとったりすることができませんでした。
それでいつも「パパやって」となっていました。
困ったなーと思い、レゴの小さい子用のデュプロを買おうか迷っていました。

そんなときに、「そういえば、ダイヤブロックってあったなー」と思い、
検索をかけたところ、こんな記述を発見。

>> ダイヤブロック 基本のバケツ

 それぞれのブロックの特徴を列挙すると、1:レゴはパーツが薄く
(背が低く)ダイヤは厚い(高い)。2:レゴは固着が強くダイヤは弱い。
3:レゴは特殊パーツがきわめて多くダイヤは比較的少ない。4:レゴは
ダイヤに比べ高価。5:ダイヤは損耗しやすい(レゴは知らない)。
 つまりダイヤは部品が大きくて脱着しやすいので子供向きと言えます。
レゴはおよそダイヤの半分くらいの厚さ(高さ)なので同型の薄いパーツ
を付けたり、板状の部品に薄くて小さい部品を付けた場合、分離はきわ
めて困難です。大人でも困難で子供ならまず無理。それに対しダイヤは
脱着とも3歳前後から可能です。ただし損耗し、次第に固着が緩くなり、
動かして遊ぶと分離しやすくなります。また、ダイヤの特殊パーツの少
なさは欠点ではなく、想像力の源となる利点と考えられますし、部品同
士の相性問題も少ないです。
 総括すると、私は子供にはダイヤをおすすめします(大人ならレゴ)。
ダイヤは損耗しやすいですが、大人になるまで使うわけではないので
許容範囲だと思われます。子供が三歳ならばこの「基本のバケツ」が
初めての購入としてよい選択肢だと思います(ジュニアダイヤブロック
ではなくて)。

おお、まさに私の欲していた情報!
なので、デュプロはやめ。さらに、ダイヤブロックジュニアもやめ。
普通のダイヤブロックを購入しにトイザらスにいきました。

トイザらスは外資のせいか、非常にレゴコーナーが充実している割に、ダイヤブロックはちんまりと片隅に追いやられていました。
本当はバケツのセットが欲しかったのですが、うっていなかったので500というのを購入。
>> ダイヤブロック バラエティ 500 version 2008

早速、開けてみて子供に試させたところ、
「見事、着脱成功!!」
ひとりで遊べるようになりました。

ダイヤブロックは見た目が大作りな変わりに、小さな子供でも楽にとりはずしができるのが良いです。
そのかわりやっぱりレゴの方が見た目的にはかっこいいかな。
ダイヤブロック、ちょっと損してる??
最近は大人向けにもこんな感じのおしゃれなやつを販売しているみたいです。
>> DiaBlock Colors Red

ちなみに販売はタカラトミーかと思ったら、カワダだった。
営業力が弱いのかなあー。もっと頑張ってほしい。期待してます!

以下最初のASのソース

package
{
  import caurina.transitions.Tweener;
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.Graphics;
  import flash.display.MovieClip;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.geom.Matrix3D;
  import flash.text.TextField;
  import flash.utils.getDefinitionByName;


  public class Main extends MovieClip
  {
    public var lego:BitmapData;
    public var panels:Array;
    public var isEffecting:Boolean = false;
    public var wrapper:Sprite;
    public var startTxt:TextField;
    public var isInit:Boolean = true;

    public function Main()
    {
      this.addEventListener(Event.ADDED_TO_STAGE, init);
    }

    public function init(e:Event):void
    {
      //fla内にビットマップを読み込んで取り出す
      var LEGO:Class = getDefinitionByName("LEGO") as Class;
      lego = new LEGO(0, 0);
      createPanels();
      stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHD);

    }

    private function mouseDownHD(e:MouseEvent):void
    {
      if (isInit) {
        startTxt.visible = false;
        isInit = false;
      }
      if (isEffecting) {
        return;
      }
      isEffecting = true;
      var i:int;
      var panel:Sprite;
      for (i = 0; i < panels.length; i++) {
        panel = panels[i];
        Tweener.addTween(panel, {
          x:Math.random() * 600 - 300,
          y:Math.random() * 600 - 300,
          z:Math.random() * 600 - 300,
          rotationX:Math.random() * 720 - 360,
          rotationY:Math.random() * 720 - 360,
          rotationZ:Math.random() * 720 - 360,
          time:2,
          transition:"easeoutquart"
        });
        var obj:Object = {
          x:panel.x,
          y:panel.y,
          z:0,
          rotationX:0,
          rotationY:0,
          rotationZ:0,
          time:2,
          transition:"easeinquart",
          delay:2
        }
        if (i == panels.length - 1) {
          obj.onComplete = effectCompleteHD
        }
        Tweener.addTween(panel, obj);
      }
      addEventListener(Event.ENTER_FRAME, update);
    }

    private function effectCompleteHD():void
    {
      isEffecting = false;
      removeEventListener(Event.ENTER_FRAME, update);
    }

    private function createPanels():void
    {
      var offsetX:Number = (stage.stageWidth - 20 * col) / 2;
      var offsetY:Number = (stage.stageHeight - 20 * row) / 2;
      wrapper = new Sprite();
      wrapper.z = 0;
      wrapper.x = offsetX;
      wrapper.y = offsetY;
      addChild(wrapper);
      panels = new Array();
      var panel:Sprite;
      var col:int = lego.width;
      var row:int = lego.height;
      var i:int, j:int;
      var color:int;

      for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++ ) {
          color = lego.getPixel(j , i);
          panel = createPanel(color);
          panel.x = j * 20 - col / 2 * 20;
          panel.y = i * 20 - row / 2 * 20;
          wrapper.addChild(panel);
          panels.push(panel);
        }
      }
    }

    private function createPanel(color:int):Sprite
    {
      var sp:Sprite = new Sprite();
      var g:Graphics = sp.graphics;
      g.beginFill(color, 1);
      g.drawRect( -10, -10, 20, 20);
      g.endFill();
      g.lineStyle(1, 0x4E4E4E, 0.5);
      g.moveTo( -10, -10);
      g.lineTo( -10, 10);
      g.lineTo( 10, 10);
      g.lineTo(10, -10);
      g.lineTo( -10, -10);
      return sp;
    }

    public function update(e:Event):void
    {
      var hw:Number = stage.stageWidth / 2;
      var hh:Number = stage.stageHeight / 2;
      var offsetX:Number = (hw - mouseX) / hw;
      var offsetY:Number = -(hh - mouseY) / hh;
      wrapper.rotationY += (offsetX * 180 - wrapper.rotationY) * 0.1;
      wrapper.rotationX += (offsetY * 180 - wrapper.rotationX) * 0.1;
      var i:int;
      var len:int = panels.length;
      var panel:Sprite;
      for (i = 0; i < len; i++) {
        panel = panels[i];
        var mt3:Matrix3D = panel.transform.getRelativeMatrix3D(wrapper);
        panel.z = mt3.position.z;
        if (panel.z > 0) {
          panel.alpha =  (300 - panel.z) / 300;
        }
      }
      panels.sortOn("z", Array.DESCENDING | Array.NUMERIC);
      for (i = 0; i < len; i++) {
        wrapper.setChildIndex(panels[i], i);
      }
    }
  }

}
LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る