• 締切済み

Flashでお絵描きアプリを作っていますが…

現在、Adobe Flash Professional CS6でBitmapを使ったお絵描きアプリを作っているのですが途中で描画した線が消えてしまい困っています。 どなたか知恵を貸していただけないでしょうか。 現段階のプログラムは、Bitmapを配列で管理をしたくて以下のような手順で組んでいます。 1.ステージ上のボタンが押されるとイベントが発生 2.配列の1つにBitmapをnewする 3.2のBitmapDataのサイズと透過を設定しBitmapDataを作成 4.addChild()で表示 5.描画処理 1から5の手順を繰り返して配列にお絵描きの記録をとっています。 最初はうまく動いているのですが、24回以上ボタンを押した時(Bitmapを24回以上addChildすると)に、1番目に描画されたものから順に消えしまい困っています。 以下の2点がわかっていることです。 •Flash上のシュミレータ、Androidのタブレット、iPad3すべて同じ現象が起きます。 •BitmapDataのサイズを小さくしても同じ数で描画が消え始めます。 この問題で何日も悩んでいます。 どなたか、原因や対策がわかる方がいればご回答よろしくお願いします。

  • dokun
  • お礼率100% (1/1)
  • Flash
  • 回答数1
  • ありがとう数1

みんなの回答

  • anyhelp
  • ベストアンサー率43% (79/180)
回答No.1

bitmapではなく 座標を配列に入れましょう。

dokun
質問者

お礼

ありがとうございます!! その方法でやってみます!!

