box2d的角色邹形
demo : http://www.emanueleferonato.com/downloads/box2dplat3.swf
demo控制 左右键是左右移动 上方向键是起跳
下面是源码 :
box2d是的角色邹形 能跳 能移动 能发射东西
/*
知识补漏:
world其本质也是个body, 即所有b2Body对象的parent 。CreateBody() 等一些Create , Create就相当于flash player里的 add , CreateBody() CreateShape() 就相当于flash player里的 addChild()
ground_sensor.SetAsOrientedBox(10/pixels_in_a_meter,5/pixels_in_a_meter,new b2Vec2(0,27/pixels_in_a_meter), 0);
后面的坐标new b2Vec2(0,27/pixels_in_a_meter)其原点是body的中心(即以body的中心为原点),而不是以world中的原点为原点,
(总结:以body的中心为原点,向右向下为xy轴的正方向)
GetWorldCenter得到是整个body的中心,GetLocalCenter得到是SetAsBox() 这个组成的对象的中心
下面增加了b2ContactListene类进行了侦听 ,并对其进行了重写..
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import General.Input;
import flash.events.MouseEvent;
public class HelloWorld extends Sprite {
public var m_world:b2World;
public var pixels_in_a_meter:int=30;
public var bodyDef:b2BodyDef;
public var boxDef:b2PolygonDef;
public var m_input:Input;
public var xspeed:int=0;
public var bazooka:zooka=new zooka();
public var bazooka_angle:Number;
public var m_contactListener=new b2ContactListener();
var body:b2Body;
public function HelloWorld() {
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2=new b2Vec2(0.0,10.0);
var doSleep:Boolean=true;
m_world=new b2World(worldAABB,gravity,doSleep);
var m_sprite:Sprite;
m_sprite = new Sprite();
addChild(m_sprite);
var dbgDraw:b2DebugDraw = new b2DebugDraw();
var dbgSprite:Sprite = new Sprite();
m_sprite.addChild(dbgSprite);
dbgDraw.m_sprite=m_sprite;
dbgDraw.m_drawScale=30;
dbgDraw.m_alpha=1;
dbgDraw.m_fillAlpha=0.5;
dbgDraw.m_lineThickness=1;
dbgDraw.m_drawFlags=b2DebugDraw.e_shapeBit;
m_world.SetDebugDraw(dbgDraw);
var bodyDef:b2BodyDef;
var boxDef:b2PolygonDef;
var circleDef:b2CircleDef;
square_tile(250,395,500,10);
hero(100,370,20,40);
//
// adding the contact listener
m_world.SetContactListener(m_contactListener);
//
// Box2D input class - why should I bother making my one?
m_sprite = new Sprite();
addChild(m_sprite);
// input
m_input=new Input(m_sprite);
addChild(bazooka);
stage.addEventListener(MouseEvent.CLICK, shoot);
}
public function shoot(event:Event) {
bodyDef = new b2BodyDef();
bodyDef.position.Set((bazooka.x+(bazooka.width+3)*Math.cos(bazooka_angle))/pixels_in_a_meter, (bazooka.y+(bazooka.width+3)*Math.sin(bazooka_angle))/pixels_in_a_meter);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(10/pixels_in_a_meter,10/pixels_in_a_meter);
boxDef.friction=0.3;
boxDef.density=1;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
body.ApplyImpulse(new b2Vec2(Math.cos(bazooka_angle)*4, Math.sin(bazooka_angle)*4),body.GetWorldCenter());
}
public function square_tile(px:int,py:int,w:int,h:int) {
bodyDef = new b2BodyDef();
bodyDef.position.Set(px/pixels_in_a_meter, py/pixels_in_a_meter);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(real_pixels(w), real_pixels(h));
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
}
public function hero(px:int, py:int, w:int, h:int) {
bodyDef = new b2BodyDef();
bodyDef.position.Set(px/pixels_in_a_meter, py/pixels_in_a_meter);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(real_pixels(w), real_pixels(h));
boxDef.density=1.0;
boxDef.friction=0.3;
boxDef.restitution=0.2;
bodyDef.userData = new Sprite();
bodyDef.userData.name="Player";
body=m_world.CreateBody(bodyDef);
body.SetBullet(true);
body.CreateShape(boxDef);
//
var ground_sensor:b2PolygonDef = new b2PolygonDef();
ground_sensor.isSensor=true;
ground_sensor.userData="groundsensor";
ground_sensor.SetAsOrientedBox(10/pixels_in_a_meter,5/pixels_in_a_meter,new b2Vec2(0,27/pixels_in_a_meter), 0);//后面的坐标new b2Vec2(0,27/pixels_in_a_meter)其原点是body的中心(即以body的中心为原点),而不是以world中的原点为原点,(总结:以body的中心为原点,向右向下为xy轴的正方向)
body.CreateShape(ground_sensor);
//
body.SetMassFromShapes();
}
public function real_pixels(n:int) {
return (n/pixels_in_a_meter/2);
}
public function Update(e:Event):void {
m_world.Step(1/30, 10);
xspeed=0;
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
if (bb.GetUserData()!=null) {
if (Input.isKeyDown(39)) { // right arrow
xspeed=3;
} else if (Input.isKeyDown(37)) { // left arrow
xspeed=-3;
}
if (Input.isKeyDown(38)) {// up arrow
if (m_contactListener.can_jump()) { // checking if the hero can jump
bb.ApplyImpulse(new b2Vec2(0.0, -1.0), bb.GetWorldCenter());//这里用bb.GetWorldCenter(),而不用bb.GetLocalCenter()因为用GetLocalCenter容易引起bug
}
}
if (xspeed) {
bb.WakeUp();
bb.m_linearVelocity.x=xspeed;
}
bb.m_sweep.a=0;
bazooka.x=bb.m_userData.x=bb.GetPosition().x*30;
bazooka.y=bb.m_userData.y=bb.GetPosition().y*30;
var dist_x=bazooka.x-mouseX;
var dist_y=bazooka.y-mouseY;
bazooka_angle=Math.atan2(- dist_y,- dist_x);
bazooka.rotation=bazooka_angle*57.2957795;
}
}
Input.update();
}
}
}
b2ContactListener类的重写:
/*
* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
package Box2D.Dynamics{
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Contacts.*;
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;
/// Implement this class to get collision results. You can use these results for
/// things like sounds and game logic. You can also get contact results by
/// traversing the contact lists after the time step. However, you might miss
/// some contacts because continuous physics leads to sub-stepping.
/// Additionally you may receive multiple callbacks for the same contact in a
/// single time step.
/// You should strive to make your callbacks efficient because there may be
/// many callbacks per time step.
/// @warning The contact separation is the last computed value.
/// @warning You cannot create/destroy Box2D entities inside these callbacks.
public class b2ContactListener {
var canjump:Boolean=false;
/// Called when a contact point is added. This includes the geometry
/// and the forces.
public function can_jump() {
return (canjump);
}
public virtual function Add(point:b2ContactPoint):void {}
/// Called when a contact point persists. This includes the geometry
/// and the forces.
//点持续接触时
public virtual function Persist(point:b2ContactPoint):void {
if (point.shape1.GetUserData()=="groundsensor"||point.shape2.GetUserData()=="groundsensor") {
canjump=true;
}
}
/// Called when a contact point is removed. This includes the last
/// computed geometry and forces.
public virtual function Remove(point:b2ContactPoint):void {
if (point.shape1.GetUserData()=="groundsensor"||point.shape2.GetUserData()=="groundsensor") {
canjump=false;
}
}
/// Called after a contact point is solved.
public virtual function Result(point:b2ContactResult):void {
}
}
}
box2d的角色邹形相关推荐
- BTC 缓步推升,BCH 再拔头筹
BTC 在重上万元大关之后,今日再次攻克三十日均线重要关口,短线缓步推升,走势趋强.冷风观点不变,短线反弹.中线震荡.长线看涨.短线上涨的主要原因是资金避险情绪所至.美国一方面不断挥舞关税大棒与中国大 ...
- 对产品经理而言,有一种灾难叫“老板说”
本文有PMCAFF 原创作者 Andy-pm 原创发布于pmcaff.com 最近看到社区大家都在说"老板说"现象,那么作为一个产品经理如何正确的和老板进行沟通,来应对" ...
- ERP云端争霸 甲骨文和SAP打对攻 金蝶忙转身用友原地等待
早些年大家都亲切将云计算称之为"晕计算",就像北京的雾霾一样,总给人一种阴魂不散却似雾非雾的感觉,每次圈内好友聚会不聊上十块钱云计算的事儿,你都没脸说自已是业内人士,也正因为此,我 ...
- 物联网的背景及其发展
物联网(The Internet of things)的概念是在1999年提出的,它的定义很简单:把所有物品通过射频识别等信息传感设备与互联网连接起来,实现智能化识别和管理.国际电信联盟2005年一份 ...
- 阿里高级专家:我对技术架构的理解
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- 物联网技术的最新发展状况及应用探析
在现实生活中已可见物联网的具体应用,如远程防盗.高速公路不停车收费.智能图书馆.远程电力抄表等,只不过这些仅是物联网技术的邹形,还尚未形成一个庞大的网络.物联网固然给我们构建了一个十分美好的蓝图,在未 ...
- 在中间层 .NET 应用程序中通过授权管理器使用基于角色的安全
基于角色的安全是从 Windows NT 的第一个版本开始在 Windows 平台上发展而来的.使用角色,操作系统可以通过检查称为 BUILTIN\Administrators 的组的安全上下文做出一 ...
- 战龙四驱java_《战龙四驱》中都有哪些经典角色
<战龙四驱>中都有哪些经典角色 剧情主要描述少年迷你四驱车天才韦天飞夺得了全国迷你四驱车大赛的冠军,间接导致同是迷你四驱车研发专家的父亲韦超和合作伙伴霍震二人的决裂,导致了一场火灾由此引起 ...
- 美术干货:用Blender绘制low poly风格的游戏角色
"low poly"(低面建模)因其独特的美术风格和相对不错的性价比成为一些游戏的首选,不过作为一种普及范围不算很广的建模手法,其具体的操作流程可能还不为人熟知. 笔者找到了一份用 ...
最新文章
- node--CommonJS
- 使用Angular HTTP client对数据模型进行创建操作
- Windows 10的下一个更新将在您观看视频时隐藏通知
- 工作314:uni-提交成功加入表单验证
- 优化小技巧——复杂属性对象的read模式
- 名企程序员被裁实录:早上还在改 Bug,晚上就成下岗工
- html 自动滚动到底部,Javascript实现DIV滚动自动滚动到底部的代码
- django Form 效验
- C++中algorithm头文件中一些函数使用记录
- Springboot定时任务配置及遇到的问题
- VMware虚拟机装系统出现Units specified dont exist
- Web安全之攻击验证机制
- 注解以及Java中常用注解使用
- win10任务栏图标两个以上不显示缩略图且不显示桌面预览解决方案
- 2.配置文件 setting.py
- 如何理解ifconfig中的errors/dropped/fifo/frame统计指标
- TensorFlow技术内幕(八):模型优化之XLA(下)
- ios 应用特殊节日页面整体变灰
- 红帽linux7连不上网,redhat7最小化安装后网络的配置
- OpenWRT 添加第三方库