検索
ホームページウェブフロントエンドH5 チュートリアルHTML5_html5 チュートリアルのヒントを使用して簡単な卓球ゲームを作成するチュートリアル

ちなみに、これは単なるデモです。ゲームプレイやゲームルールなどについてはあまり考えていません。改良に興味がある場合は、ルールの改良、ゲームの切り替え、サウンドの追加、ゴール検出の改良、さらに厳密な調整など、改良することができます。 . ショットの強さ、テーブルの実際の摩擦などを確認して、よりゲームらしくしてください。私はプログラミングのアイデアをいくつか紹介しているだけです。デモをしてみるだけでは、プレイするのはあまり楽しいものではありません~~
2015512171509746.png (737×458)

スヌーカー ゲーム
スヌーカー ゲーム全体には 2 つのカテゴリーがあり、1 つはボール、もう 1 つは補助照準ラインです。ゲームをより複雑にしたい場合は、シェイプ クラスを抽象化して、ボールとコーナーおよびゴールの間の衝突を検出することもできます。私が作成したゲームは最も単純な壁衝突検出を使用しているため、ボールと不規則な形状の間の衝突検出はありません。より複雑な衝突をプレイしたい場合は、単純な衝突検出について を尋ねることができます。まだとても良いです。さて、段階的にやってみましょう:

【ボール】

最初にコードを投稿します:

