mousemoveを使わずにマウスカーソル位置を取得するには?

[上に] [前に] [次に]
レドンド 2000/05/28(日) 01:34:20
急務です。よろしくお願い致します。
javascriptでマウスカーソル位置を取得したいのですが、mousemoveを
使うと移動させているレイヤーがカクカクに止まってしまいます。
mousemoveを使わずにカーソル位置を取得できる方法を知りませんか?

やりたいことは要するにマウスの位置を取っても他の処理がスムーズ
にいってればいいんですが…。

お分かりの方がいらっしゃいましたら、お願い致します。

shingo [E-Mail] [HomePage] 2000/05/28(日) 03:07:33
おそらく環境はネットスケープを想定してるんじゃないかと思うんですが、
onmousemove以外にマウス位置を取得する事は出来ないんじゃないかと思い
ます。

setTimeoutとかを使ってコンスタントに呼び出す関数で、マウス位置を取得
してもいいかと思いますが、逆に重くなりそうだし…

Maja [E-Mail] 2000/05/28(日) 20:36:47
少し、回答とはかけ離れますが...
かくかくするのは、おそらく、onmousemoveが頻繁に呼び出され、その都度処理が行われるからでしょう。
以下のやり方を参照にしてください。可否はわかりませんが。
mousemoveで位置を調べる

前回の位置と比べる

一定値以上の差(20〜50pxぐらいかな)があるときだけ処理を行い前回の位置変数を書き換える
ていうのでどうでしょう

ある程度かくかくはしなくなると思いますよ。

レドンド 2000/05/29(月) 00:40:37
shingoさん、Majaさん、ありがとうございます。

Majaさんのご指摘なのですが、やろうとしていることがマウスを
動かしてプレイするゲームなので、どうしても常にマウス動かし
まくってる感じなんですよね。弱りました。

shingoさん、お聞きしたいのですが、
>setTimeoutとかを使ってコンスタントに呼び出す関数で、
>マウス位置を取得してもいいかと思いますが、
>逆に重くなりそうだし…
というのはどのような方法でマウス位置を取得するのでしょうか?
コンスタントに呼び出す関数が既に存在しているので、
そこに組みこむみたいな形でどうですかね?
取得方法だけよかったら教えて下さいませんか?

お二人ともありがとうございました。

Maja [E-Mail] 2000/05/30(火) 00:43:19
やっぱり、だめですか。
でも、onmousemoveで位置取得しているだけなら、ぜんぜん早いはずですが。
ためしに、status行にmouseのxy座標表示させたらきちんと計測してくれます。
追従性もいいはずです。
function getmouse(e) {
if (whatI) { // IE
  mouseX= event.clientX+document.body.scrollLeft;
  mouseY = event.clientY+document.body.scrollTop;
}
if (whatN) { // NN
  mouseX = e.pageX;
  mouseY = e.pageY;
}
// おまけ
window.status = mouseX+","+mouseY
}
たぶんこんな感じで、取得してると思うのですが...

つまり、onmousemove自体の問題ではなく、その後の演算やレイアの移動などの処理が重いということです。
そこで、前回の回答になったわけです。
具体的には、たとえば上のスクリプトに
if ((Math.abs(mouseX-mouseXX)>20)||(Math.abs(mouseY-mouseYY)>20) {
mouseXX = mouseX;
mouseYY = mouseY;
return true;
}
else {
return false;
}
と付け加えて、いままでのスクリプト(onmousemoveで呼び出してる関数)を
function imamade(e) {
if (getmouse(e)) {
  いままでの処理
}
}
というような感じにするということです。(わかりにくいかな)
細かい動きの関係ない、マウスストーカくらいならこれで十分なんですけどね。
ゲームじゃちょっと難しそうかな。

あまり、答えになってなくてすみません。

shingo [E-Mail] [HomePage] 2000/05/30(火) 13:55:06
確かに、onmousemove自体に重くなる原因があるとは考えづらいです。
自分の作ったもので申し訳ないのですが、
http://shingo.org/toys01.html
を作っていたときに気づいた点として
・IE4よりもIE5のほうが断然早い
・Windows9xやNTよりも2000のほうが格段に早い
が挙げられます…いろんな環境でみてみたのですがクライアントの環境に左右
される可能性が高いと思うのです。

あとは、思いつく限りではonmousemoveで呼び出す関数は、グローバル変数
にマウス座標を代入するだけの単純な物にして、コンスタントに呼び出す関数
を別に作って(setTimeoutを使って)その関数からグローバルな変数を参照し
てマウス位置を取得、みたいなカンジでしょうか...

レドンド 2000/05/30(火) 22:47:50
すいません。説明不足でした。
実はレイヤーのドラッグ処理をしているのです。
ドラッグで弾をかわすみたいなもんなんですけど。

>あとは、思いつく限りではonmousemoveで呼び出す関数は、グローバル変数
>にマウス座標を代入するだけの単純な物にして、コンスタントに呼び出す関数
>を別に作って(setTimeoutを使って)その関数からグローバルな変数を参照し
>てマウス位置を取得、みたいなカンジでしょうか...

の方でちょっとやってみます。あまりきれいなドラッグにはならないかも
しれないですけどね…。

でもありがとうございます。もし何かいいアイデアをお持ちの方がいらっしゃるかも
知れないので、チェックはしません。ありがとうございました。

[上に] [前に] [次に]