弾む文字について。



0   名前: ZERO : 2007/03/10(土) 15:06  ID:mm2gApze sub-6e
初めましてZEROというものです。今回ここに書きこませていただく内容は、JAVAスクリプトの弾む文字についてです。本来ならJAVAスクリプト専用の掲示板に書くつもりなのかもしれませんが、ゲーム絡みなのでここに書かせていただきました。
本題なのですが、この弾む文字のやつをファイルに書き込んで起動してみたらうまくはずんだのですが、複数弾ませたいと思って、同じものをもう一ついれてみたら文字は表示されたのですが、弾みませんでした。
これを二つや三つと弾ませるにはどうすればよいのでしょうか?
ご指導お願いいたします。

これがそのJAVAスクリプトです。
<SCRIPT Language="JavaScript">

<!--
y = 0;
dy = 0;
baseY = 100
offsset = 2;
timerID = 0;
time = 50;

function getPos()
{
if (document.layers) y = document["mvTitle"].top;
if (document.all) y = window["mvTitle"].style.pixelTop;
}

function moveTitle()
{
y = y + dy;
if (y >= baseY) { dy = -dy; y = baseY;}
dy = dy + offsset;
if (document.layers) document["mvTitle"].top = y;
if (document.all) window["mvTitle"].style.pixelTop = y;
clearTimeout(timerID);
timerID = setTimeout("moveTitle()",time);
}
// -->

</SCRIPT>
<BODY onLoad="getPos();moveTitle()" text="#777777" background="hana1.jpg" link="#ff4500" alink="#ff00ff" vlink="#1e90ff" TOPMARGIN="0" LEFTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0">

<DIV ID="mvTitle" STYLE="position:absolute;left:30px;top:60px;"><font color="yellow" size="7">☆BattleStart☆</font>
</DIV>

1   名前: 匿名 : 2007/03/10(土) 15:06  ID:Z/T9lFdK sub-kJ
せっかくなのに申し訳ないが、その 10 年前のスクリプトは捨てて、別のものを探した方が早い。そうすれば、最近のブラウザでも動くようになるし、複数動作への改造も容易になる。

2   名前: 匿名 : 2007/03/10(土) 15:06  ID:Z/T9lFdK sub-kJ
即席だが、以下も良いものではない。ゲーム絡みなら、タイマ管理専用の何かを作成した方が、軽くなると思う。
<p>
  <img src="sample1" alt="☆">
  <img src="sample2" alt="★">
  <img src="sample3" alt="※">
</p>

<script type="text/javascript">

function JumpStyle (element, timeOut) {
     this.timerId   = null;
     this.timeOut   = timeOut;
     this.minOffset = -5;
     this.accel     = 1;
     this.offset    = this.minOffset;
     this.style     = element.style;
     
     this.style.position = 'relative';
}

JumpStyle.prototype = {
    jump : function () {
        var top = parseInt (this.style.top) || 0;
        
        if (this.accel < 0 && 0 < this.offset) {
            this.accel *= -1;
        }
        
        top += (this.offset += this.accel);
        
        if (0 < top) {
            top = 0;
            this.offset = this.minOffset;
        }
        
        this.style.top = top + 'px';
    },
    
    repeat : function () {
        var _this = this;
        this.timerId = setTimeout (function () {
                _this.jump ();
                _this.repeat ();
            }, this.timeOut);
    },
    
    stop : function () {
        clearTimeout (this.timerId);
    }
};


new JumpStyle (document.getElementsByTagName ('img')[0],  50).repeat ();
new JumpStyle (document.getElementsByTagName ('img')[1], 100).repeat ();
new JumpStyle (document.getElementsByTagName ('img')[2], 200).repeat ();

</script>

3   名前: ZERO : 2007/03/10(土) 15:06  ID:mm2gApze sub-6e
なるほど〜・・・・このスクリプトはとても古いものだったのですね・・・・JAVAスクリプトには最近手を出したばかりで、検索して色々さがしてみたのですけど、これしか見つからなかったので使っていました(^^;)とりあえず、上の張っていただいたものを試してみて、納得いかなかったら探してみようと思います。返信ありがとうございました。

4   名前: ZERO : 2007/03/10(土) 15:06  ID:mm2gApze sub-6e
えっと試してみたのですが、確かにバウンドするのですが、自分がバウンドさせたい文字ではなく、勝手に画像がバウンドしてしまいます。どうすればいいのでしょうか?

