もっとなめらかな線を描く方法

このQ&Aのポイント
  • ActionScript3でなめらかな線を描く方法についてアドバイスをください
  • マウスダウンしたままマウスを動かすと軌跡が残り、マウスアップで終わるプログラムを書いたが、線がカクカクしている
  • アルゴリズムや改善方法を教えてください
回答を見る
  • ベストアンサー

もっとなめらかな線を描く方法

マウスダウンしたままマウスを動かすと軌跡が残るようにしてマウスアップでそれが終わるという、一般的な「線を描く」というプログラムをActionScript3で書きました。 しかし、以下のコードでは物足りないのです。もっとなめらかに線を描きたいのです、このコードではカクカクしていると感じます。updateAfterEventもしてみましたが、まだ満足できません。よいアルゴリズムなど、ご存じの方おりましたらアドバイスを下さい。よろしくお願いします。 言語は、ActionScript3で回答願いたいですが、AS2やAS1や他の言語しか知らないけど改善方法は思いつくといった場合、その言語でも構いません。なんとか翻訳してみようと思います //フレームアクションです var nowdown:Boolean=false; var oldX:Number=0; var oldY:Number=0; var g:Graphics=this.graphics; g.lineStyle(5,0x00ffff); stage.addEventListener(MouseEvent.MOUSE_DOWN,PushPen); function PushPen(e:MouseEvent):void{ trace("down"); nowdown=true; oldX=stage.mouseX; oldY=stage.mouseY; } stage.addEventListener(MouseEvent.MOUSE_MOVE,MovePen); function MovePen(e:MouseEvent):void{ trace("move"); if(nowdown){ trace("move","if"); g.moveTo(oldX,oldY); g.lineTo(stage.mouseX,stage.mouseY); oldX=stage.mouseX; oldY=stage.mouseY; e.updateAfterEvent(); } } stage.addEventListener(MouseEvent.MOUSE_UP,UpPen); function UpPen(e:MouseEvent):void{ nowdown=false; }

  • Flash
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

エルミート曲線を検索してみてください

e271828
質問者

お礼

どうもありがとうございます。2点とそれぞれの接線で曲線が引けることが分かりました。この方法を応用してみようと思います! この質問は解決です! ▼こちらの質問についてもしアドバイス可能な方おられましたらお願いしたいです。よろしくお願いします。 ロープをゆらす、ムチを振るシミュレーションについて http://okwave.jp/qa4731300.html

