トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     ブロック崩しのボールの速度を一定に。
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ebi
Åê¹ÆNo.30035
投稿日時: 2006-11-16 17:33
フォーラム芸人
居住地: nagoya
投稿: 926
使用環境:
.6.8
CS6
<参考書>
・基本からしっかりわかるActionScript 3.0(既読)
・ActionScript3.0プロフェッショナルガイド(進行中)
・ActionScript3.0パフォーマンスチューニング(未読)
・ActionScript 3.0 逆引きクイックリファレンス(購入予定...
ブロック崩しのボールの速度を一定に。
ebiです。

ブロック崩し

参考書などで紹介されてるやり方はたいてい、
「分かり易いから」って理由で何かに接触すると
x移動値やy移動値をひっくりかえすやり方ですが、
これだと急にボールが早くなったり、遅くなったりします。

ボールの速度を変えたくないって場合は、
どのような方法が考えられますでしょうか。

x移動値・y移動値ひっくりかえし法から、
角度を算出してウンヌン法って事になるんかしら...
うすあじ
Åê¹ÆNo.30043
投稿日時: 2006-11-16 18:40
職人
居住地: 東京都杉並区
投稿: 211
使用環境:
FlashCS5.5 ,MacOSX 10.6.8
Re: ブロック崩しのボールの速度を一定に。
引用:
これだと急にボールが早くなったり、遅くなったりします。

移動値の符号を逆にしているのなら、移動方向が変わるだけで、早くなったり、遅くなったりしませんが・・・

もうちょっと問題にしているポイントが明確になるといいかもしれません。

一応、ブロック崩しに関して書いたものを何度か本にして、出版してるもので(^^A

これとか
http://www.amazon.co.jp/exec/obidos/ASIN/4875932898/


----------------
うすあじ(twitter)
うすあじFlash研究所
HSPセンター

ebi
Åê¹ÆNo.30045
投稿日時: 2006-11-16 18:50
フォーラム芸人
居住地: nagoya
投稿: 926
使用環境:
.6.8
CS6
<参考書>
・基本からしっかりわかるActionScript 3.0(既読)
・ActionScript3.0プロフェッショナルガイド(進行中)
・ActionScript3.0パフォーマンスチューニング(未読)
・ActionScript 3.0 逆引きクイックリファレンス(購入予定...
Re: ブロック崩しのボールの速度を一定に。
ebiです。

引用:
移動値の符号を逆にしているのなら、移動方向が変わるだけで、早くなったり、遅くなったりしませんが・・・

失礼(´人`)そうでした。
パドルに当たった時に当たった箇所によって値に変化をつけてる事を
言い忘れてました。こういう事をしてます。
MV_X = (BALL._x - (PDL._x + PDL._width/ 2)) * 8 / PDL._width;

変化がつくのはいいんですが、やっぱコレ、そうすると、
早くなったり、遅くなったりしちゃうでしょう?
僕としては角度を変えたいだけなのに
速度まで変わっちゃうわけでして。

どうしたもんでしょうかねぇ。

蛇足 - - - - - - - - - -
リンク先のカスタマーレビュー好評ですねぇ
野中文雄
Åê¹ÆNo.30050
投稿日時: 2006-11-16 20:09
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ブロック崩しのボールの速度を一定に。
どういう内容の計算をしている式なのかわかりませんけど。角度を出す必要はないんですよね。たとえば、xy成分(10, 10)ピクセルを毎フレーム加算して動かしていたときに、何らかの計算で値を(5, 15)に変更すると、そのスピード(長さ)が変わるということですか?
引用:
ebiさんは書きました:
MV_X = (BALL._x - (PDL._x + PDL._width/ 2)) * 8 / PDL._width;

変化がつくのはいいんですが、やっぱコレ、そうすると、
早くなったり、遅くなったりしちゃうでしょう?
僕としては角度を変えたいだけなのに
速度まで変わっちゃうわけでして。

上記の前提で、Flash 8とします。
import flash.geom.Point;
// 原点(0, 0):
// var p_0:Point = new Point(0, 0);
// 変更前(10, 10):
var p_1:Point = new Point(10, 10);
// var nDistance:Number = Point.distance(p_0, p_1);  // 長さ
var nDistance:Number = p_1.length;  // 長さ
trace(nDistance);  // 出力: 14.142135623731 = 10√2
// 変更後(5, 15):
var p_2:Point = new Point(5, 15);
p_2.normalize(nDistance);  // 長さを同じに
// trace([p_2.x, p_2.y, p_2.y/p_2.x, Point.distance(p_0, p_2)]);
trace([p_2.x, p_2.y, p_2.y/p_2.x, p_2.length]);
// 出力: 4.47213595499958,13.4164078649987,3,14.142135623731
// xy成分: (4.47213595499958,13.4164078649987)
// y/x = 15/5 = 3
// 長さ: 14.142135623731 = 10√2

[追記] Point.lengthプロパティの存在を見落としていましたので、上記スクリプトはこのプロパティを用いる処理に書替えました。


----------------
 

ebi
Åê¹ÆNo.30055
投稿日時: 2006-11-16 21:33
フォーラム芸人
居住地: nagoya
投稿: 926
使用環境:
.6.8
CS6
<参考書>
・基本からしっかりわかるActionScript 3.0(既読)
・ActionScript3.0プロフェッショナルガイド(進行中)
・ActionScript3.0パフォーマンスチューニング(未読)
・ActionScript 3.0 逆引きクイックリファレンス(購入予定...
Re: ブロック崩しのボールの速度を一定に。
ebiです。
引用:
どういう内容の計算をしている式なのかわかりませんけど


こりゃ失礼しました。そりゃそうですよね。とちりました。
(というか、特に出す必要のないスクリプトだったかもです...)

BALLがボールmc
PDLがパドル(棒)mc
MV_xがボールの_x移動数の変数

です。

MV_X = (BALL._x - (PDL._x + PDL._width/ 2)) * 8 / PDL._width;

は、パドル(棒)にボールが接触した時のスクリプトです。
ボールが接触したパドルの位置に(8段階)よって
角度(移動値)を変化させてるです。

お教えいただいたスクリプトは、いろいろ見た事ないのが
登場してますねーっ(鼻息)
リファレンスを参考にとりあえず何をやっているのか
理解しようと思います。
ebi
Åê¹ÆNo.30058
投稿日時: 2006-11-16 22:07
フォーラム芸人
居住地: nagoya
投稿: 926
使用環境:
.6.8
CS6
<参考書>
・基本からしっかりわかるActionScript 3.0(既読)
・ActionScript3.0プロフェッショナルガイド(進行中)
・ActionScript3.0パフォーマンスチューニング(未読)
・ActionScript 3.0 逆引きクイックリファレンス(購入予定...
Re: ブロック崩しのボールの速度を一定に。
ebiです。


....すいません。結局geomって何なんでしょう?
ゲオム?

ちょっとリファレンスみても分かりませんでした。
初期値 みたいな意味でしょうか?
森 巧尚
Åê¹ÆNo.30059
投稿日時: 2006-11-16 22:21
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: ブロック崩しのボールの速度を一定に。
引用:

ebiさんは書きました:
....すいません。結局geomって何なんでしょう?


geometryのことですね。


----------------
森 巧尚
http://www.ymori.com

野中文雄
Åê¹ÆNo.30060
投稿日時: 2006-11-16 22:21
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ブロック崩しのボールの速度を一定に。
geomは、幾何学(geometry)の略です。Pointクラスは、2次元座標ベクトルを扱います。
引用:
ebiさんは書きました:
....すいません。結局geomって何なんでしょう?
ゲオム?

見るべきだったのは、英和辞典ですね。
引用:
ちょっとリファレンスみても分かりませんでした。


----------------
 

ebi
Åê¹ÆNo.30061
投稿日時: 2006-11-16 23:22
フォーラム芸人
居住地: nagoya
投稿: 926
使用環境:
.6.8
CS6
<参考書>
・基本からしっかりわかるActionScript 3.0(既読)
・ActionScript3.0プロフェッショナルガイド(進行中)
・ActionScript3.0パフォーマンスチューニング(未読)
・ActionScript 3.0 逆引きクイックリファレンス(購入予定...
Re: ブロック崩しのボールの速度を一定に。
森さん、野中さん、どうも。

あ、これ、メソッドじゃないんですね。
なぁんだ、幾何学かぁ(°▽°)

キ...キカ...キキガカ...ガク...キガク...
カカガ...キガキガ...ガクガクガク((((°目°))))

BOMB!  はぜました。

なぜかしら、今日は、
import flash.geom.Point;
って記述をよく見ます。
たいてい、スクリプトの頭に入ってるようです。
いったい何をしてるんでしょうか? これは。
きっと僕が知らないプログラムのセオリーみたいのが
あるんでしょうね。

Pointは分かりました。
が、なんだか、変数に出し入れして自分で管理した方が良さそうな感じです。
distanceはリファレンスには「ベベルのオフセット距離」と
そっけなく書いてありました。...わかんないよう。
(今度は“ベベル”と“オフセット”を国語辞書?
まぁ野中さんのスクリプトから察するになんとなく2点間の距離を
返すもののような気がします。
normalizeは...
(0,0) と現在のポイント間の線のセグメントを設定された長さに拡大・縮小します。

だそうです。...

以上ふまえて考えてみると野中さんのスクリプトは、
まず基準となる点、基準となる距離を決めておき、
変更点の位置が変わったら、基準点から変更点への線上の
基準距離の位置の点を出せば角度も速度(距離)も変わらない
ってな感じの事をされてるんだろうなぁって事は分かりました。

方法としてそういう事ができるって事は分かりましたが...
敷居高いっす。 とても応用できない。

ってわけで、今回は、以前森さんから頂いた名言
「動けばいい」を旗印に、できる事で遠回り策を模索中です。
完全に速度を一定ってのはできなさそうですが、
そもそもは「超スローになっちゃう」のを回避したかったっていう
意図だったので、それだけなら、なんとかできそうであります。

ありがとうございました。超長文すんません。
野中文雄
Åê¹ÆNo.30066
投稿日時: 2006-11-17 4:28
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ブロック崩しのボールの速度を一定に。
importステートメントは、ほかにフィルタを使うときにも必要になります。「スクリプトでフィルタを使う ? BlurFilter」の「1. フィルタのインスタンスを作成する」をご参照ください。
引用:
ebiさんは書きました:
なぜかしら、今日は、
import flash.geom.Point;
って記述をよく見ます。
たいてい、スクリプトの頭に入ってるようです。
いったい何をしてるんでしょうか? これは。

あるものは使ってみただけですので、自分で関数など定義して処理することも可能です。
// 原点(0, 0):
// var p_0:Object = xPoint(0, 0);
// 変更前(10, 10):
var p_1:Object = xPoint(10, 10);
// var nDistance:Number = xDistance(p_0, p_1);
var nDistance:Number = xLength(p_1);
trace(nDistance);
// 変更後(5, 15):
var p_2:Object = xPoint(5, 15);
p_2 = xNormalize(p_2, nDistance);  // 長さを同じに
// trace([p_2.x, p_2.y, p_2.y/p_2.x, xDistance(p_0, p_2)]);
trace([p_2.x, p_2.y, p_2.y/p_2.x, xLength(p_2)]);
function xPoint(nX:Number, nY:Number):Object {
    return {x:nX, y:nY};
}
/*
function xDistance(oStartPoint:Object, oEndPoint:Object):Number {
    var nDistanceX:Number = oEndPoint.x-oStartPoint.x;
    var nDistanceY:Number = oEndPoint.y-oStartPoint.y;
    return Math.sqrt(nDistanceX*nDistanceX+nDistanceY*nDistanceY);
}
*/
function xLength(oPoint:Object):Number {
    var nDistanceX:Number = oPoint.x;
    var nDistanceY:Number = oPoint.y;
    return Math.sqrt(nDistanceX*nDistanceX+nDistanceY*nDistanceY);
}
function xNormalize(oPoint:Object, nLength:Number):Object {
    // var nOriginalLength:Number = xDistance({x:0, y:0}, oPoint);
    var nOriginalLength:Number = xLength(oPoint);
    var nNormalizeRatio:Number = nLength/nOriginalLength;
    return {x:oPoint.x*nNormalizeRatio, y:oPoint.y*nNormalizeRatio};
}

[追記] 投稿No.30050のスクリプト変更に合わせて、上記サンプルもxLength()関数を使う処理に修正しました。
引用:
Pointは分かりました。
が、なんだか、変数に出し入れして自分で管理した方が良さそうな感じです。

Point.distance()メソッドは、「2点間の距離」を返します。
引用:
distanceはリファレンスには「ベベルのオフセット距離」と
...[中略]...
まぁ野中さんのスクリプトから察するになんとなく2点間の距離を
返すもののような気がします。

Point.normalize()メソッドは、方向(角度)は変えずに、長さを指定した値に設定します。ですから、このメソッドが、まさにebiさんの必要とされているものです。
引用:
normalizeは...
(0,0) と現在のポイント間の線のセグメントを設定された長さに拡大・縮小します。

だそうです。...

まず変更前のxy成分(10, 10)の長さを求め、つぎに変更後のxy成分(5, 15)のベクトルを作成し、その長さを(10, 10)と等しく設定します。その結果求められた新たなxy成分のベクトルは、(4.47213595499958,13.4164078649987)です。y/xの比が(5, 15)と同じ3ですので、方向が一致していることになります。
引用:
以上ふまえて考えてみると野中さんのスクリプトは、
まず基準となる点、基準となる距離を決めておき、
変更点の位置が変わったら、基準点から変更点への線上の
基準距離の位置の点を出せば角度も速度(距離)も変わらない
ってな感じの事をされてるんだろうなぁって事は分かりました。


----------------
 

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops