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

物理小游戏原理

发布网友 发布时间:2022-05-12 04:08

我来回答

5个回答

懂视网 时间:2022-05-12 08:30

前天公司聚会,在一起玩游戏,游戏虽然及其简单,但是却很适合在活动中玩,因为公司参加聚会的人比较多,所以只有一部分人玩到了。晚上回家后我试着将其中一款游戏用html5还原了一下,第二天给大家玩儿,在公司的人气爆火,尤其女生,边玩边叫,“おもしろい!!”,“難しい!!”...。

一般大家看到女生喜欢,肯定急切想知道是什么游戏吧?游戏界面如下。


看到游戏界面后,估计有几个人已经摔倒在地了吧,就是一个及其简单的物理游戏,游戏开始后,按住鼠标左右划动屏幕,主人公就好像荡秋千一样,越荡越高,等适当的时候松开鼠标,将主人公荡出去,谁飞出去的最远,谁就获胜。

其实,越是这样简单短小的游戏,越是适合聚会这样的活动中玩,尤其加上排名系统后,大家也会想要排名靠前一些,而争着去玩儿。

游戏测试连接:

http://lufylegend.com/demo/box2dJump

注意:本游戏纯粹是抽了一个小时左右时间随便给公司同事娱乐一下而做的,画面和效率等都没经过优化,请用PC打开,移动端运行起来估计会卡死

制作开始

一,准备

游戏中用到了两个引擎

一个是HTML5开源引擎lufylegend.js,下面是我在博客的lufylegend-1.7.0发布帖,里面有简单的介绍

http://blog.csdn.net/lufy_legend/article/details/8719768

另一个是Box2dWeb,下载地址如下

http://code.google.com/p/box2dweb/downloads/list

二,游戏开发

从游戏界面中可以看到,游戏开发的重点就是一条绳子,在HTML5中如何来实现绳子呢?

在box2d中是没有绳子的,但是熟悉box2d的朋友们,应该对旋转关节setRevoluteJoint不陌生,实现绳子的话,我们可以把一连串的刚体用旋转关节连接在一起,这样这些刚体摆动起来的话,就跟绳子差不多了。

看下面的代码,我把1个静态的刚体和20个动态的刚体用旋转关节连接到了一起。

代码清单1

var bx = 250,by=40;
 var box01,box02;
	box01 = new LSprite();
	box01.x = bx;
	box01.y = 30;
	backLayer.addChild(box01);
	box01.addBodyCircle(10,0,0,0,1,10,0.2);
	linelist = [box01];
 for(var i=0;i<20;i++){
	 box02 = new LSprite();
	 box02.x = bx;
	 box02.y = by+i*10;
	 backLayer.addChild(box02);
	 box02.addBodyCircle(10,0,0,1,1,10,0.2);
	 LGlobal.box2d.setRevoluteJoint(box02.box2dBody, box01.box2dBody );
	 linelist.push(box02);
 	box01 = box02;
 }

最后,在加上一个稍微大一点的刚体,来作为游戏中的主人公,并且也用旋转关节跟前面的刚体连接起来。

代码清单2

hero = new LSprite();
	var bit = new LBitmap(new LBitmapData(imglist["chara03"]));
	bit.x = -25;
	bit.y = -20;
	hero.addChild(bit);
	hero.bitmap = bit;
	hero.x = bx;
	hero.y = by+i*10;
	backLayer.addChild(hero);
	hero.addBodyPolygon(30,50,1,2,10,.2);
	joinline = LGlobal.box2d.setRevoluteJoint(hero.box2dBody, box01.box2dBody );

这样就差不多了,剩下的就是如何来控制主人公的摇摆和飞出去,这时候需要三个事件。

代码清单3

backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
	backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,ondown);
	backLayer.addEventListener(LMouseEvent.MOUSE_UP,onup);

上面代码中onframe函数是时间轴,ondown和onup分别是鼠标按下和弹起时调用的事件,鼠标按下和弹起比较简单,代码如下。

代码清单4

function ondown(event){	
	if(out)return;
	monseIsDown = true;	
	mouseObject.x = event.offsetX;
}
function onup(event){	
	if(out)return;
	monseIsDown = false;
	LGlobal.box2d.world.DestroyJoint(joinline);
	hero.bitmap.bitmapData = new LBitmapData(imglist["chara04"])
	hero.bitmap.x = 0;
	hero.bitmap.y = 0;
	out = true;
}

onframe函数里基本上包含了游戏的所有逻辑部分。

首先,前面制作的“绳子”是没有皮肤的,也就是说除非debug模式,否则是不显示的,那么就要在绳子摆动的时候,顺着这些刚体绘制出一条曲线,就变成了绳子了,代码如下。

代码清单5

backLayer.graphics.clear();
	backLayer.graphics.drawRect(1,"#000000",[0,0,LGlobal.width,LGlobal.height]);
	for(var i=0;i<linelist.length - 1;i++){
		backLayer.graphics.drawLine(2,"#000000",[linelist[i].x,linelist[i].y,linelist[i+1].x,linelist[i+1].y]);
	}

接着,是让绳子摆动,判断鼠标是否左右晃动,分别向左或者向右给刚体加上一个力,来让刚体动起来,代码如下

代码清单6

if(monseIsDown && !out){	
		if(checkIndex++ > 10){
			checkIndex = 0;
			if(LGlobal.offsetX - mouseObject.x > 50){
				var force = 50;
				var vec = new LGlobal.box2d.b2Vec2(force,0);
				hero.box2dBody.ApplyForce(vec, hero.box2dBody.GetWorldCenter());
			}else if(LGlobal.offsetX - mouseObject.x < -50){
				var force = 50;
				var vec = new LGlobal.box2d.b2Vec2(-force,0);
				hero.box2dBody.ApplyForce(vec, hero.box2dBody.GetWorldCenter());
			}
			mouseObject.x = LGlobal.offsetX;
		}	
	}	

最后,在鼠标弹起的时候,由于主人公被弹飞了出去,所以让游戏窗口跟着他一起动起来就可以了。


代码清单7

if(!out)return;
	backLayer.x = LGlobal.width*0.5 - hero.x;
	if(backLayer.x > 0){
		backLayer.x=0;
	}
	LGlobal.box2d.synchronous();
	if(!hero.box2dBody.IsAwake() && out){
		backLayer.removeEventListener(LEvent.ENTER_FRAME,onframe);
		point = Math.floor((hero.x - 250)*0.1);

		var rank = new GameRanking();
		backLayer.addChild(rank);
	}

整个游戏就这样制作完成了,先在debug模式下预览一下,可以看到我们制作的“绳子”其实就是一串刚体


而非debug模式下,就成了下面的界面了。

三,源码

最后给出本次游戏的源代码

http://lufylegend.com/lufylegend_download/box2dJump.rar

注:只含游戏源码,lufylegend.js引擎和box2dweb引擎请看准备部分自己下载

热心网友 时间:2022-05-12 05:38

private const g=9.8
Private Sub Timer1_Timer()
ball.top=0.5*g*t^2 '二分之一gt平方,公式
t=t+1
End Sub
t线性递增,改interval可以改速度
用控件有频闪(下移过程中图形会闪烁),建议做图形缓冲

热心网友 时间:2022-05-12 06:56

手机游戏百度一下“QQ斗牛”...百度一下“QQ斗牛”游戏类型:其它游戏 / 单机游戏更新时间:2004-07-29下载次数:68032游戏等级: 1星 2星 3星 4星 5星 立即下载收藏游戏 游戏评论 推荐...◆打铁不惜炭,养儿不惜饭。 gjmqt

参考资料:qqdouniu

热心网友 时间:2022-05-12 08:30

???

热心网友 时间:2022-05-12 10:22

Private Sub Timer1_Timer()
a = 9.8
Static t
t = t + 1
v = a * t
球.Top =球.Top + v
End Sub追问这个公式好像不对吧。
球.top = 球.top + 速度
这是什么意思啊

追答在每个timer的时间段里,时间为1,所以只有v就够了。
top是垂直坐标,left是水平坐标,左上角是(0,0)。球是控件,任何控件都是可以自由落体的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
想买红米但没银行卡 开美宜佳便利店是加盟好还是直接转一个美宜佳店好 ...就给你一个交易号,能到美宜佳付款,请问美宜佳是怎样付款的_百度知 ... 用美宜佳代购会不会看到我买的东西 重返帝国弓弩营对诸葛连弩有加成吗 重返帝国城市风格选什么好 重返帝国城市风格选择推荐 重返帝国城市风格怎么切换 重返帝国城市如何切换风格 重返帝国城市风格大全 特色兵种及增益介绍 重返帝国特殊兵种怎么生产-特殊兵种生产攻略 重返帝国怎么训练诸葛弩 程控交换机接入,一部电话既接内线又接外线 请问使用程控电话交换机,一条电话线可以支持多少台分机同时打外线 电话程控交换机,为什么只要有一个人打外线电话,其他人就不能拨外线! 中考失利,在私立高中和复读之间要怎么选择呢,我在广州? 程控电话交换机是否能够允许多台分机同时打外线? 广州佛山有哪些较好的民办高中或者私立高中 电话交换机无法拨打外线 急!!!广州有哪些私立高中可以有钱就能读??? 公司电话突然不能拨内线却可以拨打外线,是不是程控交换机出问题了啊??? 广州城中村的私人住宅最高可以建几层? 程控电话外线打不进来 程控电话交换机,外线打不进来 广东省广州市白云区有哪些私立高中能考大学? 程控电话交换机故障不能打外线 申瓯程控交换机SOT600,个别分机拨打外线提示闭锁,权限调整之后还是打不了外线。怎么处理? 请问广州都有什么私立高中口啤比较好? 程控交换机 拨打外线要按两次“0”才能拨出去 广州私立高中什么时候开始招生 程控交换机无法拨打外线 广州市白云区有哪些私立高中有钱就可以进的 程控电话交换机,有8路外线,对外公布一部号码,现想拨打外线的时候只显示对外公布的那个号码 TCL电话交换机分机打外线如何设置 程控电话交换机外线打进来电话没有铃声也接不起来 我的电脑一直蓝屏死机 这么回事?、 江西省粮食局的局领导分工 粮食局 局长 付刚贪污是真的嘛? 一个县的副*被调到市里的粮食局当副*,级别一样,是不是相当于被放冷了? 电脑老是蓝屏死机怎么办? 电脑一直蓝屏死机怎么办? 黑龙江省粮食局原*胡东胜接受审查调查,他违反了哪些法律法规? 我的电脑经常蓝屏死机是怎么回事? 电脑经常蓝屏死机怎么办 房产合同怎么写才有效 张同钰的介绍 荆门市长和湖北省粮食局长哪个大些 九江市粮食局是九江正大饲料有限公司股东吗 合伙办公司,房产是其中一个股东的,租房合同怎么写 湖北省黄石市粮食局副局长什么级别干部 区政府办公室副主任和区粮食局局长那个权力大 ”08年“江西宜春粮食局局长是哪个啊?