関連するQ&A

  • マウスでドラッグして絵を描くSWFを作っています

    マウスでドラッグして絵を描くSWFを作っています ムービークリップ"masu"を置き、 下のスクリプトで、マウスのボタンを押してしてそのままマウスを動かすと動きに沿って線は引かれ、hの値も正しくトレースされるのですが、ボタンをあげても TypeError: Error #1034: 強制型変換に失敗しました。flash.events::MouseEvent@2ac45ea1 を fl.motion.MotionEvent に変換できません。 というエラーが出力され、 function DEL(eventObject:MotionEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE,LINE); } が動きません。なぜでしょうか? また、AS1は少しはわかりますがAS3は初心者ですので、もっとよいスクリプトなどありましたら挙げていただけるとうれしいです import fl.motion.MotionEvent; var h = 1; this.masu.addEventListener(MouseEvent.MOUSE_DOWN,MOVE); this.masu.addEventListener(MouseEvent.MOUSE_UP,DEL); function MOVE(eventObject:MouseEvent):void{ this.masu.graphics.moveTo(mouseX,mouseY); this.masu.addEventListener(MouseEvent.MOUSE_MOVE,LINE); } function LINE(eventObject:MouseEvent):void{ h++; trace(h); this.masu.graphics.lineStyle(3,0x000000); this.masu.graphics.lineTo(mouseX,mouseY); } function DEL(eventObject:MotionEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE,LINE); }

    • ベストアンサー
    • Flash
  • マウスアウトで非表示にする

    シーン1に、mc(ムービークリップ)とcomment1(ムービークリップ)を配置 mcにマウスオーバーするとcomment1が表示される。 mcよりマウスアウトするとcommen1が非表示になる。 という感じにしたいのですが、マウスアウトしても非表示に出来ないで困っています。 //----------------------------------- MovieClip(root).comment1.visible = false; var pointX:Number=70; var pointY:Number=50; mc.addEventListener(MouseEvent.MOUSE_OVER, fl_MouseOver); function fl_MouseOver(event:MouseEvent):void { stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveFunc); function mouseMoveFunc(e:MouseEvent):void { MovieClip(root).comment1.visible = true; MovieClip(root).comment1.x=stage.mouseX+pointX; MovieClip(root).comment1.y=stage.mouseY+pointY; } } mc.addEventListener(MouseEvent.MOUSE_OUT, fl_MouseOver2); function fl_MouseOver2(event:MouseEvent):void { mc.removeEventListener(MouseEvent.MOUSE_OVER, fl_MouseOver); MovieClip(root).comment1.visible = false; } //-----------------------------------

    • ベストアンサー
    • Flash
  • flashCS4を使っています。初心者です。

    flashCS4を使っています。初心者です。 シンボルをクリックした時にマウスカーソルを変えたいのですが、どのようなスクリプトを書いたらいいのでしょうか。 今は、 stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_move); function mouse_move(event:MouseEvent){ yubi1.x =stage.mouseX; yubi1.y =stage.mouseY; } Mouse.hide(); というスクリプトで、カーソルに「yubi1」という画像を使っています。 このyubi1をクリック時にyubi2にしたいのです。 どうかよろしく御願いします。

    • ベストアンサー
    • Flash
  • Flash(ActionScript3.0)

    Flash(ActionScript3.0)でゲーム制作を行っています。 ActionScriptもFlashも最近初めて触れた初心者で、分からないことがたくさん湧いてきて困っています。 よろしければご回答お願い致します。 インスタンスをドラッグすることができる、という要素と、 インスタンスをクリックすると45度回転する、という要素を同時に入れたいのですが、 同時にプログラムを組むとドラッグだけをすることができず、 どうしてもドラッグ後に45度回転してしまいます。 (プログラムのソースはネットから拾ってきたものです)。 どうすればドラッグと回転を分けることができるのでしょうか。 プログラム自体は以下のように組みました。 ご回答いただければ嬉しいです。 よろしくお願い致します。 //インスタンスの回転プログラム mc1.addEventListener(MouseEvent.CLICK, kaiten); function kaiten(event:MouseEvent) { mc1.rotation += 45; } //インスタンスのドラッグプログラム //インスタンスの0点からのマウス座標用変数 var mc1X:int; var mc1Y:int; //マウスがインスタンスを押したらsec1開始 mc1.addEventListener(MouseEvent.MOUSE_DOWN,sec1); //sec1 マウスダウン座標確認、sec2開始 function sec1(event:MouseEvent):void { mc1X = event.localX; mc1Y = event.localY; addEventListener(MouseEvent.MOUSE_MOVE,sec2); } //sec2 インスタンス移動 function sec2(event):void { mc1.x = mouseX-mc1X; mc1.y = mouseY-mc1Y; //低FPSマウス移動スムーズ対応 event.updateAfterEvent(); } //マウスが離れたらsec3開始 stage.addEventListener(MouseEvent.MOUSE_UP,sec3); mc1.addEventListener(MouseEvent.MOUSE_OUT,sec3); //sec3 sec2停止 function sec3(event):void { removeEventListener(MouseEvent.MOUSE_MOVE,sec2); }

  • flashcs4 as3.0のエラーについて

    フレーム1にボタンを配置して ボタン(myb)を押すと、ボタンが消えると同時にマウスがmc表示に変わり mcをドラッグしてmc1に当たると、フレーム2の画面が表示するようにしたいのですが ムービープレビューして試してみると、フレーム2の画面(TツールでCLEARを書いているだけ)は表示するのですが、次のエラーが表示されてしまいます。 「TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」 どのように回避したらよいのでしょうか。よろしくお願いいたします。 stop(); mc.visible=false; myb.stage.addEventListener(MouseEvent.CLICK, mystart); function mystart(event){ myb.visible=false; Mouse.hide(); mc.visible=true; mymouse(event); } mc.stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); function mymouse(event):void{ mc.x = stage.mouseX; mc.y = stage.mouseY; event.updateAfterEvent(); } mc.stage.addEventListener(Event.ENTER_FRAME,mymc); function mymc(e:Event):void{    if(mc1.hitTestObject(mc)){ gotoAndStop(2); } }

    • ベストアンサー
    • Flash
  • 画面をドラッグ

    ActionScript3.0で画面をドラッグして移動させるflashを作っています。 マウスを離してからも少しだけ動くように*2.75しています。 しかしhoge_mcが画面外に出た時にif文やflagを使って止めようとすると進む力が残っているっぽくて確実に止まってくれません。 どなたかこの問題の解決法が分かる方いませんか? *ソースです。(ステージにhoge_mcを置けば動きます。) import caurina.transitions.Tweener; var startX:Number = 0; var cameraRange:Number = 0; var tweenNum:Boolean =false; this.stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown); this.stage.addEventListener(MouseEvent.MOUSE_UP, onUp); function onDown(event:MouseEvent):void { tweenNum = false; this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove,false); startX = event.stageX; this.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove,false); } function onUp(event:MouseEvent):void { this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove,false); } function onMove(event:MouseEvent):void { trace(hoge_mc.x); if(tweenNum == true){ Tweener.removeTweens(hoge_mc); return; } var cameraIkata = event.stageX - startX; hoge_mc.x += cameraIkata; cameraRange = cameraRange + cameraIkata; Tweener.addTween(hoge_mc, {x:cameraRange*2.75, time:3, transition:"easeOut"}); startX = event.stageX; } stage.addEventListener(Event.ENTER_FRAME,loop); function loop(e:Event):void { if (hoge_mc.x > 401) { tweenNum = true; Tweener.removeTweens(hoge_mc); hoge_mc.x = 400.5; } if (hoge_mc.x < 0) { tweenNum = true; Tweener.removeTweens(hoge_mc); hoge_mc.x = 0.5; } }

  • MOUSE_DOWNとMOUSE_MOVEの併用

    こんにちは。 flash初心者なのですが、 マウスが押され且つ、ドラッグされている場合にだけ音が出るというフラッシュを作りたいのですが どこでどう定義すればいいのかわかりません。片方なら出来るのですが・・・ さらにMouseEvent.MOUSE_DOWNをMouseEvent.MOUSE_MOVEに書き換えると 1ピクセル動く毎にダダダダっと何度も連続して音が鳴ってしまいます 何卒ご教授お願いします。 var my_sound:My_Sound = new My_Sound(); var my_channel:SoundChannel; stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc); function MouseLDownFunc(event:Event):void{ my_channel = my_sound.play(); my_channel.addEventListener(Event.SOUND_COMPLETE,my_chan_comp); } function my_chan_comp(e:Event) { trace("再生終了"); my_channel = my_sound.play(); my_channel.addEventListener(Event.SOUND_COMPLETE,my_chan_comp); } stage.addEventListener(MouseEvent.MOUSE_UP, MouseLUpFunc); function MouseLUpFunc(event:Event):void{ my_channel.stop(); }

    • ベストアンサー
    • Flash
  • AS3 記述方法

    ボタンが複数存在し、それぞれのボタンの処理をまとめたい時に どうするか考えています。 たとえばステージに3つのボタンインスタンス 「btn1」「btn2」「btn3」があるとします。 クリックすると、それぞれに応じた値を得るために ------------------------------------------------------------- btn1.addEventListener(MouseEvent.CLICK,syori1); function syori1(eventObject:MouseEvent):void{ trace("あんぱん"); } btn2.addEventListener(MouseEvent.CLICK,syori2); function syori2(eventObject:MouseEvent):void{ trace("しょくぱん"); } btn3.addEventListener(MouseEvent.CLICK,syori3); function syori3(eventObject:MouseEvent):void{ trace("カレーぱん"); } ------------------------------------------------------------- としているのですが、 たとえばもしこれが100個のボタンがあれば 100回同じような事を記述しないといけないので あまりよろしくないな・・・と思い、 ------------------------------------------------------------- for(var i=1; i<=3 i++){ this["btn"+i].addEventListener(MouseEvent.CLICK,syori); } function syori(eventObject:MouseEvent):void{ trace("ジャム"); } ------------------------------------------------------------- としたのですが、これではどのボタンをクリックしても"ジャム"がトレースされます。(当然ですが・・・) このような時、まとめて記述するにはどうすればよいでしょうか?

  • flashcs4 as3.0のエラーについて

    TypeError: Error #1010: 条件は未定義であり、プロパティがありません。 at 2mouse_03_fla09_as3_fla::MainTimeline/mymouse() 以下のスクリプトを実行すると上記のエラーが発生してしまいます。 ネットで調べてもわかりませんでした。AS3.0を学習していることろです。 よろしくお願いいたします。 ---------------------------------------------------------- やっていることは、マウスをMC(mc)に変換して、mc1との当たり判定をしたいだけです。 実行すると、実行画面でマウスを動かすと同時に上記のエラー出てしまいます。 ----------------------------------------------------------- stop(); mc.visible=false; myb.stage.addEventListener(MouseEvent.CLICK, mystart); function mystart(event){ myb.visible=false; Mouse.hide(); mc.visible=true; mymouse(event); } mc.stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); function mymouse(event):void{ mc.x = stage.mouseX; mc.y = stage.mouseY; mc.event.updateAfterEvent(); } mc.stage.addEventListener(Event.ENTER_FRAME,mymc); function mymc(event){ if(mc1.hitTestObject(mc)){ mc.stage.removeEventListener(Event.ENTER_FRAME,mymouse); mc.visible=false; } }

    • ベストアンサー
    • Flash
  • マウスカーソルをカスタマイズしたのですが…

    FlashCS4でAS3.0を使用しています。 マウスポインタを任意の形を作成して、ムービークリップにして、インスタンス名を「point_mc」として、ステージ上に配置し、スクリプトを下記のように記述しました。 ---------------------------------------------------------- Mouse.hide(); stage.addEventListener(MouseEvent.MOUSE_MOVE, function(e){ point_mc.x=stage.mouseX; point_mc.y=stage.mouseY; }); --------------------------------------------------------- その後にムービープレビューしますと、マウスのカーソルが先の任意に作成(point_mc)したのに変わってました。 そこまでは良かったのですが、その変わったマウスをボタンインスタンス(インスタンス名:skip_bt)に乗せても、ロールオーバーもしなければ、ボタンをクリックする事が出来ないのです。 因みに「skip_bt」に対するスクリプトは下記のように記述しました。 -------------------------------------------------------- skip_bt.addEventListener(MouseEvent.CLICK, introClick); function introClick(evt:MouseEvent):void { gotoAndStop("intro"); } -------------------------------------------------------- このままだと、ただマウスカーソルが、任意で作成したムービークリップになっているだけで、ボタンを押したりする事が出来ません。クリックする事が出来なくて困ってます。 解る方がおりましたら、アドバイス・ご指導をお願い致します。 よろしくお願い致します。

専門家に質問してみよう