ホームページ > 記事 > ウェブフロントエンド > HTML5 を使用して砲弾の自由落下を実現するサンプル コードを共有する
html5 の魅力は誰もがよく知っていると思いますが、できるだけ早くすべてのブラウザーがこの機能をサポートすることを願っています。まず最初に文句を言っておきますが、WeChat ブローカーは単純に弱いです。 jqueryのsliding、show(1000)、hide(1000)などの単純なアニメーションがまだ詰まっています、qqブラウザ、、、忘れてください、最初に落ち着くでしょう。 。 。 。
そしてこれが数日前に見たものです! ! !
彼をサポートしてみませんか? ? ? ? ?
全体的な考え方は、発射された各砲弾を オブジェクト とみなして、その x、y を キャンバス の x、y に変換することです。vecior は制御するオプションです。ウェンフイは力強さを語った。
var cannonBall = function (x,y,vector){ var gravity=0, that={ x: x, y: y, removeMe:false, move: function (){ vector.vy += gravity; gravity += 0.1; //模拟加速度 that.x+=vector.vx; that.y+=vector.vy; if(that.y > canvas.height -150){ that.removeMe=true; } }, draw: function (){ ctx.beginPath(); ctx.arc(that.x,that.y,5,0,Math.PI * 2); ctx.fill(); ctx.closePath(); } };
その中で、砲弾のオブジェクトはベクトル計算を必要とするので、各メソッドを自分でカプセル化し、既製の Vector.js を用意していますが、(バックエンドにとっては)重すぎると思います。 、フロントエンドがテンプレートが必要ないと言うたびに、「重すぎます、私たちは皆それについて考えています、ハハハ)」と言います、それは非常にシンプルで、単純な機能を実装できます、そして大規模なゲームには既製のものを使用することを強くお勧めします。
var vector2d= function (x,y){ var vec={ vx:x, vy:y, scale: function (scale){ vec.vx*=scale; vec.vy*=scale; }, add:function (vec2){ vec.vx+=vec2.vx; vec.vy+=vec2.vy; }, sub:function (vec2){ vec.vx-=vec2.vx; vec.vy-=vec2.vy; }, negate: function(){ vec.vx=-vec.vx; vec.vy=-vec.vy; }, length:function (){ return Math.sqrt(vec.vx * vec.vx + vec.vy * vec.vy); }, normalize:function (){ var len=this.length(); if(len){ vec.vx /=len; vec.vy /=len; } return len; }, rotate:function (angle){ var vx = vec.vx; var vy = vec.vy; vec.vx = vx * Math.cos(angle) - vy * Math.sin(angle) vec.vy = vx * Math.sin(angle) + vy * Math.cos(angle); }, toString:function(){ return '(' + vec.vx.toFixed(3) + ',' + vec.vy.toFixed(3) + ')' ; } }; return vec; };
さて、次のステップは角度を計算して setInterval を追加することです。ここでは、canvas.save() と Canvas.restore(); に焦点を当てて説明します。ここで
キャンバス上で回転、拡大縮小、移動などの操作を実行するとき、実際には写真、四角形などの特定の要素を操作したいのですが、これらを実行するために Canvas メソッドを使用する場合。実際、キャンバス全体が操作されると、キャンバス上の後続のすべての要素が影響を受けるため、操作の前に Canvas.save() を呼び出して、キャンバスの現在の 状態 を保存します。以前に保存された状態なので、他の要素には影響しません
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta author='gongbangwei'> <title>大炮</title> </head> <body> <p id='lidu'> <span>选择大炮的</span> <input type="radio" checked='checked' value='25'>大 <input type="radio" value='20'>中 <input type="radio" value='15'>小 </p> <canvas id='can' width="640" height="480" style=" border:2px solid">no support html5</canvas> <script src='vector2d.js'></script> <script src='jquery/jquery-1.7.2.min.js'></script> <script> var gameObj=[], canvas=document.getElementById('can'), ctx=canvas.getContext('2d'); var cannonBall = function (x,y,vector){ var gravity=0, that={ x: x, y: y, removeMe:false, move: function (){ vector.vy += gravity; gravity += 0.1; //模拟加速度 that.x+=vector.vx; that.y+=vector.vy; if(that.y > canvas.height -150){ that.removeMe=true; } }, draw: function (){ ctx.beginPath(); ctx.arc(that.x,that.y,8,0,Math.PI * 2); ctx.fill(); ctx.closePath(); } }; return that; } var cannon= function (x,y,lidu){ var mx=0, my=0, angle=0, that={ x: x, y: y, lidu:lidu, angle:0, removeMe:false, move:function (){ angle=Math.atan2(my-that.y,mx-that.x); }, draw:function(){ ctx.save(); ctx.lineWidth=2; ctx.translate(that.x,that.y); //平移,将画布的坐标原点向左右方向移动x,向上下方向移动y.canvas的默认位置是在(0,0) ctx.rotate(angle); //画布旋转 ctx.strokeRect(0,-5,50,10); ctx.moveTo(0,0); ctx.beginPath(); ctx.arc(0,0,15,0,Math.PI * 2 ); ctx.fill(); ctx.closePath(); ctx.restore(); } };//end that canvas.onmousedown = function(){ //在这里调用向量的那个js var vec = vector2d(mx-that.x,my-that.y); vec.normalize(); //console.log(lidu); vec.scale(lidu); gameObj.push(cannonBall(that.x,that.y,vec)); } canvas.onmousemove = function (event){ var bb= canvas.getBoundingClientRect(); mx=(event.clientX - bb.left); my=(event.clientY - bb.top); }; return that; }; //画蓝田和草地 var drawSkyAndGrass = function (){ ctx.save(); ctx.globalAlpha= 0.4; var linGrad=ctx.createLinearGradient(0,0,0,canvas.height); linGrad.addColorStop(0,'#00BFFF'); linGrad.addColorStop(0.5,'white'); linGrad.addColorStop(0.5,'#55dd00'); linGrad.addColorStop(1,'white'); ctx.fillStyle=linGrad; ctx.fillRect(0,0,canvas.width, canvas.height); ctx.restore(); } ///////main///////////// var lidu=$('#lidu').find("input:checked").val(); gameObj.push(cannon(50,canvas.height-150,lidu)); $('#lidu').click(function (event){ var cl=event.target; $(this).find('input').each(function(){ $(this).attr('checked',false) }); $(cl).attr('checked',true); lidu=$(cl).val(); gameObj.splice(0,gameObj.length); gameObj.push(cannon(50,canvas.height-150,lidu)); }) setInterval( function (){ drawSkyAndGrass(); var gameObj_fresh=[]; for (var i = 0; i < gameObj.length; i++) { gameObj[i].move(); gameObj[i].draw(); if(gameObj[i].removeMe === false){ gameObj_fresh.push(gameObj[i]); } } gameObj=gameObj_fresh; },50); </script> </body> </html>
本当のフロントエンドは間違いなく UI ではなく、フロントエンド ゲーム エンジニアは間違いなく数学者です。
【関連おすすめ】
2. php.cnオリジナルのhtml5ビデオチュートリアル
以上がHTML5 を使用して砲弾の自由落下を実現するサンプル コードを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。