[/code]var Ball = function(x, y, ismine){
this.x = x;
this.y = y;
this。 ismine = ismine;
this.oldx = x;
this.oldy = y;
this.vx = 0;
this.vy = 0;
this.radius = ballRadius;
this.inhole = false;this.movi​​ng = true;
}
Ball.prototype = {
constructor:Ball,
_paint:function(){
var b = this. ismine ?document.getElementById("wb") : document.getElementById("yb")
if(b.complete) {
ctx.drawImage(b , this.x-this.radius , this.y- this .radius 、 2*this.radius 、 2*this.radius);
ctx.drawImage( b、this.x-this.radius、this.y-this.radius、2*this.radius、2* this.radius);
run:function(t){
this.oldx = this.x;
this.oldy = this.y;

this.vx = Math.abs(this.vx)0? this.vx-mcl*t : this.vx mcl*t);
this.vy = Math.abs(this.vy)0? this.vy-mcl*t : this.vy mcl*t);
// this.vx = this.vx> ; 0?

this.x = t * this.vx * pxpm;
this.y = t * this.vy * pxpm;

if((this.x370 && this.x 758 && this .y490) || (this.x>377 && this.x490) || (this.x > 758) && this.y>490)){
this.inhole = true;
if(this.ismine){
var that = this;
setTimeout(function(){
それ。 x = 202;
that.y = Canvas.height/2;
that.vx = 0;
that.vy = 0;
that.inhole = false;
} , 500 )
}
else {
document.getElementById("shotNum").innerHTML = parseInt(document.getElementById("shot Num").innerHTML) 1
}
}
else {
if(this.y > Canvas.height - (ボール半径 tbw) ||これ.y this.y = this.y this.derectionY = !this.derectionY;
this.vy = -this.vy*0.6;
}
if (this.x > Canvas.width - (ballRadius tbw) || this.x this.x = this.x this.derectionX = !this.derectionX;
this.vx = -this.vx*0.6;
                                                                                                                                                                                                            
this.movi​​ng = false;
else {

This.movi​​ng = true;

}
}
}[/code]
ボール属性: x、y ボール位置、vx、vy ボールの水平速度と垂直速度、ismine はそれが白いボールか別のボールかを表します (異なるボールは _paint メソッドで異なる絵を描画します)、oldx、oldy は前のボールの位置を保存するために使用されます。フレームですが、まだ使用されていないので、役立つはずです。 _paint メソッドについては特に言うことはありません。_run メソッドはボールの位置を追跡し、ボールの各フレームの時間に基づいてボールの変位増分と速度増分を計算します。mcl と pxpm は両方とも定数です。 、mcl は摩擦力、pxpm はおおよそのピクセルとリアリティの変換率を計算します。 。 。 。次に、衝突検出です。これは、ボールの位置が境界を超えるかどうかを計算します。ただし、この種の衝突検出は非常に緩いので、本当にゲームを作成したい場合は、より複雑なものを使用することをお勧めします。ボールの速度に応じて止める方法もあります。





コードをコピー

コードは次のとおりです。var dotLine = function(x0,y0, x1,y1 ){ this.x0 = this.x0; this.y0 = this.y0;
this.x1 = this.x1;
this.y1 = this.y1;
this .dotlength = 3;
this.display = false;
}
dotLine.prototype = {
constructor:dotLine,
_ready:function(){
this。 length = Math .sqrt(Math.pow(this.y1 - this.y0 , 2) Math.pow(this.x1 - this.x0 , 2));
this.dotNum = Math.ceil(this.length /this.dotlength);
},
_paint:function(){
this._ready();
xadd = this.dotlength*(this.x1 - this.x0)/this. length;
yadd = this.dotlength*(this.y1 - this.y0)/this.length;
ctx.save();
ctx.beginPath();
for(var i =1; i if(i%2!==0){
ctx.moveTo(this.x0 (i-1)*xadd , this.y0 (i -1) *yadd);
ctx.lineTo(this.x0 i*xadd , this.y0 i*yadd);
}
}
ctx.ストロークスタイル = "#FFF";
ctx .ストローク();
ctx.beginPath();
ctx.arc(this.x1, this.y1, ballRadius-2, 0, 2*Math.PI);
ctx.ストローク() ;
ctx.restore();
}
}

これは、マウスの位置と白の位置を取得するだけです。ボールを選択し、2 つの線の間に距離を引くと点線になります。


【マルチボール衝突検出】


コードをコピー

コードは次のとおりです。
関数collision(){
for(var i=0;i for(var j=0;j var b1 = ボール[i],b2 = ボール[j];
if(b1 !== b2 && !b1.inhole && !b2.inhole){
var rc = Math.sqrt(Math.pow( b1.x - b2.x , 2) Math.pow(b1.y - b2.y , 2));
if(Math.ceil(rc) if(!b1.movi​​ng && !b2.movi​​ng) return;
//衝突後の速度増分を取得
var ax = ((b1.vx - b2.vx)*Math.pow((( b1.x - b2.x) , 2) (b1.vy - b2.vy)*(b1.x - b2.x)*(b1.y - b2.y))/Math.pow(rc , 2)
var ay = ((b1.vy - b2.vy)*Math.pow((b1.y - b2.y) , 2) (b1.vx - b2.vx)*(b1.x - b2. x)*(b1.y - b2.y))/Math.pow(rc , 2)
//衝突ボールに速度増分を割り当てる
b1.vx = b1.vx-ax;
b1.vy = b1.vy-ay;
b2.vx = b2.vx ax;
b2.vy = b2.vy ay;
//ボールの衝突距離を修正
var clength = ((b1.radius b2.radius)-rc)/2;
var cx = clength * (b1.x-b2.x)/rc;
var cy = clength * (b1.y- b2. y)/rc;
b1.x = b1.x cx;
b1.y = b1.y cy;
b2.x = b2.x-cx;
b2.y = b2 .y-cy;
}
}
}
}
}

すべてのボールをトラバースし、2 つのボールの中心間の距離を計算します。 2 つのボールの半径の合計より小さい場合、衝突が発生します。両方の小さなボールが静止している場合、衝突検出は実行されません。それ以外の場合、衝突後の速度増加分の計算方法は、小さなボール衝突のアルゴリズム設計で直接確認できます。 、これは非常に詳細に説明されており、組み合わせると上記の一連の式が得られます。

衝突ボールに速度増分を割り当てます。フレーム内で 2 つのボールが衝突すると、2 つのボールが部分的に重なるため、位置補正を実行する必要があります。そうしないと、小さなボールが常に衝突してくっついてしまいます。位置補正の原理も簡単です。 2 つのボール間の中心距離、ピタゴラスの定理によって 2 つのボールの重なり合う領域の幅を計算し、その幅を 2 ​​で割って新しい位置をボールに割り当てます。 2 つのボールの距離は、ボールの中心間の距離に正確に等しくなります。

【マウス操作】

コードをコピー
コードは次のとおりです。
canvas.addEventListener("mousedown" , function(){
if(balls[0].movi​​ng) return;

document.querySelector(".shotPower").style.display = "block";
document.querySelector(".shotPower").style.top = ball[0].y-60 "px";
document.querySelector(".shotPower").style.left = ball[0].x-40 "px";
document.getElementById("pow").className = "animate";
var x = event.clientX document.body.scrollLeft document.documentElement.scrollLeft - document.querySelector(".view").offsetLeft;
var y =event.clientY document.body.scrollTop document.documentElement.scrollTop - document.querySelector( ".view").offsetTop;
dotline.display = true;
dotline.x0 = ball[0].x;
dotline.y0 = ball[0].y;
ドットライン。 x1 = x;
dotline.y1 = y;

window.addEventListener("mouseup" , muHandle , false);
window.addEventListener("mousemove" , mmHandle , false);

function mmHandle(){
var x =event.clientX document.body.scrollLeft document.documentElement.scrollLeft - document.querySelector(".view").offsetLeft;
var y =event.clientY document.body.スクロールトップ document.documentElement.scrollTop - document.querySelector(".view").offsetTop;
dotline.x1 = x;
dotline.y1 = y;
}
function muHandle(){
var x =event.clientX document.body.scrollLeft document.documentElement.scrollLeft - document.querySelector(".view").offsetLeft;
var y =event.clientY document.body.scrollTop document.documentElement.scrollTop - document.querySelector(".view").offsetTop;

var angle = Math.atan((y - ball[0].y)/(x - ball[0].x));
var h = document.getElementById("pow").offsetHeight/document.getElementById ("powbar").offsetHeight;
var v = 60*h;
document.getElementById("pow").style.height = h*100 "%"

ボール[0].vx = x - ボール[0].x>0 ? v*Math.abs(Math.cos(角度)) : -v*Math.abs(Math.cos(角度));
ボール[0].vy = y - ボール[0].y>0 ? v*Math.abs(Math.sin(角度)) : -v*Math.abs(Math.sin(角度));

document.getElementById("pow").className = "";

window.removeEventListener("mouseup" , muHandle , false);
window.removeEventListener("mousemove" , muHandle , false);
dotline.display = false;
document.querySelector(".shotPower") .style.display = "none";
}
},false);


ネズミ标アニメーション作也比较简单,有js基础的基本都没问题,就是鼠标按下后计算鼠标マウスがマウスを動かしたときに、マウスが移動したときに、マウスがマウスを動かしたときに、マウスがマウスを動かしたときに、マウスがマウスを動かしたときに、マウスがマウスを動かしたときに、マウスがマウスを動かして、マウスを動かしたときに、マウスがマウスを動かして、マウスを動かしたときに、マウスがマウスを動かして、マウスを動かしたときに、マウスがマウスを動かして、マウスを動かしたときに、マウスがマウスを動かして、その終点の位置を修正しました。白球の速度を決定し、その後、マウスの移動およびマウスの動きを取り除き、補助虚勢線および力量を測定して、水平速度および垂直速度に再分解する。

【アニメーション舞台】


复制代码代码如下:
function animate(){
ctx.clearRect(0,0,canvas.width,canvas.height)
var t1 = new Date();
var t = (t1 - t0)/ 1000;

collision();
ball.foreach(function(){
if(!this.inhole) this._run(t);
});
if(dotline.display){
dotline.x0 = ball[0].x;
dotline.y0 = ball[0].y;
dotline._paint();
}

t0 = t1;
if(!animateStop){
if(ウィンドウ内の "requestAnimationFrame"){
requestAnimationFrame(animate);
}
else if(ウィンドウ内の "webkitRequestAnimationFrame"){
webkitRequestAnimationFrame(animate);
}
else if("msRequestAnimationFrame" in window){
msRequestAnimationFrame(animate);
}
else if("mozRequestAnimationFrame" in window){
mozRequestAnimationFrame(animate);
}
else {
setTimeout(animate , 16);
}
}
}


これは游戏每一フレームの中間処理領域では、小球が入った場合、それ以上の制御は実行されず、補助仮想線の表示プロパティが false に設定されている場合、補助仮想線の制御は実行されず、各バンドの時間も計算されます。初期化]

复制代記入
代码如下:

var Canvas = document.getElementById( "cas");
var ctx = Canvas.getContext('2d');
var mcl = 1 、collarg = 0.8 、ballRadius = 15 、t0 = 0 、balls=[] 、tbw = 32 、animateStop = true 、powAnimation = false;
var dotline;
pxpm = Canvas.width/20;

window.onload = function(){
var myball = new Ball(202 , Canvas.height/2 , true);
ball.push(myball);
for(var i=0;i for(var j=0;j var other = new Ball(520 i*(ballRadius-2)*2 , (canvas.height-i*2 *ballRadius)/2 ballRadius 2*ballRadius*j , false);
ball.push(other);
}
}
t0 = new Date();
dotline = new dotLine (0,0,0,0);

animateStop = false;
animate();
}


すべての小球を例証し、小球すべてを参照して、適切な時間を取得し、補助仮想線を例証し、アニメーションを開始します。

ソースコード地址:https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Game-demo/snooker

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
H5:ツール、フレームワーク、およびベストプラクティスH5:ツール、フレームワーク、およびベストプラクティスApr 11, 2025 am 12:11 AM

H5開発で習得する必要があるツールとフレームワークには、Vue.JS、React、Webpackが含まれます。 1.Vue.jsは、ユーザーインターフェイスの構築に適しており、コンポーネント開発をサポートします。 2.複雑なアプリケーションに適した仮想DOMを介したページレンダリングを最適化します。 3.Webpackは、モジュールのパッケージングに使用され、リソースの読み込みを最適化します。

HTML5の遺産:現在のH5の理解HTML5の遺産:現在のH5の理解Apr 10, 2025 am 09:28 AM

html5hassificlytransformdedwebdeveverment byintroducingsingingelements、endincemultimediasupport、およびrequrovingperformance.1)itmadewebsitesmoreaccessibleandseo-frendlywithsemantelementslike、and.2)

H5コード:アクセシビリティとセマンティックHTMLH5コード:アクセシビリティとセマンティックHTMLApr 09, 2025 am 12:05 AM

H5は、セマンティック要素とARIA属性を介して、WebページのアクセシビリティとSEO効果を改善します。 1.使用などを使用して、コンテンツ構造を整理し、SEOを改善します。 2。ARIA-LabelなどのARIA属性はアクセシビリティを強化し、支援技術ユーザーはWebページをスムーズに使用できます。

H5はHTML5と同じですか?H5はHTML5と同じですか?Apr 08, 2025 am 12:16 AM

「H5」と「HTML5」はほとんどの場合同じですが、特定の特定のシナリオでは異なる意味を持つ可能性があります。 1。「HTML5」は、新しいタグとAPIを含むW3C定義標準です。 2。 "H5"は通常、HTML5の略語ですが、モバイル開発では、HTML5に基づくフレームワークを参照する場合があります。これらの違いを理解することは、プロジェクトでこれらの用語を正確に使用するのに役立ちます。

H5の機能は何ですか?H5の機能は何ですか?Apr 07, 2025 am 12:10 AM

H5、またはHTML5は、HTMLの5番目のバージョンです。開発者により強力なツールセットを提供し、複雑なWebアプリケーションを簡単に作成できるようにします。 H5のコア関数には、次のものが含まれます。1)Webページにグラフィックとアニメーションを描画できる要素。 2)Webページ構造をSEOの最適化を明確かつ助長させるなどのセマンティックタグなど。 3)Geolocationapiなどの新しいAPIは、ロケーションベースのサービスをサポートします。 4)互換性テストとポリフィルライブラリを通じて、クロスブラウザーの互換性を確保する必要があります。

H5リンクの実行方法H5リンクの実行方法Apr 06, 2025 pm 12:39 PM

H5リンクを作成する方法は?リンクターゲットを決定します。H5ページまたはアプリケーションのURLを取得します。 HTMLアンカーの作成:< a>を使用しますアンカーを作成し、リンクターゲットURLを指定するタグ。リンクプロパティの設定(オプション):必要に応じて、ターゲット、タイトル、およびオンクリックプロパティを設定します。 Webページに追加:リンクを表示するWebページにHTMLアンカーコードを追加します。

H5互換性の問題を解決する方法H5互換性の問題を解決する方法Apr 06, 2025 pm 12:36 PM

H5互換性の問題のソリューションには、次のものが含まれます。Webページが画面サイズに応じてレイアウトを調整できるレスポンシブデザインを使用します。クロスブラウザーテストツールを使用して、リリース前に互換性をテストします。 PolyFillを使用して、古いブラウザの新しいAPIのサポートを提供します。 Web標準に従って、効果的なコードとベストプラクティスを使用します。 CSSプリプロセッサを使用して、CSSコードを簡素化し、可読性を向上させます。画像を最適化し、Webページのサイズを削減し、ロードをスピードアップします。 HTTPSがWebサイトのセキュリティを確保できるようにします。

H5でリンクを生成する方法H5でリンクを生成する方法Apr 06, 2025 pm 12:33 PM

H5ページは、リンクを手動で作成するか、短いリンクサービスを使用するという2つの方法でリンクを生成できます。手動で作成することにより、H5ページのURLをコピーするだけです。短いリンクサービスを通じて、URLをサービスに貼り付けてから短縮URLを取得する必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい