问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用html5做一个遥控汽车应用程序

发布网友 发布时间:2022-04-28 17:06

我来回答

1个回答

热心网友 时间:2022-04-20 01:22

摆在我面前的问题就是选择什么语言进行编写咯,我首先考虑了JAVA,首先我从来没写过JAVA的程序,而且IDE装起来很麻烦,而且还是英文的,那更加完全不懂了。然后是C#,很多人都不知道C#可以写Android应用。其实是可以的,但是Android Studio我上次用着卡卡的,印象不是很好,不想用。那还剩下什么选择呢?还有一个:HTML5。 
好了我去装了个Hbuilder: 
 
中文的,很好用,问题在于我也从来没用过javascript,不过这是小问题啦。 
打开Hbuilder,设置一些护眼什么的,然后点左上角[文件]-[新建]-[移动APP]。然后我选了个模板: 
 
嗯,这就是这个程序在手机上执行的时候的样子。然后我模仿着加了一个列表项到index.html里面去:

<li id="plus/controller.html" onclick="clicked(this.id);">
<span class="item">Controller        <div class="chs">小车遥控器</div>
</span></li>12345

好的,于是这个列表就加了一个选项了。: 
 
继续,在plus文件夹里边添加一个controller.html,这就是我们的摇杆所存在的页面。在这个页面上,我们需要一个canvas标签和一个js脚本共同来绘制摇杆:

<!DOCTYPE html><html>

<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="HandheldFriendly" content="true" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<!--<meta name="MobileOptimized" content="320" />-->
<title>小车遥控器</title>
<script type="text/javascript" src="../js/common.js"></script>
</head>
<body>
<div class="leftjoystick">
<canvas id="joystick" width="120" height="120"></canvas>
<script src="../js/Joystick.js"></script>
</div>
</body></html>12345678910111213141516171819

好了,开始写代码绘制摇杆之前,我先做了两幅图,这样绘制摇杆时候就比较省力气了,效果也比较好。。 


然后经过了一整天来熟悉javascript。我把控制摇杆的js代码捣鼓出来了。放代码咯:

var ji = new Image(); //内摇杆图片var jo = new Image(); //外摇杆图片var joystick = document.getElementById('joystick'); //画板var josize = joystick.height; //外摇杆大小var jisize = josize * 0.6; //内摇杆大小var centerX = josize / 2; //摇杆中心x坐标var centerY = josize / 2; //摇杆中心y坐标window.addEventListener('load', load, false);var jc = joystick.getContext('2d'); //画布//摇杆头应当移动到的位置var jx = 0,
jy = 0;//图片加载完成时执行这俩函数ji.onload = function() {
jc.drawImage(ji, centerX - jisize / 2, centerY - jisize / 2, jisize, jisize); //首次绘制内摇杆}
jo.onload = function() {
jc.drawImage(jo, centerX - josize / 2, centerY - josize / 2, josize, josize);
}//绘图函数(绘制图形的时候就是用户观察到摇杆动了,所以取名是move)function move() {
jc.clearRect(centerX - josize / 2, centerY - josize / 2, josize, josize);//清空画板
jc.drawImage(jo, centerX - josize / 2, centerY - josize / 2, josize, josize);//画底座
jc.drawImage(ji, centerX - jisize / 2 + jx, centerY - jisize / 2 + jy, jisize, jisize);//画摇杆头

requestAnimationFrame(move); //下一次绘图}
ji.src = '../img/joystickin.png';//加载图片jo.src = '../img/joystickout.png';//加载图片//页面加载时执行该函数function load() {
document.addEventListener('touchstart', touch, false);
document.addEventListener('touchmove', touch, false);
document.addEventListener('touchend', touch, false);    //加载的时候先把摇杆绘制出来再说
move();    //var effectiveFinger = 0; //当前有效手指

