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