HTML5ゲーム開発~Box2dWebアプリケーション(2)~衝突と各種接続

黄舟
リリース: 2017-03-02 13:58:40
オリジナル
2438 人が閲覧しました

前回はbox2dwebを使って様々な剛体を作成する方法を紹介しましたが、今回はマウスで剛体をドラッグする方法、剛体間の衝突、剛体間の様々な接続について紹介します。


1. マウスで剛体をドラッグします

lufylegend.js ライブラリを使用すると、LSprite の setBodyMouseJoint(true) メソッドを呼び出すだけで剛体をドラッグすることが非常に簡単になります。前のセクションの追加方法は次のとおりです

function add(){
	var rand = Math.random();
	if(rand < 0.33){
		cLayer = new LSprite();
		cLayer.x = 50 + Math.random()*700;
		cLayer.y = 50;
		backLayer.addChild(cLayer);
		bitmap = new LBitmap(new LBitmapData(imglist["bird1"]));
		cLayer.addChild(bitmap);
		cLayer.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);
		cLayer.setBodyMouseJoint(true);
	}else if(rand < 0.66){
		cLayer = new LSprite();
		backLayer.addChild(cLayer);
		bitmap = new LBitmap(new LBitmapData(imglist["bird2"]));
		cLayer.addChild(bitmap);
		var shapeArray = [
			[[0,54],[27,0],[54,54]]
		];
		cLayer.addBodyVertices(shapeArray,27,27,1,.5,.4,.5);
		cLayer.box2dBody.SetPosition(new LGlobal.box2d.b2Vec2((50 + Math.random()*700)/LGlobal.box2d.drawScale,50/LGlobal.box2d.drawScale));
		cLayer.setBodyMouseJoint(true);
	}else{
		cLayer = new LSprite();
		cLayer.x = 50 + Math.random()*700;
		cLayer.y = 50;
		backLayer.addChild(cLayer);
		bitmap = new LBitmap(new LBitmapData(imglist["stage01"]));
		cLayer.addChild(bitmap);
		cLayer.addBodyPolygon(bitmap.getWidth(),bitmap.getHeight(),1,5,.4,.2);
	}
}
ログイン後にコピー

ご覧のとおり、鳥を追加するときにマウスのドラッグを追加しただけです。以下はテスト接続です

http://lufy.netne.net/lufylegend-js /lufylegend-1.4/box2d/sample01/index4.html

2番目、衝突検出

以下のコードを使用して衝突検出イベントを追加します

LGlobal.box2d.setEvent(LEvent.BEGIN_CONTACT,beginContact);
ログイン後にコピー

この時の衝突は全ての剛体間の衝突であり、静的と動的を含む

ここでは便宜上、lufylegend.jsのデバッグメソッドを使用して検証します

function beginContact(contact){
	if(contact.GetFixtureA().GetBody().GetUserData().name == "bird" && 
			contact.GetFixtureB().GetBody().GetUserData().name == "bird"){
		trace("bird and bird");
	}
	trace("bird and other");
};
ログイン後にコピー

上記の方法は衝突検出で、2羽の鳥の間で衝突が発生した場合、「鳥と鳥」が出力されることを意味します。鳥が他の剛体、または他の剛体と衝突すると、「bird and other」が出力されます

テスト接続はこちらです

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/ Sample01 /index5.html

以下は実行結果です



3、剛体間のさまざまなリンク

最後に、剛体間のさまざまな接続を見てみましょう。現在、lufylegend.js ではカプセル化されておらず、将来カプセル化される予定ですが、これらの接続を手動で実装する方法を見てみましょう

1、距離リンク (b2DistanceJointDef)

b2DistanceJointDef 2 つのボディを拘束するために使用されます。それらの間の距離は次のように使用されます

function add(){
	cLayer = new LSprite();
	cLayer.name = "bird";
	cLayer.x = 50 + Math.random()*700;
	cLayer.y = 50;
	backLayer.addChild(cLayer);
	bitmap = new LBitmap(new LBitmapData(imglist["bird1"]));
	cLayer.addChild(bitmap);
	cLayer.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);
	cLayer.setBodyMouseJoint(true);
	return cLayer;
}
var bird1 = add();
var bird2 = add();
var distanceJointDef = new LGlobal.box2d.b2DistanceJointDef();
distanceJointDef.Initialize(bird1.box2dBody, bird2.box2dBody, bird1.box2dBody.GetWorldCenter(), bird2.box2dBody.GetWorldCenter());
LGlobal.box2d.world.CreateJoint(distanceJointDef);
ログイン後にコピー