5   名前: 匿名 : 2007/03/10(土) 15:06  ID:Z/T9lFdK sub-kJ
> どうすればいいのでしょうか?

どうしたいのでしょうか?


使い方は見れば分かるだろうと思って注釈を入れなかった(すまん)けど、冒頭の
<p>
  <img src="sample1" alt="☆">
  <img src="sample2" alt="★">
  <img src="sample3" alt="※">
</p>
と、最後の
new JumpStyle (document.getElementsByTagName ('img')[0],  50).repeat ();
new JumpStyle (document.getElementsByTagName ('img')[1], 100).repeat ();
new JumpStyle (document.getElementsByTagName ('img')[2], 200).repeat ();
は単なる使用例。これでピンと来ると思うんだけど。ゲームに使うということだったから、なるべく部品化しておいたんだが。

/**
 * JumpStyle - 1 つの要素をジャンプさせるオブジェクト
 * 
 * コンストラクタ: var obj = new JumpStyle (element, timeOut);
 * -element ジャンプさせたい要素ノード
 * -timeOut ジャンプの速さ(ミリ秒)
 *
 * メソッド:
 * -repeat() ジャンプ実行
 * -stop()   ジャンプ停止
 */

<!-- 実行サンプル(JumpStyle の定義は読み込み済みとする)-->

<p id="test1">テスト 1</p>
<p id="test2">テスト 2</p>

<script type="text/javascript">

// ジャンプさせたい要素ノードの取得
var element1 = document.getElementById ('test1');
var element2 = document.getElementById ('test2');

// ジャンプオブジェクトの作成
var jumpObj1 = new JumpStyle (element1, 50);
var jumpObj2 = new JumpStyle (element2, 50);

// ジャンプ実行
jumpObj1.repeat ();
jumpObj2.repeat ();

</script>

もし要素ノードの取得方法が分からないのであれば、先にそちらを覚えた方が良い。

6   名前: ZERO : 2007/03/10(土) 15:06  ID:mm2gApze sub-6e
おかげで、うまく弾むようになりました。ありがとうございます。
ところで弾ませたものをたとえば、5秒したら止めるというのはどのように書き込めばいいのでしょうか?stopを使うことはわかったのですが、うまくいかなくて・・・

7   名前: 匿名 : 2007/03/10(土) 15:06  ID:Z/T9lFdK sub-kJ
> 5秒したら止める
setTimeout (function () { jumpObj1.stop(); }, 5000);
setTimeout (function () { jumpObj2.stop(); }, 5000);

>>2 の使い方というより、タイマの使い方の問題だよね。メソッドが絡むと確かに厄介だが。

ノード取得、タイマ管理、関数オブジェクトは基本の部類だから、自分で小さなサンプルをいっぱい作って、体に叩き込んでくれ。

JavaScript の文法書は一通り読んでおいた方が良い(最初から全部覚える必要はないが、どこに何が書いてあるかくらいは見ておくべし)。原則と経験則を同時に消化しながら学ぶと良い。

もちろん、>>2 を使い続ける義理はないから、より適したライブラリを探すなり自作するのも良い。頑張ってくれ。

8   名前: ZERO : 2007/03/10(土) 15:06  [URL]  ID:mm2gApze sub-6e
お早い返信ありがとうございます。確かにタイマーをやると時間どおりとまったのですが、どうも先に表示されるものまでバウンドする前に止まってしまいます。言葉での説明が難しいので実際に見ていただけたらと思いまして、URLを貼りました。FFAというゲームの戦闘にこれをつかっているのですが・・・・

9   名前: ZERO : 2007/03/10(土) 15:06  ID:mm2gApze sub-6e
連続ですいません。書き方が悪かったのだと思うのですが、簡単にまとめるとボールのように上下にバウンドして止まるようにしたいわけなのですが・・・・

