タッチを使用してスプライトでボディをドラッグ アンド ドロップしたい。スプライトをドラッグ アンド ドロップする方法は知っていますが、体を動かそうとすると... 動作せず、体が動かなくなります。さらに、体に触れるとアプリ全体がクラッシュすることがあります :x 指の移動中に他の体と衝突する物理体をドラッグ アンド ドロップする方法を教えてください。私は3日間探していて、落ち込んでいます:[
私は 3 つの同様のボディを作成しました。1 つは動的 (ホッケー ゲームのようなボールの跳ね返りのシミュレーション) で、そのうちの 2 つはキネマティック (プレイヤーが動かすことができます) です。動かしたいカラダの宣言をお見せします。表示するためにコードが必要かどうかはわかりませんが、非常に悪いチュートリアルにあるいくつかのインターフェイスを実装しました。:s
public class MainActivity extends SimpleBaseGameActivity implements IOnSceneTouchListener, IOnAreaTouchListener
宣言:
//Declaration:
final Sprite face = new Sprite(CAMERA_WIDTH/2+200f, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager()) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
this.setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY() - this.getHeight() / 2);
return true;
}
};
final FixtureDef MyFixtureDef = PhysicsFactory.createFixtureDef(0.2f,0.4f,0.6f);
this.scene.registerUpdateHandler(this.mPhysicsWorld);
face.setScale(3);
体:
final Body facebody = PhysicsFactory.createCircleBody(
this.mPhysicsWorld, face, BodyType.KinematicBody,
CIRCLE_FIXTURE_DEF);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face,
facebody, true, true));
facebody.setUserData("player1");
方法:
マウスジョイントをやってみた
public MouseJoint createMouseJoint(IAreaShape face, float x, float y) {
final Body boxBody = this.mPhysicsWorld.getPhysicsConnectorManager()
.findBodyByShape(face);
Vector2 v = boxBody.getWorldPoint(new Vector2(x / 32, y / 32));
MouseJointDef mjd = new MouseJointDef();
// mjd.bodyA = ballbody;
mjd.bodyB = boxBody;
mjd.dampingRatio = 0.2f;
mjd.frequencyHz = 30;
mjd.maxForce = (float) (200.0f * boxBody.getMass());
mjd.collideConnected = true;
mjd.target.set(v);
return (MouseJoint) this.mPhysicsWorld.createJoint(mjd);
}
onAreaTouched も?
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
if(pSceneTouchEvent.isActionDown()) {
final IAreaShape face = (IAreaShape) pTouchArea;
if(this.mMouseJointActive == null) {
//this.mEngine.vibrate(100);
this.mMouseJointActive = this.createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY);
}
return true;
}
return false;
}
ここでただ推測する
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
// TODO Auto-generated method stub
if(pSceneTouchEvent.isActionDown()) {
Debug.d("here!");
return true;
}
return false;
}
}
クラスに関する質問:
MainActivity 内でクラス player を宣言すると、次のようになります。
class Player {
final Body facebody;
final Sprite face = new Sprite(MainActivity.CAMERA_WIDTH / 2+200f,240, MainActivity.mFaceTextureRegion ,getVertexBufferObjectManager()) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
switch (pSceneTouchEvent.getAction()) {
case TouchEvent.ACTION_MOVE:
// Here 'body' refers to the Body object associated with
// this sprite
facebody.setTransform(pSceneTouchEvent.getX(),
pSceneTouchEvent.getY(), facebody.getAngle());
break;
default:
break;
}
return true;
}
};
Player(Body f) {
facebody = f;
}
}
すべてが完璧ですが、player.face
この宣言では OnCreateScene で宣言できないと叫びます。
final Player player= new Player( PhysicsFactory.createCircleBody( this.mPhysicsWorld, player.face, BodyType.KinematicBody,CIRCLE_FIXTURE_DEF));
これをどのように解決しますか?