テスト接続は次のとおりです

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample01/index6.html

以下が実行結果です


2、回転リンク(b2RevoluteJointDef)

b2RevoluteJointDefは2つのボディに軸を設定し、その軸を中心に2つのボディを回転させることができます

var bird = new LSprite();
	bird.name = "bird";
	bird.x = 200;
	bird.y = 200;
	backLayer.addChild(bird);
	bitmap = new LBitmap(new LBitmapData(imglist["bird1"]));
	bird.addChild(bitmap);
	bird.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,0);
	
	var pig = new LSprite();
	pig.name = "pig";
	pig.x = 200;
	pig.y = 150;
	backLayer.addChild(pig);
	bitmap = new LBitmap(new LBitmapData(imglist["pig2"]));
	pig.addChild(bitmap);
	pig.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);

	var revoluteJointDef  = new LGlobal.box2d.b2RevoluteJointDef();
	revoluteJointDef .Initialize(pig.box2dBody, bird.box2dBody, bird.box2dBody.GetWorldCenter());
	LGlobal.box2d.world.CreateJoint(revoluteJointDef );
ログイン後にコピー

テスト接続はこちらです

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample01/index7.html

以下は実行結果です


3 、プーリーリンク(b2PulleyJointDef)

b2P ulleyJointDefは同様のプーリーエフェクトで、使い方は以下の通りです

var bird = new LSprite();
	bird.name = "bird";
	bird.x = 200;
	bird.y = 200;
	backLayer.addChild(bird);
	bitmap = new LBitmap(new LBitmapData(imglist["bird1"]));
	bird.addChild(bitmap);
	bird.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);
	bird.setBodyMouseJoint(true);
	
	var bird01 = new LSprite();
	bird01.name = "bird";
	bird01.x = 400;
	bird01.y = 150;
	backLayer.addChild(bird01);
	bitmap = new LBitmap(new LBitmapData(imglist["bird1"]));
	bird01.addChild(bitmap);
	bird01.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);
	bird01.setBodyMouseJoint(true);

	var anchor1 = bird.box2dBody.GetWorldCenter();  
    var anchor2 = bird01.box2dBody.GetWorldCenter();  

    var groundAnchor1 = new LGlobal.box2d.b2Vec2(anchor1.x, anchor1.y - (100 / LGlobal.box2d.drawScale));
    var groundAnchor2 = new LGlobal.box2d.b2Vec2(anchor2.x, anchor2.y - (100 / LGlobal.box2d.drawScale));

    var ratio = 1.0;  

    var pulleyJointDef = new LGlobal.box2d.b2PulleyJointDef();  
    pulleyJointDef.Initialize(bird.box2dBody, bird01.box2dBody, groundAnchor1, groundAnchor2, anchor1, anchor2, ratio);  
    pulleyJointDef.maxLengthA = 300 / LGlobal.box2d.drawScale;  
    pulleyJointDef.maxLengthB = 300 / LGlobal.box2d.drawScale; 

    LGlobal.box2d.world.CreateJoint(pulleyJointDef);
ログイン後にコピー

テスト接続はこちら

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d /sample01/index8.html

実行結果は次のとおりです


残りの接続には、b2GearJoint、b2PrismaticJoint、b2LineJoint、b2WeldJoint およびその他のリンクが含まれます。これらは、lufylegend.js にカプセル化された後に詳細に紹介されます。詳細についてはここでは説明しません。詳しく知りたい人は関連情報を確認してください

最後に、これら 2 つのコンテンツのソース コードをすべて提供します

http://fsanguo.comoj.com/download.php?i =box2d_sample01.rar

上記はソース コードのみであることに注意してください。ソース コードをローカルで実行したい場合は、lufylegend.js ライブラリと box2dweb を自分でダウンロードして設定する必要があります


上記は、HTML5 ゲーム開発 - Box2dWeb アプリケーション (2) - 衝突とさまざまな接続、およびその他の関連コンテンツの内容です。 PHP 中国語 Web サイト (www.php.cn) にご注意ください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート