山地自行车游戏单机版二指自行车

自行车专题介绍:世界上第一辆自行车面世至今已有500多年,可以说它极大改变了人们的生活方式,极大促进了世界发展。有人说有自行车的地方就有勤劳的中国人,此话不假。现在,4399把关于自行车的各种玩法搬到Flash小游戏中,相信你一定会喜欢的!
自行车手机游戏推荐
自行车小游戏排行
第 1 页 / 共 2 页
作品版权归作者所有,如果侵犯了您的版权,请,本站将在3个工作日内删除。温馨提示:抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防受骗上当,适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活
| | |||||&关注:
||||&法律顾问:北京盛峰律师事务所
文明办网文明上网举报电话:&|&举报邮箱:&||
Copyright & 2004 -
All Rights Reserved. 四三九九网络股份有限公司 版权所有共 11 页/11条记录
这被禁的十大游戏,有的是的确该死,大部分却都是冤杀的窦娥和崔宁。就好比世界十大禁书,《洛丽塔》《查泰来夫人》《承受之轻》《失乐园》都是现实主义的巨著,不是《品花宝鉴》《空空幻》之流所能相提并论的,不能因为涉及一些人性的根本就一棍子打死。闲话收起,我们来看这十大被禁游戏:也顺便认识一下神奇的国家澳大利亚、巴西、和沙特阿拉伯。
《极限自行车越野》
下面是一个运动类游戏,不是实况也不是2k,更不是沙滩排球,而是叫做《极限自行车越野》,听名字没什么,其实是最没节操最没下限的一个游戏。
这是作者唯一举双手赞同封杀的游戏,因为这根本和自行车运动没什么相干,它丫就是纯卖肉,卖肉也就算了,作者也不反对卖肉,可是为啥卖肉还要树立个&自行车运动&的牌坊?
这货在自由皿煮的美帝都混不下去,因为不但影响青少年健康,还拉低青少年智商,《BMX XXX》由于内含刺激的性与暴力表现而遭到美国Wal-Mart、Toys R Us、KB Toys等出货通路公司店家拒绝贩售。
游戏制作公司Acclaim被迫退让一步修改部分游戏内容,PS2版部分是将Topless模式完全拿掉,而Xbox方面则因为Xbox主机有所谓保护未成年少年(未满17岁)的锁码功能,因此会自动将Topless模式排除掉。
共 11 页/11条记录
您可以使用“←
→”键快速翻页熊大熊二自行车大比拼,熊大熊二自行车大比拼小游戏,4399i小游戏
 最热门:        
               
              
               
              
            
           
            
         
 最热门:        
 最热门:        
 最热门:        
 您当前的位置:
