トップページへ戻る

1、jQueryで、XHTML5、SVG、CSS3を操作してみよう。

基本的には、jQueryの説明の時にやったことを応用するだけです。XHTML5では、当然svgタグも扱えますが、

少し注意しなければならないところもあります。

例として、SVGを操作してアニメーションを組んでみます。

往復運動させてみよう

例 jqhtml51.html

往復運動をするボールです。フラッグを使って、画面の右端(=800px)左端(=0px)まで来ると、フラッグのtrueとfalseを入れ替えます。これによって、x座標の増える量が、+から-に切り替わるようになってます。

アニメーションには、setIntervalを使います。

これは、setInterval(function(){},間隔時間)で、jQueryの中で実行するには、必ず$(function({}));のブロックの中で書きます。

setIntervalの中の関数は、間隔時間(ミリ秒)間隔で実行され、値が小さければ、それだけ沢山の回数実行されます。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script>
 $(function(){
 	$("#add").click(function(){
	 var px=20;
	 var py=50;
	 var pr=20;
	 var sp=4;
	 var flgx=true;
	 var ti=setInterval(function(){
			 if(px > 800){
				 flgx =!flgx;
			 }else if(px<0){
				 flgx =!flgx;
			 }
			 if(flgx){
				 px+=sp;
			 }else{
				 px-=sp;
			 }
			 $("#mov").attr("cx",px);
			 $("#mov").attr("cy",py); 
		 },10);
	 });
 });
 </script>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" id="canv" width="800" height="500" style="border: 1px solid black;">
<circle cx="0" cy="0" r="20" fill="red" id="mov" />
</svg>
<form action="">
<input type="button" value="往復運動" id="add" />
</form>
</body>
</html>

問題1

以上のサンプルを

public_html/tomcat/html5/jqhtml51.html

として保存しなさい。
そして、往復運動している円を垂直運動するようにしなさい。円の色を青色に変えなさい。
円の半径を、大きくしたり、小さくしたりしなさい。

ボタンを押すたびに新しい図をつくり、それを斜め方向に移動。壁に当たると跳ね返る

少し手を加えて、x,y方向に移動し、もし画面の端まで来たら、壁に跳ね返るようなアニメーションにしてみましょう

あたらしい要素は

var ele = $(document.createElementNS("http://www.w3.org/2000/svg",'circle'));

で、図形の種類を指定して作り、それに、jQueryのattrメソッドで、属性の値を付けます。

最後に$("#canv").append()で、svgの領域に追加します。

壁にあたったかどうかは、x軸のフラッグとy軸のフラッグを用意し、4つの場合(x軸が超えている場合、y軸が超えている場合、両方が超えていない場合、両方が超えている場合)を考え、値の+と-を切り替える事で、動きの方向を変えています。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script>
   $(function(){
 var pid=0; 
 $("#add").click(function(){
 var px=0;
 var py=0;
 var pr=20;
 var sp=4;
 var flgx=true;
 var flgy=true;
 var cl="";
 cl="rgb(243,23,22)";
 var ele = $(document.createElementNS("http://www.w3.org/2000/svg",'circle'));
 ele.attr("id","p"+pid);
 ele.attr("cx",px);
 ele.attr("cy",py);
 ele.attr("r",pr);
 ele.attr("fill",cl);
 var ti=setInterval(function(){
 if(py > 500){
 flgy =!flgy;
 }else if(py<0){
 flgy =!flgy;
 }
 if(px > 800){
 flgx =!flgx;
 }else if(px<0){
 flgx =!flgx;
 }
 if(flgx && flgy){
 px+=sp;
 py+=sp;
 }else if(!flgy && flgx){
 px+=sp;
 py-=sp;
 }else if(flgy && !flgx){
 px-=sp;
 py+=sp;
 }else if(!flgx && !flgy){
 px-=sp;
 py-=sp;
 } 
 ele.attr("cx",px);
 ele.attr("cy",py); 
 },10);
 $("#canv").append(ele);
 pid++;
 });
 });
 </script>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" id="canv" width="800" height="500" style="border: 1px solid black;"> </svg>
<form action="">
<input type="button" value="発射" id="add" />
</form>
</body>
</html>

問題2

以上のサンプルを
保存しなさい。

ボタンを切り替えると、違った色の円が動くようにしなさい。

<select id="col">
<option value="red">red</option>
<option value="green">green</option>
<option value="blue">blue</option>
<option value="yellow">yellow</option>
</select>

などとし、$("#col").val()で値を取る事が出来るので、使ってください。

 

これを応用したゲーム

これを応用して、「ブロック返し」ゲームを作ってみた。

zキーと、xキーで、パッドを右左に移動。「発射」を押すと、玉がどんどん出てくる。

玉を打ち返せば1点入る。10回失敗すれば、ゲーム終了となる。

キーボードを押した判定は、keypressで設定。キーコード120はxキーなので、その時svgのパッドのx座標を増やす。

 $(document).keypress(function(event) {
  if ( event.which == 120 ) {
   kx+=10;
  $("#pad").attr("x",kx);
   if(kx>700){
    kx=700; 
  } 
 }
}

当たり判定は、if(px==kx && py == ky-10)でやっている。玉のx座標とy座標-玉の大きさ、の位置にパッドがあれば、y座標をマイナスにすることで、方向を変える。この時、点数も1点追加。この時、スピードが偶数でないと、座標の交点はありえないので、玉がスルーしてしまう。

当たり判定が1つだと、とても厳しいので、1づつずらして100個並べる。

★訂正 9/21

(この処理はとても無駄なのが分りますか? 分る人は直してください)

for(i=0;i<100;i++){  if(px==kx + i && py == ky-10){  flgy =!flgy;  score+=1;  } }

 

ゲームが終わったら、

clearInterval(タイマーのID)で、タイマーを停止し、動きを止めてしまう。

empty()メソッドを発行して、画面全体をクリア。「You Lose」の文字を表示。

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script>
$(function(){
 var pid=0;
 var kx=400;
 var ky=450;
 var score=0;
 var lscore=100;
 
 $(document).keypress(function(event) {
	 if ( event.which == 120 ) {
		 kx+=10;
		 $("#pad").attr("x",kx);
		 if(kx>700){
			 kx=700;
		 }
	 }
	 if ( event.which == 122 ) {
		 kx-=10;
		 $("#pad").attr("x",kx);
		 if(kx<0){
 			kx=0;
 		}
 	}
 });
 
 $("#add").click(function(){
 	var px=0;
 	var py=0;
 	var pr=20;
 	var sp=4;
 	var flgx=true;
 	var flgy=true;
 	var cl="red";
 
var ele = $(document.createElementNS("http://www.w3.org/2000/svg",'circle'));
 ele.attr("id","p"+pid);
 ele.attr("cx",px);
 ele.attr("cy",py);
 ele.attr("r",pr);
 ele.attr("fill",cl);
 
 var ti=setInterval(function(){
	 if(py > 550){
		 clearInterval(ti);
		 ele.remove();
 		lscore-=10;
 	}
 	if(lscore <=0){
 		$("#canv").empty();
 		var e = $(document.createElementNS("http://www.w3.org/2000/svg",'text'));
 		e.attr("x",400);
 		e.attr("y",250);
 		e.attr("font-size",36);
 		e.attr("fill","red");
 		e.append("You Lose");
 		$("#canv").append(e);
 		clearInterval(ti);
 	}
 	if(py<0){
 		flgy =!flgy;
 	}
 	if(px > 800){
 		flgx =!flgx;
 	}else if(px<0){
 		flgx =!flgx;
 	}
 	for(i=0;i<100;i++){
 		if(px==kx + i && py == ky-10){
 			flgy =!flgy;
 			score+=1;
 		}
 	}
 
 	if(flgx && flgy){
 		px+=sp;
 		py+=sp;
 	}else if(!flgy && flgx){
 		px+=sp;
 		py-=sp;
 	}else if(flgy && !flgx){
 		px-=sp;
 		py+=sp;
 	}else if(!flgx && !flgy){
 		px-=sp;
		 py-=sp;
 	} 
	 ele.attr("cx",px+"px");
	 ele.attr("cy",py+"px");
 	$("#sc").html("<span style='color:red; font-size:24px'>"+score+"</span>");
 	},10);
 
	 $("#canv").append(ele);
 	 pid++;
 	});
 });
 </script>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" id="canv" width="800" height="500" style="border: 1px solid black;">
<rect x="400" y="450" fill="blue" width="100" height="10" id="pad"/>
</svg>
<form action=""> 
<input type="button" value="発射" id="add" />
<input type="submit" value="最初から" />
</form>
 得点:<span id="sc"></span>点
 </body>
</html>

問題3

以上のサンプルを
保存しなさい。(上のサンプルの中で、当たり判定の処理に無駄なことをやっているのが、分りますか?分る人は、「もっと軽い処理」に直してみてください)

玉の形、色、大きさを変えなさい。玉のスピードを変化させなさい。


分らない人は、直接数字を入れて、変化させてみる。

parseInt(Math.floor(Math.random()*数))

を使うと、ランダムな数が得られるので、
これを利用して、

玉の大きさ、色、最初に出る位置、スピードなどを変化させることが可能。

玉の発射角度、反射角度、玉の動き方(例えばsinカーブなどを使って軌道を曲げる)を変化させることが出来ますね。

出来る人は、玉を四角にしたり、線にしたり、いろいろ試して楽しいゲームに仕上げてください。

(ブロック崩しゲームに改造するのも良い)

また、このままでは携帯電話では使用出来ないので、canvasを使用して、書き換えても良いです(ただし、無理な人は、無理にやらないこと)

これは、とても高度な課題なので、出来た人には50点あげます。

★ 参考リンク ★

問題4

ゲームに効果音を付けることができます。

まず、XHTMLのなかに、<audio>タグで、例えば以下のように書きます。(音源はmp3に限られる)

<audio id="shot" src="se.mp3"></audio><audio id="shot2" src="se1.mp3"></audio>

jQueryのコードに、音を鳴らしたい位置で、

$("#shot")[0].play();

とすると、音が鳴ります。長い音源で、停止が必要なときは、

$("#shot")[0].stop();

で停止します。

ゲーム中で、音を鳴らしている場合、+10点あげます。音源は 発射音 打ち返す音 を使ってもよいし、好きなmp3を使ってもいいです。

public_html/tomcat/html5/jqhtml53.htmlに、追加してください。


(くれぐれも、他人の作品をコピーしたりしないように。コピーしたひとは大きな減点になります。出来ないなりに自分で作る事こそが大事で、自分でアプリケーションをどのように作ったか、説明出来ないようなアプリケーションは、作ること自体が無意味です。そこを良く理解してください。)


ホームへ