関連するQ&A

  • 下記二つのbitmapDataに関するサンプルソースですが、なぜ問題な

    下記二つのbitmapDataに関するサンプルソースですが、なぜ問題なくaddChildされるのでしょうか? 普通に考えると上から下へパブリッシュされていると思っていたのですが、 厳密には違うということでしょうか? ---------------------------------- var txt:TextField = new TextField(); txt.text = 'あああ'; var bitmapdata = new BitmapData(txt.width,txt.height); var bmp:Bitmap = new Bitmap(bitmapdata); bitmapdata.draw(txt); addChild(bmp); ---------------------------------- bitmapdata.draw(txt); の記述位置をaddChild()の下に記述してもエラーが出ること無く実行されます。 しかし、 bitmapdata.draw(txt); の記述がなければエラーが出ませんが、描画されません。 ---------------------------------- var txt:TextField = new TextField(); txt.text = 'あああ'; var bitmapdata = new BitmapData(txt.width,txt.height); var bmp:Bitmap = new Bitmap(bitmapdata); addChild(bmp); bitmapdata.draw(txt); ---------------------------------- 単純にaddChild()した後に、draw()することができるということでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • as3 ムービークリップにビットマップデータを挿入するクラスがうまくい

    as3 ムービークリップにビットマップデータを挿入するクラスがうまくいかない 上記のとおりなんですが、 前提として ■ライブラリにjpgを一枚読み込んで、Photoというクラス名でリンケージしてあります。 ■ステージにmcというムービークリップを配置しています。 mcにビットマップ化したjpgをaddchildしたかったので、 メインフレームに下記を書きました。 -------------------------------------------------------- var name_str:String = "Photo"; var myClass:Class = Class(getDefinitionByName(name_str)); var bmd:BitmapData = new myClass(0, 0); var bm:Bitmap = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; mc.addChild(bm); -------------------------------------------------------- ※今後動的に生成するのでクラス名は変数にしています。 これは問題なく行きました。 上記を外部クラス化したかったので、 下記のようにしました。 ■PhotoClass ---------------------------------------------------------------------- package { import flash.display.MovieClip; import flash.events.Event; import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.getDefinitionByName; import flash.display.PixelSnapping; public class PhotoClass extends Bitmap { private var myClass:Class;//クラス名 private var bmd:BitmapData; private var bm:Bitmap; //コンストラクタ public function PhotoClass(_name:String) { myClass = Class(getDefinitionByName(_name)); bmd = new myClass(0, 0); bm = new Bitmap(bmd); bm.pixelSnapping = PixelSnapping.ALWAYS; bm.smoothing = true; init(); } public function init():Bitmap { return bm; } } } ---------------------------------------------------------------------- ■メインフレーム var photoAdd:Bitmap = new PhotoClass("Photo"); mc.addChild(photoAdd); これがうまくいきません。 エラーはないのですが、ちゃんとmcに画像が読み込まれません。。。。 ご教授いただければと思います!

    • ベストアンサー
    • Flash
  • actionscript 3.0 初心者です

    現在bitmap処理について調べています。 以下の記述に置いて、ライブラリーにあるpng画像をbitmapで読み込みました。 この画像はswfファイルに埋め込み済みでクラスをtokyo1としています。 続いて、これを.draw()を使って画像に変化を起こそうとしましたが、 こちらはうまく行きませんでした。 どこかおかしいのでしょうか?お心当たりございましたら是非よろしくお願いします。 import flash.display.BitmapData; import flash.display.Bitmap; import flash.geom.Matrix; import flash.geom.ColorTransform; var rectX:Number=40; var rectY:Number=30; var rectwidth:Number=20; var rectheight:Number=20; var rect1:Rectangle=new Rectangle(rectX,rectY,rectwidth,rectheight); var btm_data:BitmapData=new tokyo1(); var btm_obj:Bitmap=new Bitmap(btm_data,PixelSnapping.AUTO,false); var matrix:Matrix=new Matrix(2,0,0,3,0,0); var color:ColorTransform=new ColorTransform(1,1,1,1,0,0,0,0); btm_data.draw(stage,matrix,color,BlendMode.NORMAL,rect1,true); addChild(btm_obj);

    • ベストアンサー
    • Flash
  • アクションスクリプト ビットマップデータ 描画

    Flashゲーム作成のため、アクションスクリプトを学び始めた初心者です。 ゲーム作成中にプレイヤーがミスをした場合、"MISS!!"という文字を画面に描画し、下から上へスクロールさせる処理を考えています。 ビットマップデータにテキストフィールドで指定したテキストを描画しているのですが、その描画位置を指定できなくて困っています。 canvas = new BitmapData(WIDTH, HEIGHT, true, 0x0);// 透明、初期色0x00000000 var bitmap:Bitmap = new Bitmap(canvas); bitmap.scaleX = bitmap.scaleY = 1;// 1倍表示 addChild(bitmap); var tf:TextField = new TextField(); tf.defaultTextFormat = new TextFormat("MS ゴシック", 50, 0xFF0E0E ,true); tf.width = stage.stageWidth; // 幅 tf.height = 50; tf.autoSize = TextFieldAutoSize.CENTER; tf.y = 240; tf.text = "MISS!!"; canvas.draw(tf); これで実行すると、画面上にMISS!!と表示されて、tf=240が適応されません、どうしたらテキストの表示位置の縦方向の位置を変えることができるのでしょうか?教えていただきたいです。

    • ベストアンサー
    • Flash
  • actionscript3.0,hitTest()

    現在hitTestopoint()を使った移動範囲の制限について調べています。 以下のスクリプトにおいて、イラストレーターで作った描画(B)を、円形のオブジェクトms(A,右方向に進んでいく)の移動の制限範囲と使いたいのですが、まず(1)のようになスクリプトを作成すると、正確な描画の範囲ではなく、大まかな範囲(大きな四角)の端で制限が適応されます。(動きが止まります。)この描画はaiデータをライブラリーに読み込んだものをそのままステージに置いただけなので、bitmapにしたらどうなるかと思い、(2)を記述しましたが、こちらも結果は同じでした。どのように考えたらよろしいのでしょうか?お心当たりございましたら、是非お願い致します。 補助画像を添付しております。 *(2)では描画テータにhit3というクラスでリンケージしてます。 (1) import flash.display.Sprite; import flash.events.Event; var ms:Sprite = new Sprite(); ms.graphics.beginFill(0x552277); ms.graphics.drawCircle(30,30,60); ms.graphics.endFill(); addChild(ms); this.addEventListener(Event.ENTER_FRAME,go) function go(event:Event):void{ ms.x += 5 if (! hito4.hitTestPoint(ms.getBounds(this).right,ms.y, true)) { ms.x -= 5; } if (! hito4.hitTestPoint(ms.getBounds(this).left, ms.y, true)) { ms.x += 5; } if (! hito4.hitTestPoint(ms.x, ms.getBounds(this).bottom, true)) { ms.y -= 5; } if (! hito4.hitTestPoint(ms.x,ms.getBounds(this).top, true)) { ms.y += 5; } } (2) import flash.display.Sprite; import flash.events.Event; import flash.display.BitmapData; import flash.display.Bitmap; var hito_bmp:BitmapData= new hito3(0,0); var hito_bmp_on:Bitmap= new Bitmap(hito_bmp,PixelSnapping.AUTO,true); stage.addChild(hito_bmp_on); hito_bmp_on.x=-150 hito_bmp_on.y=-100 var ms:Sprite = new Sprite(); ms.graphics.beginFill(0x552277); ms.graphics.drawCircle(30,30,60); ms.graphics.endFill(); addChild(ms); this.addEventListener(Event.ENTER_FRAME,go) function go(event:Event):void{ ms.x += 5 if (!hito_bmp_on.hitTestPoint(ms.getBounds(this).right,ms.y, true)) { ms.x -= 5; } if (!hito_bmp_on.hitTestPoint(ms.getBounds(this).left, ms.y, true)) { ms.x += 5; } if (!hito_bmp_on.hitTestPoint(ms.x, ms.getBounds(this).bottom, true)) { ms.y -= 5; } if (! hito_bmp_on.hitTestPoint(ms.x,ms.getBounds(this).top, true)) { ms.y += 5; } }

    • ベストアンサー
    • Flash
  • 埋め込んだFlashのサイズの変更

    swfobject.embedSWFで埋め込んだFlashのサイズの変更方法が分からないので教えてください。 たとえば以下のようにhtmlに埋め込んだflashがあるとします。 <script type="text/javascript"> swfobject.embedSWF("hoge.swf", "idhoge", "300", "200", "9.0.0"); </script> 通常上のようにFlashを埋め込む際には縦横のサイズを指定します。 今、ボタンを押すなどのイベントの発生によって上記で指定したflashのサイズを変更したいと考えています。 ここで、flashのサイズ変更はjavascriptで行いたいのですが、 このようなことは可能でしょうか?

  • FlashとJSPの連携

     FlashをJSPに埋め込んで、お互いにやり取りするページを作成しています。 HTMLのタグであるEMBEDで、とりあえずFlashに送ることはできたのですが、EMBEDは送信と同時にFlashを表示してしまいます。 そのため2回以上使用するとFlashが重複して表示されてしまいます。これだと配列が送れません。(可能なら For文でループさせて送れるようにしたい)またFlashからJSPにデータを送る方法もわからないのです。 どなたか教えていただけないでしょうか。

  • Adobe Flash Playerについて

    Adobe Flash Playerについて聞きたいことがあります。 某動画サイトにて動画を見ようと思ったのですが、Adobe Flash Playerが古いかインストールしてないため再生できませんと表示されまして、インストールすべく、ページに飛んで手順通りにやったのですが手順2の画面というかそこまでいかないのです。 何回も「今すぐインストール」というボタンをおして初期化中までは行くのですがそれ以降なんも反応しません。 今までなにもしなくても動画をみれたのに・・・という感じで・・。 原因がよくわからないのでよければお答えくださると嬉しいです。

  • 地図の上にL字スケールを描画

    MDIフレーム上に、複数のチャイルドスタイルのダイアログが存在するプログラムを改造しました。(元は別の人間が作成) その中にMapDKIVの地図を描画しているダイアログがあり、その地図上に別のダイアログをおき、そこに縮尺L字スケールのビットマップを描画しました。(MapDKIVには、その機能がまだ無い為) 色々と試行錯誤した結果、この方法を取ったのですが、納品した矢先、お客様から、地図をマウスでドラッグして動かそうとすると、スムーズに動いたり、カクカクとしか動かなかったり、時には全く動かない事があるとのクレームがありました。(その操作以外は正常に動作している模様) 以前はこの症状はなかったとの事から、今回のL字スケール描画に原因があるのではと調べていますが、原因が見付かりません。 以下に、ソースの一部分を記載しますので、どなたか助言をお願いします。 ******** ビットマップデータ管理クラス ******** ビットマップは、スケール毎に準備 <BitmapData.h> private: CBitmap m_bmpLScale0; CBitmap m_bmpLScale2; <BitmapData.cpp> //-------- 機能 ビットマップ情報の読込 -------- void CBitmapData::Load(void) { m_bmpLScale0.LoadBitmap(IDB_BITMAP_SCALE0); // 全国図 m_bmpLScale2.LoadBitmap(IDB_BITMAP_SCALE2); // 1/160万 //-------- 機能 ビットマップ情報の取得 -------- CBitmap& CBitmapData::GetScaleBitmap(void) { UINT unIndex = GetScaleNumber();// 現在選択されているスケールレベル switch(unIndex) { case 0:  return m_bmpLScale0; break; // 全国図 case 2:  return m_bmpLScale2; break; // 1/160万 ******** 地図描画ダイアログ ******** L字スケール描画用ダイアログの生成 <MainMap.cpp> // 地図描画フレームサイズを取得 m_ctrlMapFrame.GetWindowRect(LPRECT(rect)); // スケールレベルをセット g_BitmapData.SetScaleNumber(m_ctrlMapZoom.GetPos()); // スケール描画用ダイアログの生成(地図フレームの左下位置を渡す) m_pMapScaleDlg = new CMapScaleDlg(); m_pMapScaleDlg->Create(m_hWnd, IDD_MAP_SCALE_DIALOG, ・・・ ******** L字スケール描画ダイアログ ******** //-------- 機能 OnInitDialog() -------- // ウインドウ拡張スタイルをレイヤード設定 lStyle = GetWindowLong( this->m_hWnd, GWL_EXSTYLE ); lStyle |= 0x00080000; SetWindowLong( this->m_hWnd, GWL_EXSTYLE, lStyle ); // レイヤードウィンドウの不透明度と透明のカラーキーを設定(青色部分を透明化する) SetLayeredWindowAttributes( this->m_hWnd, RGB(0,0,255), 100, 0x00001/*LWA_COLORKEY*/ ); //-------- 機能 OnPaint() -------- BITMAP bitmap; CBitmap& mBitmap = g_BitmapData.GetScaleBitmap(); mBitmap.GetBitmap(&bitmap); CSize sz(bitmap.bmWidth, bitmap.bmHeight); CDC dc; dc.CreateCompatibleDC(&PaintDC); CBitmap *pOld = dc.SelectObject(&mBitmap); // もともとのディバイスコンテキストにビットマップを透過で転送(青色部分を透明化する) if( ::TransparentBlt(PaintDC, 0, 0, sz.cx, sz.cy, dc, 0, 0, sz.cx, sz.cy, (UINT)RGB(0,0,255)) == FALSE ){ } // ビットマップ選択解除 dc.SelectObject( pOld); } //-------- 機能 スケール(ビットマップ)変更メッセージを受信 -------- // 現在選択されているスケール用のビットマップを取得(ポインタ) CBitmap& mBitmap = g_BitmapData.GetScaleBitmap(); mBitmap.GetBitmap(&bitmap); CSize sz(bitmap.bmWidth, bitmap.bmHeight); // メインマップダイアログの地図フレームの左下になるよう変更 this->MoveWindow(m_nMapFrameLeft, (m_nMapFrameBottom - sz.cy), sz.cx, sz.cy); // ウインドウの再描画 this->Invalidate(); 1.L字スケール描画用のダイアログを、背景青色で準備 2.L字スケール描画用のダイアログの青色部分を透明化に設定 3.L字スケール描画用のダイアログのウインドウサイズを、選択されているスケール用のビットマップと同じサイズに、且つ、地図フレームの左下に位置を設定 4.地図ダイアログからスケール変更メッセージを受信  (1) その時に選択されているスケール用のビットマップと同じサイズに、且つ、地図フレームの左下に位置を設定  (2) ウインドウの再描画 this->Invalidate() 5.OnPaint()  (1) 現在選択されているスケールのビットマップ情報を取得  (2) ビットマップを透過で転送(青色部分を透明化)    ビットマップのL字以外の部分は青色 以上、文字数制限の為、かなり省略していますが、大変困っています。 とにかく助言を頂きたく、よろしくお願いします。

  • Spriteのサイズが取得できない

    毎度初歩的な質問で恐縮です。 下記のようにビットマップの中心が、スプライトの左上になるように スプライトにビットマップをaddChildしました。 で、その後のwidth,heightのプロパティを参照したところ ビットマップのサイズは取得できるのですが、 スプライトのサイズが取得できません。 どのようにすれば取得することができるのでしょうか。 var bm:Bitmap = new Bitmap(event.bitmapData) as Bitmap; bm.x = bm.width / 2 * -1 ; bm.y = bm.height / 2 * -1 ; bm.smoothing =true var bm_s:Sprite = new Sprite; bm_s.x = app_width / 2 + def_z ; bm_s.y = app_height + def_z ; bm_s.z = def_z; bm_s.width = bm.width ; bm_s.height = bm.height ; bm_s.addChild( bm ); trace( bm.width.toString() ); ←値は取得できる trace( bm_s.width.toString() );←値が0になる

    • ベストアンサー
    • Flash