&&  && 熊大熊二自行车大比拼
?人气:710
?如何便捷进入4399i小游戏? 一键进入 或者 立即找到我们5000人阅读
【游戏开发】(21)
【Html5&JavaScript】(53)
【Box2D】(4)
【Lufylegend.js】(34)
第二章又拖到现在才发布,话说本次更新离上次已经很久了。不知道大家还记得上一章讲的内容否?在上一章中,我们创建了各式各样的地形,今天我们就在这个地形之上,创建一辆自行车,并让它受到我们的控制。首先放上一张截图:没看过上一章的同学可以先移步到上一章。在了解上一章的内容之后,读起本章方可容易一些。HTML5物理游戏开发 - 越野山地自行车(一)建立各式各样的地形※再次声明,本次开发用到了lufylegend.js开源html5游戏引擎和box2dweb物理引擎,请到官方网站下载使用。官方网站地址已在第一章中说过了。一,基础知识首先我们来科普几个知识,只有了解这些知识之后,读起下面的内容才不会感觉头疼。1,如何使刚体移动在box2dweb中,要想使刚体移动,不能单纯地改变x、y坐标。其一,这样会使你的游戏失去了物理运动的效果;其二,在box2dweb中,直接调整刚体的位置是一个十分不好的方法,会违背物理运动原理,只有在刚体创建前的时候才用这个方法。所以在我们的自行车创建出来以后,想要移动刚体,最好的方法就是给刚体施加一个力。在box2dweb中,施加力的方法有:ApplyForce、ApplyImpulse、SetLinearVelocity。本次使用的只有ApplyForce。其余的几种可以暂且不管。如果你确实想了解的话,可以看看ladeng6666的这篇文章:ApplyForce的用法如下:ApplyForce(vec, pos)这个函数的第个一个参数是给物体施加力的向量(b2Vec2);第二个pos是施加的位置,一般不确定位置的时候就取物体的重心(可以用b2Body的GetWorldCenter获取)。2,如何构造像自行车这样形状复杂的物体如何构造像自行车这样形状复杂的物体确实是一个值得思考的话题。对我们而言,第一个出现在脑子里的想法就是创建一个多边形刚体。当然这样实现起来极其麻烦,而且不仅仅是麻烦,做到最后更扫兴的是使用这种方法弄出来的刚体碰撞检测有问题,换言之,一个原本是凹凸多边形的刚体,突然就成了柔体,碰在其他物体上就会渗入其他物体里,so qipa~那到底应该怎么办呢?我们不妨假设自己就真正地在制作一辆自行车。首先,我们要把材料和工具准备好。材料就是几个木块,工具就是一个锤子,一把铁钉。接下来,我们要做的就是用锤子铁钉把几个木块组装起来就ok了。这样看起来虽然so easy,但是有朋友会问,在box2dweb里到哪里去找锤子铁钉呢?锤子铁钉在box2dweb里倒是真没有,不过有一个更先进的东西——关节(joint)。在这里主要就是需要两种关节:旋转关节(用于把轮子和支架绑起来),焊接关节(用于把各个支架固定起来)。这两个关节在box2dweb里的使用方法依然不是那么简单,因此同样用到了lufylegend.js的封装。接下来就对这几个关节的用法进行说明。■setRevoluteJoint(b2BodyA,&b2BodyB,&limits,&motors)b2BodyA:表示物体A (b2Body对象,可以用LSprite的box2dBody属性获取)b2BodyB:表示物体B(b2Body对象,可以用LSprite的box2dBody属性获取)limits:表示旋转角度限制数组,这个数组的内容是:[最小角度,最大角度],它在这里可以限制旋转关节旋转的角度(可以不传)motors:表示马达数组,这个数组的内容是:[力度,速度],马达可以有很多用途,在这里,它可以是关节自动进行旋转(可以不传)示例:var backLayer,cL
function main(){
LGlobal.setDebug(true);
backLayer = new LSprite();
addChild(backLayer);
LGlobal.box2d = new LBox2d();
cLayer = new LSprite();
cLayer.x = 300;
cLayer.y = 390;
backLayer.addChild(cLayer);
cLayer.addBodyPolygon(600,10,0,5,0.4,0.2);
//加入一个动态的圆形物体1
box01 = new LSprite();
box01.x = 250;
box01.y = 200;
backLayer.addChild(box01);
box01.addBodyCircle(100,0,0,1,1,0.4,0.2);
box01.setBodyMouseJoint(true);
//加入一个静态的圆形物体2
box02 = new LSprite();
box02.x = 250;
box02.y = 150;
backLayer.addChild(box02);
box02.addBodyCircle(10,0,0,0,1,0.4,0.2);
//加入一个旋转关节
LGlobal.box2d.setRevoluteJoint(box01.box2dBody, box02.box2dBody ,[-360,720*5],[450,2]);
}■setWeldJoint (b2BodyA,&b2BodyB)b2BodyA:表示捆绑对象物体A(b2Body对象,可以用LSprite的box2dBody属性获取)b2BodyB:表示捆绑对象物体B(b2Body对象,可以用LSprite的box2dBody属性获取)示例:var backLayer,cL
function main(){
LGlobal.setDebug(true);
backLayer = new LSprite();
addChild(backLayer);
LGlobal.box2d = new LBox2d();
cLayer = new LSprite();
cLayer.x = 300;
cLayer.y = 390;
backLayer.addChild(cLayer);
cLayer.addBodyPolygon(600,10,0,5,0.4,0.2);
//加入一个动态的圆形物体1
box01 = new LSprite();
box01.x = 200;
box01.y = 100;
backLayer.addChild(box01);
box01.addBodyCircle(50,0,0,1,1,0.4,0.2);
box01.setBodyMouseJoint(true);
//加入一个动态的圆形物体2
box02 = new LSprite();
box02.x = 250;
box02.y = 100;
backLayer.addChild(box02);
box02.addBodyCircle(50,0,0,1,1,0.4,0.2);
box02.setBodyMouseJoint(true);
//加入一个焊接关节
LGlobal.box2d.setWeldJoint(box01.box2dBody, box02.box2dBody);
}ok,基础知识差不多讲完了。进入正题吧。二,修改Main类上一章中的Main类大家还记得否?上次我没有加入真正的自行车,而是拿一个圆形小球在那里充当着,主要是给大家看看镜头跟随效果和各式各样的地形。这次既然要实现一个自行车,那么就要先把小球换掉,于是更改addBicycle函数,更新后如下:Main.prototype.addBicycle = function(){
//创建自行车对象
s.bicycleObj = new Bicycle(50,385);
s.addChild(s.bicycleObj);
};这里明显用到了Bicycle这个类。那么,我就立刻把笔尖指向Bicycle类吧,这个类是本章的重点内容,前面的基础讲解就是为这个类作铺垫的。三,自行车类(Bicycle)先看看构造器:function Bicycle(sx,sy){
base(s,LSprite,[]);
/**初始坐标*/
/**刚体所属LSprite对象列表*/
s.bodyList = new Array();
/**添加左右移动力度向量*/
s.moveVec = new LStage.box2d.b2Vec2();
/**添加拉压操作力度向量*/
s.tcVec = new LStage.box2d.b2Vec2();
/**添加事件*/
//键盘按下事件
LEvent.addEventListener(window,LKeyboardEvent.KEY_DOWN,function(e){
s.onKeydown(e,s);
//键盘松开事件
LEvent.addEventListener(window,LKeyboardEvent.KEY_UP,function(e){
s.onKeyup(e,s);
}构造器代码加入了详细的注释,所以我们直接进入讲解Bicycle的init函数。这是代码:Bicycle.prototype.init = function(){
var sx = s.
var sy = s.
/**轮子半径*/
var wheelR = 20;
/**轮子之间的距离*/
var gapBetweenWheelAndWheel = 100;
/**车手柄到轮子的距离*/
var gapBetweenWheelAndHandlebar = 50;
/**车把尺寸*/
var handlebarWidth=20,handlebarHeight=5;
/**座椅到轮子支架的距离*/
var gapBetweenWheelFrameAndSeat = 30;
/**座椅尺寸*/
var seatWidth=30,seatHeight=5;
/**支架尺寸*/
var frameSize = 10;
/**加入支架*/
//轮子上的支架
var frameAObj = new LSprite();
frameAObj.x = sx+gapBetweenWheelAndWheel/2;
frameAObj.y = sy+frameSize/2;
frameAObj.addBodyPolygon(gapBetweenWheelAndWheel,frameSize,1,5);
world.addChild(frameAObj);
s.bodyList.push(frameAObj);
//车把到轮子的支架
var frameBObj = new LSprite();
frameBObj.x = sx+gapBetweenWheelAndWheel-frameSize/2;
frameBObj.y = sy-gapBetweenWheelAndHandlebar/2;
frameBObj.addBodyPolygon(frameSize,gapBetweenWheelAndHandlebar,1,2);
world.addChild(frameBObj);
s.bodyList.push(frameBObj);
/**加入车把*/
var handlebarObj = new LSprite();
handlebarObj.x = sx+gapBetweenWheelAndWheel-handlebarWidth/2-frameS
handlebarObj.y = sy-gapBetweenWheelAndHandlebar+handlebarHeight/2;
handlebarObj.addBodyPolygon(handlebarWidth,handlebarHeight,1,.5);
world.addChild(handlebarObj);
s.bodyList.push(handlebarObj);
/**加入座椅*/
//座椅到轮子支架的支架
var seatFrameObj = new LSprite();
seatFrameObj.x = sx+30;
seatFrameObj.y = sy-gapBetweenWheelFrameAndSeat/2;
seatFrameObj.addBodyPolygon(frameSize,gapBetweenWheelFrameAndSeat,1,1);
world.addChild(seatFrameObj);
s.bodyList.push(seatFrameObj);
var seatObj = new LSprite();
seatObj.x = sx+30;
seatObj.y = sy-gapBetweenWheelFrameAndSeat-seatHeight/2;
seatObj.addBodyPolygon(seatWidth,seatHeight,1,.5);
world.addChild(seatObj);
s.bodyList.push(seatObj);
/**加入轮子*/
//左边轮子A
var wheelAObj = new LSprite();
wheelAObj.x = sx-wheelR;
wheelAObj.y =
wheelAObj.addBodyCircle(wheelR,wheelR,wheelR,1,2.5,.2,.4);
world.addChild(wheelAObj);
s.bodyList.push(wheelAObj);
//右边轮子B
var wheelBObj = new LSprite();
wheelBObj.x = sx+gapBetweenWheelAndWheel-wheelR;
wheelBObj.y =
wheelBObj.addBodyCircle(wheelR,wheelR,wheelR,1,2.5,.2,.4);
world.addChild(wheelBObj);
s.bodyList.push(wheelBObj);
/**添加关节*/
//轮子A和轮子支架的旋转关节
LStage.box2d.setRevoluteJoint(frameAObj.box2dBody, wheelAObj.box2dBody);
//轮子B和轮子支架的旋转关节
LStage.box2d.setRevoluteJoint(frameAObj.box2dBody, wheelBObj.box2dBody);
//车把到轮子的支架和轮子支架的焊接关节
LStage.box2d.setWeldJoint(frameAObj.box2dBody, frameBObj.box2dBody);
//车把到轮子的支架和车把的焊接关节
LStage.box2d.setWeldJoint(handlebarObj.box2dBody, frameBObj.box2dBody);
//轮子的支架和座椅的焊接关节
LStage.box2d.setWeldJoint(seatFrameObj.box2dBody, frameAObj.box2dBody);
//座椅的支架和座椅的焊接关节
LStage.box2d.setWeldJoint(seatFrameObj.box2dBody, seatObj.box2dBody);
/**遍历所有自行车零件刚体*/
for(var key in s.bodyList){
var obj = s.bodyList[key];
//加入鼠标拖动
if(obj.box2dBody)obj.setBodyMouseJoint(true);
//设置对象名称
obj.name = &bicycle&;
/**设置主刚体*/
s.mainBody = frameAObj.box2dB
/**设置拉压操作刚体*/
s.tcBody = wheelBObj.box2dB
};这个函数看上去超长,但是逻辑却异常简单,大部分是重复的代码,再通过上面的基础讲解外加注释,看上去应该是无压力了吧,当然如果有不懂的,欢迎在本文下方留言。其中,我为了大家测试时的简化操作,给每一块刚体都设置了鼠标拖动,但是又由于刚体有很多,所以我把它们统统装在bodyList这个数组了,然后最后用遍历的方式给每一个刚体都设置了鼠标拖动。最后来看看如何实现键盘操作。不难发现,在构造器里有这么一段代码:/**添加事件*/
//键盘按下事件
LEvent.addEventListener(window,LKeyboardEvent.KEY_DOWN,function(e){
s.onKeydown(e,s);
//键盘松开事件
LEvent.addEventListener(window,LKeyboardEvent.KEY_UP,function(e){
s.onKeyup(e,s);
});在段代码里,我们还用到了onKeydown和onKeyup这两个函数。代码如下:Bicycle.prototype.onKeydown = function(e,s){
var force = 50;
switch(e.keyCode){
s.moveVec.x =
s.moveVec.x = -
s.tcVec.y = -
s.tcVec.y =
/**施加移动的力*/
s.mainBody.ApplyForce(s.moveVec,s.mainBody.GetWorldCenter());
/**施加拉压的力*/
s.tcBody.ApplyForce(s.tcVec,s.tcBody.GetWorldCenter());
Bicycle.prototype.onKeyup = function(e,s){
/**清空力度相量*/
s.moveVec.SetZero();
s.tcVec.SetZero();
};在这里我们用到了之前讲过的ApplyForce。之前讲的时候,没有具体讲第一个参数是因为没有实际用到讲了等于徒劳。现在可以看到,这个b2Vec2有x,y属性,这两个属性可以控制力的方向。x&0向左,x&0向右,y&0向下,y&0向上。当然,tcVec和moveVec是两个不同的向量,也就是说控制的不是同一个效果。moveVec是控制移动自行车的,这个不用多说。而tcVec是用于拉、压自行车的,我们知道,当在游戏中要开翻车的时候,往往可以用拉、压的方式来操控自行车,使其重新平衡,这个tcVec就是干这活儿的。BTW,如果你不知道tcBody和mainBody是什么,可以看看Bicycle里init函数的代码。添加完键盘事件后,我们就可以通过方向键来控制自行车了。操作方式为:上-拉,下-压,左-后退,右-前进。大家可以打开本文最下方的测试链接进行测试。ok,至此,运行一下代码,得到的就是本文最上方图片所示的效果了。(什么?太丑了?你指的是我还是这个游戏?这个游戏啊,没贴图当然丑呢。)奉上源代码下载地址:测试地址:下一章预告:目前,咋们的自行车是金刚不坏之身,你怎么摔它,它就是摔不碎(除非你把显示器抱起来,然后使劲往地上摔)。但是这不科学对吧……所以在下一章,我们就来看看,如何把这个自行车摔得支离破碎,体无完肤。哈哈,尽情期待~本章就先到这里了。如果文章有任何疏漏之处,欢迎指正。当然,有不懂之处也欢迎各位在本文下方留言,我会尽力回复大家的。----------------------------------------------------------------欢迎大家转载我的文章。转载请注明:转自欢迎继续关注我的博客
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:674849次
积分:7957
积分:7957
排名:第2006名
原创:66篇
评论:822条
基于HTML5和lufylegend.js开源引擎的一款类似于贪吃蛇的游戏。相信这款游戏能给你带来欲速则不达、近在咫尺却无法接触地虐心体验!
本游戏基于开源HTML5引擎lufylegend.js开发,是一款跨平台休闲类翻牌游戏。本游戏一共有五个关卡,随着关卡难度的增加会有更多卡牌出现。快来考验一下自己的记忆力吧~
阅读:64319
文章:20篇
阅读:275594
(1)(2)(3)(3)(1)(2)(1)(2)(1)(1)(1)(1)(3)(1)(1)(1)(1)(1)(1)(1)(2)(1)(3)(3)(6)(3)(4)(3)(2)(1)(1)(4)(4)

我要回帖

更多关于 双人自行车小游戏大全 的文章

 

随机推荐