任天堂のWii (ウィー) をもらった。

Nintendo Wii

# Wii 本体は Amazon.co.jp: Wii よりも近所のゲーム屋のほうが安かった。

せっかくなのでWiiリモコンをブンブン振り回したいと思って、やけに安くなっていたゲーム「ドラゴンクエストソード」を買ってみた。

Dragon Quest Swords

アマゾンで新品が定価の半額以下というのがおそろしい。
Amazon.co.jp: ドラゴンクエストソード 仮面の女王と鏡の塔

やってみた感じでは、たしかにブンブン振って楽しめるけど、もっと自由に振り振りしたかった。
格闘ゲームのコマンドのような感じで、振り方によって技が出るとか。そういうのを期待してた。

せっかくなのでインターネットチャンネルでいろいろやってみたい

と思ったけど、あまりやりたいことがない。
でも、ドラクエソードっぽいことがやりたくなったので、とりあえずFlashでそれっぽいものを作ってみた。

Flash上でマウスを振ると太刀筋っぽい閃光が走る (縦横斜めに正規化):

音は TAM Music Factory のフリー素材 sound se03.wav を使わせていただいた。サウンド、カコイイ。

しかし、残念ながら Wii 上では動作せず。
何か Flash のバージョンとかの問題かなぁ。

ソースコード (Slash.as)


package {
 
  import flash.display.*;
  import flash.events.*;
  import flash.filters.*;
  import flash.media.*;
  import flash.text.*;
  import flash.utils.*;
  import mx.core.*;
 
  [SWF(width="780", height="380", backgroundColor="#000000", frameRate="30")]
 
  public class Slash extends Sprite {
 
    // sound se03.wav by TAM Music Factory (http://www.tam-music.com/)
    [Embed(source="se.mp3")]
    private var Sound:Class;
    private var mySound:SoundAsset = new Sound() as SoundAsset;
 
    private var MAX_X:Number = 780;
    private var MAX_Y:Number = 380;
 
    private var preMouseX:Number = 0.0;
    private var preMouseY:Number = 0.0;
    private var message:TextField;
    private var frameLines:Shape;
    private var slashShape:Shape;
 
    public function Slash() {
 
      var myFilters:Array = new Array();
      myFilters.push(new GlowFilter(0x00FFFF, 0.5, 5, 5, 3, BitmapFilterQuality.HIGH, true, false));
      this.filters = myFilters;
 
      frameLines = new Shape();
      frameLines.graphics.lineStyle(2, 0x0000ff);
      frameLines.graphics.moveTo(    0,     0);
      frameLines.graphics.lineTo(MAX_X,     0);
      frameLines.graphics.lineTo(MAX_X, MAX_Y);
      frameLines.graphics.lineTo(MAX_X,     0);
      frameLines.graphics.lineTo(    0,     0);
      addChild(frameLines);
 
      slashShape = new Shape();
      addChild(slashShape);
 
      // 表示メッセージのスタイル
      var format:TextFormat = new TextFormat();
      format.bold = false;
      format.italic = false;
      format.size = 10;
      format.underline = false;
      format.font = "_等幅";
 
      // 表示メッセージ
      message = new TextField();
      message.text = "(x,y)=(0.0,0.0)";
      message.autoSize = TextFieldAutoSize.LEFT;
      message.selectable = false;
      message.setTextFormat(format);
      message.textColor = 0xFFFFFF;
      addChild(message);
 
      // タイマーで定期的にイベントを発生させる
      var timer:Timer = new Timer(300,0);
      timer.addEventListener(TimerEvent.TIMER, onTimer);
      timer.start();
    }
 
    private function onTimer(evt:TimerEvent):void {
 
      var x:Number = mouseX;
      var y:Number = mouseY;
 
      var diffX:Number = x - preMouseX;
      var diffY:Number = y - preMouseY;
 
      var right:Boolean = false;
      var left :Boolean = false;
      var down :Boolean = false;
      var up   :Boolean = false;
      if(diffX > MAX_X/2){
        right = true;
      }
      if(diffX < -MAX_X/2){
        left = true;
      }
      if(diffY > MAX_Y/2){
        down = true;
      }
      if(diffY < -MAX_Y/2){
        up = true;
      }
 
      if(right){
        if(down){
          doSlash(0, 0, MAX_X, MAX_Y);
        }else if(up){
          doSlash(0, MAX_Y, MAX_X, 0);
        }else{
          doSlash(0, MAX_Y/2, MAX_X, MAX_Y/2);
        }
      }else if(left){
        if(down){
          doSlash(MAX_X, 0, 0, MAX_Y);
        }else if(up){
          doSlash(MAX_X, MAX_Y, 0, 0);
        }else{
          doSlash(MAX_X, MAX_Y/2, 0, MAX_Y/2);
        }
      }else{
        if(down){
          doSlash(MAX_X/2, 0, MAX_X/2, MAX_Y);
        }else if(up){
          doSlash(MAX_X/2, MAX_Y, MAX_X/2, 0);
        }else{
          slashShape.graphics.clear();
        }
      }
 
      preMouseX = x;
      preMouseY = y;
 
      message.text = "(x,y)=(" + x + "," + y + ")";
    }
 
    private function doSlash(x1:Number, y1:Number, x2:Number, y2:Number):void {
      var channel:SoundChannel = mySound.play();
      slashShape.graphics.clear();
      slashShape.graphics.lineStyle(10, 0xFFFFFF);
      slashShape.graphics.moveTo(x1,y1);
      slashShape.graphics.lineTo(x2,y2);
    }
 
  }
}

Slash-config.xml


<flex-config>
  <output>slash.swf</output>
  <default-size>
    <width>400</width>
    <height>400</height>
  </default-size>
  <default-frame-rate>30</default-frame-rate>
  <default-background-color>0x000000</default-background-color>
  <use-network>true</use-network>
  <benchmark>true</benchmark>
  <compiler>
    <incremental>true</incremental>
    <source-path>
      <path-element>libs/</path-element>
    </source-path>
  </compiler>
</flex-config>

# Flex 2 SDK にてコンパイル。

ドラゴンクエストソード参考動画

剣筋は細い線からだんだん太くなって、細くなって消えていく感じ?

ドラゴンクエストソードって、企画はジニアス・ソノリティ で、開発はエイティング ということで、スクウェア・エニックスは販売ってところなのかな。 「ドラクエ」シリーズに携わった山名学氏が新会社「ジニアス・ソノリティ」を設立。任天堂とポケモンが出資 という記事もあるので、いちおう元々の関係者ばかりだとは思うけど、ブランドと制作者が離れていく雰囲気。

追記: 2007-10-18

Flex 2 SDK ではダメっぽいので MTASC で 似非ドラゴンクエストソード で挽回。

tags: zlashdot Flash Flash Flex Game Wii

Posted by NI-Lab. (@nilab)