10   名前: Z ◆XTzyosZXcL : 2007/03/10(土) 15:06  ID:vJSduAD1 sub-Cl
>>9
 まず、本を読むなどして勉強し、自分でコードを書いてみることから始めてください。
 で、実際に書いてみた結果うまくいかなかったら、コードのどこが悪いのかを質問するようにされた方がよいことでしょう。
 各質問掲示板は「無料で自分のためにコードを書いてくれるところではない」(出典:http://m035.blog61.fc2.com/blog-entry-12.html)のですから。

参考スレッド・「はじめての人にお薦めの本を教えてください」:
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=1002

余談・JavaScirptの問題点(WikiPedia):
http://ja.wikipedia.org/wiki/JavaScript#.E5.95.8F.E9.A1.8C.E7.82.B9

11   名前: 匿名 : 2007/03/10(土) 15:06  ID:Z/T9lFdK sub-kJ
>>8
すまないが、どこを見れば良いのか分からなかった。と言うか、HTML の書き方が根本的におかしい。HTML を書けなければ、HTML を出力するスクリプトも書けない。また、オブジェクトを移動させるには CSS のプロパティを使うのだから、CSS を知らなければ改造すらままならないぞ。


>>9
> ボールのように上下にバウンドして止まる

逆に聞くけど、どう考えれば良いと思う? とりあえず JavaScript は抜きにして、紙とシャーペンで方法を考えてみてよ。計算方法が決まれば、後はそれを JavaScript で実装してやれば良いだけだ。

現在、対象要素には CSS で position: relative; を与えてある。そして、top を少しずつ変化させることで、跳ねているように見せている。以下に、jump() メソッドの定義を再掲する。
    jump : function () {
        // this.minOffset 移動量の初期値
        // this.offset    現在の移動量
        // this.accel     加速度
        
        // 要素の top の現在値を取得
        var top = parseInt (this.style.top) || 0;
        
        // 移動量(offset)を少しずつ減らし、0 になったら逆に足していく
        // つまり、ジャンプの頂点まで達したら今度は下りていくように見せる
        // 着地したらまた方向を反転させる
        if (this.accel < 0 && 0 < this.offset) {
            this.accel *= -1;
        }
        top += (this.offset += this.accel);
        
        // 着地時
        if (0 < top) {
            top = 0;
            this.offset = this.minOffset;
        }
        
        // 出力
        this.style.top = top + 'px';
    },

試行錯誤してくれ。相談にはのるが、俺は作成代行業者ではないのであしからず。

12   名前: 匿名 : 2007/03/10(土) 15:06  ID:Z/T9lFdK sub-kJ
あーごめん。>>2、>>11 の
if (this.accel < 0 && 0 < this.offset) {
    this.accel *= -1;
}
これは全く無意味な分岐なので削除してくれ(>>0 を下敷きにテストしたときの名残だ……>>11 でコメントまで書いておきながら、お恥ずかしい)。

詫びついでだ。こっちの方が改造しやすいか。
function BoundStyle (element, timeOut, repeat) {
     this.timerId   = null;
     this.timeOut   = timeOut;
     this.repeat    = Boolean (repeat);
     this.minOffset = -5;
     this.minAccel  = 1;
     this.offset    = this.minOffset;  // 移動量
     this.accel     = this.minAccel;   // 加速度
     this.style     = element.style;
     
     this.style.position = 'relative';
}

BoundStyle.prototype = {
    jump : function () {
        var top = parseInt (this.style.top) || 0;
        
        // 移動
        top += (this.offset += this.accel);
        
        // 着地した場合
        if (0 < top) {
            top = 0;
            this.offset = this.minOffset ;
            
            // バウンドを終了する場合
            if (Math.abs (this.offset) < ++this.accel) {
                this.accel = this.minAccel;
                
                if (this.repeat) this.start ();
            } else {
                this.start ();
            }
        } else {
            this.start ();
        }
        
        this.style.top = top + 'px';
    },
    
    start : function () {
        var _this = this;
        this.timerId = setTimeout (function () { _this.jump (); }, this.timeOut);
    },
    
    stop : function () {
        clearTimeout (this.timerId);
    }
};

// 使用例
var element1 = document.getElementById ('test1');
/*
 * コンストラクタ:new BoundStyle (element, timeout, repeat)
 * -element  弾ませたい要素ノード
 * -timeOut  弾ませる速さ(ミリ秒)
 * -repeat   true なら弾んだ後に再ジャンプ、false なら 1 度のみ
 *
 * メソッド:
 * -start() ジャンプ実行
 * -stop()  ジャンプ停止
 */
var bonudObj1 = new BoundStyle (element1, 50, true);
boundObj1.start ();

# 甘やかし過ぎた。自重する。

13   名前: ZERO : 2007/03/10(土) 15:06  ID:mm2gApze sub-6e
お二人ともありがとうございます。頼りすぎてしまいすいませんでした。今度からはもっとしっかり勉強して、それでもできないところがあったら質問をしてみようと思います。たくさんのことを教えていただいてありがとうございました。そしてすみませんでした。

一覧へ戻る