//触摸事件触发函数
function touch(event) {
var event = event || window.event;        var oInp = document.getElementById("inp");        switch(event.type) {            case "touchstart":                //              //判断是否击中摇杆头
//              if(Math.abs(event.touches[event.identifier].clientX - 100 - jx) <= 40 &&
//                  Math.abs(event.touches[event.identifier].clientY - 100 - jy) <= 40) {
//                  effectiveFinger = event.identifier; //若是,则将此手指设为有效手指
//              }//这个不知道为啥不能起作用,获取不到event.identifier。
break;            case "touchend"://手指离开的时候
//若手指离开,那就把内摇杆放中间
jx = 0;
jy = 0;                break;            case "touchmove"://手指移动的时候:
//是否触摸点在摇杆上
if(Math.sqrt(Math.pow(event.touches[effectiveFinger].clientX - centerX, 2) +                        Math.pow(event.touches[effectiveFinger].clientY - centerY, 2)) <=
josize / 2 - jisize / 2) {
jx = event.touches[effectiveFinger].clientX - centerX;
jy = event.touches[effectiveFinger].clientY - centerY;
} else
//否则计算摇杆最接近的位置
{                    var x = event.touches[effectiveFinger].clientX,
y = event.touches[effectiveFinger].clientY,
r = josize / 2-jisize/2;                    var ans=GetPoint(centerX,centerY,r,centerX,centerY,x,y);                    //圆与直线有两个交点,计算出离手指最近的交点
if(Math.sqrt((ans[0]-x)*(ans[0]-x)+(ans[1]-y)*(ans[1]-y))<Math.sqrt((ans[2]-x)*(ans[2]-x)+(ans[3]-y)*(ans[3]-y)))
{
jx=ans[0]-centerX;jy=ans[1]-centerY;
}                    else
{
jx=ans[2]-centerX;jy=ans[3]-centerY;
}
}                //move();
event.preventDefault();//防止页面滑动,取消掉默认的事件
break;
}
}
requestAnimationFrame(move);//开始绘图}//计算圆于直线的交点(这一块好难啊)function GetPoint(cx, cy, r, stx, sty, edx, edy) {
//(x-cx)^2+(y-cy)^2=r^2
//y=k*x+b
var k = (edy - sty) / (edx - stx);    var b = edy - k * edx;    //(1 + k^2)*x^2 - x*(2*cx -2*k*(b -cy) ) + cx*cx + ( b - cy)*(b - cy) - r*r = 0
var x1, y1, x2, y2;    var c = cx * cx + (b - cy) * (b - cy) - r * r;    var a = (1 + k * k);    var b1 = (2 * cx - 2 * k * (b - cy));    var tmp = Math.sqrt(b1 * b1 - 4 * a * c);

x1 = (b1 + tmp) / (2 * a);
y1 = k * x1 + b;

x2 = (b1 - tmp) / (2 * a);
y2 = k * x2 + b;    return [x1,y1,x2,y2];
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116

这个代码的思路就是,如果手指在底座上,那么就把摇杆头移动到手指下方,如果手指在底座外,那就把摇杆移动到底座离手指最近的部分。嗯,就是这样。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
表格列求和公式怎么设置 求和函数公式怎么输入 北京注册成立一个公司需要多少钱 北京公司都是什么 手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 域名出售页面 文字怎么写更吸引人? TypeError: Cannot read property &#39;style&#39; of null怎么解决 如何禁用iscroll5的刷新 amaze ui 支持jsp吗 移动端web开发meta怎么用 手机上全屏显示图片 点击图片后复制一段隐藏文本的代码要怎么写 如何用Angular写界面 网页设计中&lt;head&gt;? &lt;/head&gt; 用dreamweaver 制作网页出现乱码怎么回事 网站Meta标签都有哪些属性及作用 微信自助解封验证码错误怎么回事 微信被冻结了,然后他把电话号码给换了,我每次申请解冻就说短信验证码错误,怎么办啊 被手机自助冻结,然后解冻一直提醒我短信验证码错误 微信解冻验证码错误 被手机自助冻结,然后解冻一直提醒我短信验证码错误? 老师您好,我的好老师演讲稿600字左右 为什么解冻微信验证码会错误啊? 解冻短信验证码错误怎么办 微信账号解冻提示短信验证码错误,请返回重新尝试怎么回事 正宗慕斯蛋糕做法及配方 js、jquery 如何隐藏浏览器地址栏(网页优化,手机可以,ipad mini不可以... 用&lt;bgsound src=&quot;...&quot; &#47;&gt;在文件中加背景音乐,电脑上是有声,微信打开或者用手机浏览器打开就没有声了。 首页banner宽度全屏显示的问题,div+css HTML Meta标签知多少 考企业人力资源管理师三级要多少钱 学人力资源管理师 学费便宜证多少 报考助理人力资源管理师的培训费用是多少 企业人力资源管理师的*与二级报考条件和时间与报考费用??无比感谢 我重新装了操作系统windows xp sp2 无法安装显卡驱动程序怎么办? 如何在XP-SP2下安装版本较低的显卡驱动? 系统升级成SP2以后,显卡驱动怎么也装不上 WINXP SP2自带的显卡驱动问题 重新装了SP2后,没有装显卡,分辨率有32位,可是装了显卡后只有4位,怎么回事?求救啊,我的显卡是NVIDIA GeForc windows xp sp2 的安装 红旗linux6.0 sp2 和7。0rc1 下NVfx5200显卡驱动怎么安装 怎么查看有没有安装显卡驱动 还有怎么查看我这机器是不是XP_SP2的系统? 新手问题ghost版windowXP SP2怎么安装啊 windows xp sp2应该用什么显卡驱动?给出地址啊!! 我下了N个别都是说什么无法兼容什么的! sp2苹果美化版 显卡驱动 安装显卡驱动要什么C盘插进 我没有啊 那怎么找文件安装啊