国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > HTML > 正文

html5 乒乓球(碰撞檢測)實例二

2020-03-24 16:54:50
字體:
來源:轉載
供稿:網友
演示地址 http://koking.8u.hanmandarin.com/html5/1.html

簡單介紹

小球可以在方框內部自由運動
可以通過方向鍵控制黑色磚塊上下左右移動去與小球發生碰撞

代碼實現

復制代碼代碼如下:
!--
To change this template, choose Tools | Templates
and open the template in the editor.
--
!DOCTYPE html
html
head
title 乒乓球游戲 /title
meta http-equiv="Content-Type" content="text/html; charset=utf-8"
script
var ctx;
var canvas;
var ball_x=10;
var ball_y=10;
var ball_radius=10;
var ball_vx=10;
var ball_vy=8;
var wall_x=30;
var wall_y=40;
var wall_width=30;
var wall_height=60;
var box_x=0;
var box_y=0;
var box_width=300;
var box_height=300;
var bound_left=box_x+ball_radius;
var bound_right=box_x+box_width-ball_radius;
var bound_top=box_y+ball_radius;
var bound_bottom=box_y+box_height-ball_radius;
var unit=10;
function intersect(sx, sy, fx, fy, cx, cy, rad)
{
var dx;
var dy;
var t;
var rt;
dx = fx - sx;
dy = fy - sy;
t = 0.0 - (((sx - cx) * dx + (sy - cy) * dy) / (dx * dx + dy * dy));
if (t 0.0)
{
t = 0.0;
}
else if (t 1.0)
t = 1.0;
var dx1 = (sx + t * dx) - cx;
var dy1 = (sy + t * dy) - cy;
var rt = dx1 * dx1 + dy1 * dy1;
if (rt rad * rad)
return true;
else
return false;
}
function move_ball()
{
ball_x=ball_x+ball_vx;
ball_y=ball_y+ball_vy;
if(ball_x bound_left)
{
ball_x=bound_left;
ball_vx=-ball_vx;
}
if(ball_x bound_right)
{
ball_x=bound_right;
ball_vx=-ball_vx;
}
if(ball_y bound_top)
{
ball_y=bound_top;
ball_vy=-ball_vy;
}
if(ball_y bound_bottom)
{
ball_y=bound_bottom;
ball_vy=-ball_vy;
}
//撞到上邊
if(intersect(wall_x,wall_y,wall_x+wall_width,wall_y+wall_height,ball_x,ball_y,ball_radius))
{
ball_y=wall_y-ball_radius;
ball_vy=-ball_vy;
}
//撞到左邊
if(intersect(wall_x,wall_y,wall_x,wall_y+wall_height,ball_x,ball_y,ball_radius))
{
ball_x=wall_x-ball_radius;
ball_vx=-ball_vx;
}
//撞到右邊
if(intersect(wall_x+wall_width,wall_y,wall_x+wall_width,wall_y+wall_height,ball_x,ball_y,ball_radius))
{
ball_x=wall_x+wall_width+ball_radius;
ball_vx=-ball_vx;
}
//撞到下邊
if(intersect(wall_x,wall_y+wall_height,wall_x+wall_width,wall_y+wall_height,ball_x,ball_y,ball_radius))
{
ball_y=wall_y+wall_height+ball_radius;
ball_vy=-ball_vy;
}
}
function move_wall(ev)
{
var keyCode;
if(event==null)
{
keyCode=window.event.keyCode;
window.event.preventDefault();
}
else
{
keyCode=event.keyCode;
event.preventDefault();
}
switch(keyCode)
{
case 37://left;
wall_x-=unit;
if(wall_x bound_left)
wall_x=bound_left;
break;
case 38://up
wall_y-=unit;
if(wall_y bound_top)
wall_y=bound_top;
break;
case 39://right
wall_x+=unit;
if(wall_x+wall_width bound_right)
wall_x=bound_right-wall_width;
break;
case 40://down
wall_y+=unit;
if(wall_y+wall_height bound_bottom)
wall_y=bound_bottom-wall_height;
break;
default:
break;
}
}
function draw_all()
{
ctx.beginPath();
ctx.clearRect(box_x,box_y,box_width,box_height);
ctx.fill ;
//ctx.lineWidth=ball_radius;
ctx.arc(ball_x,ball_y,ball_radius,0,Math.PI*2,true);
ctx.fill();//note
ctx.fill ;
ctx.fillRect(wall_x,wall_y,wall_width,wall_height);
ctx.strokeRect(box_x,box_y,box_width,box_height);
}
function init()
{
canvas=document.getElementById('canvas');
ctx=canvas.getContext('2d');
draw_all();
setInterval(draw_all,100);
setInterval(move_ball,50);
window.addEventListener('keydown',move_wall,false);//note
}
/script
/head
body onLoad="init();"
canvas id="canvas" width="300" height="300" /canvas
/body
/html

難點

小球和磚塊的碰撞檢測以及碰撞處理
將磚塊分解為4條線段
分別對小球和每條線段進行碰撞檢測。

小球和線段的碰撞檢測在另一篇文章http://www.phpstudy.net/html5/93997.html中有介紹。html教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滦南县| 哈密市| 山阳县| 漾濞| 东乡族自治县| 凌源市| 辉南县| 永定县| 图们市| 铜川市| 靖边县| 宜黄县| 巴塘县| 永泰县| 乐东| 云梦县| 佛山市| 鄂伦春自治旗| 措勤县| 炉霍县| 长汀县| 连州市| 河北区| 会理县| 迭部县| 赞皇县| 营口市| 乌拉特前旗| 都兰县| 双鸭山市| 武隆县| 高要市| 开江县| 佛山市| 建昌县| 汝南县| 晴隆县| 广灵县| 大冶市| 荣成市| 诏安县|