2017-04-30 2 views
1

box2d로 오른쪽/왼쪽으로 움직이는 플랫폼을 만들고 싶습니다. 그러나 어떻게 해야할지 모르겠습니다. movingPlatform을 만드는 방법은 무엇입니까?

나는이 내가 "양동이"플랫폼을 구축하는 방법이다 플랫폼 몸을 만들고 그에게 KinematicType을주고, setLinearVelocity로 이동하려고하지만

도움이되지 않습니다

package com.niceboy.game.Objects; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.physics.box2d.World; 

import java.util.Random; 

import static com.niceboy.game.Constants.PLATFORM_MARGIN; 
import static com.niceboy.game.Constants.PPM; 

public class Bucket { 
    private Random rand = new Random(); 

    private World world; 
    private Body body; 

    public Bucket(World world){ 
     this.world = world; 
    } 

    public void createBucket(int y){ 
     BodyDef bdef = new BodyDef();  
     bdef.position.set(rand.nextInt(Gdx.graphics.getWidth())/PPM,PLATFORM_MARGIN/PPM*y); 
     bdef.type = BodyDef.BodyType.KinematicBody; 

     body = world.createBody(bdef); 

     PolygonShape box = new PolygonShape(); 
     box.setAsBox(50/PPM,20/PPM); 
     FixtureDef fdef = new FixtureDef(); 
     fdef.shape = box; 

     body.createFixture(fdef).setUserData("bucket"); 
    } 

    public void repos(int y){ 
    body.getPosition().set(rand.nextInt(Gdx.graphics.getWidth())/PPM,PLATFORM_MARGIN/PPM*y); 
    } 
} 

그러나 Idon't는 // 내가 만든 두 번째

당 KinematicBody 몸을 마우스 오른쪽 단추로 1 개 단위를 이동하고 그에게주고 그것을

+0

코드를 표시하십시오. – javaLover

+0

..... ok ........ –

답변

1

kinematicBody->setLinearVelocity(1,0);를 이동하는 방법을 알고 PolygonShape 당신이 방향을 바꾸고 싶을 때 몸 선회 운동보다는 선형 속도를 적용하십시오. 반대 방향으로 움직이기 시작하도록 음의 크기로 같은 속도를 적용하십시오.

public class MainGame extends InputAdapter implements ApplicationListener { 

    private SpriteBatch batch; 
    private ExtendViewport extendViewport; 
    private OrthographicCamera cam; 

    private float w=20; 
    private float h=22; 

    private World world; 
    private Box2DDebugRenderer debugRenderer; 

    private Array<Body> array; 
    private Vector3 vector3; 
    private Body platform; 
    Vector2 vector2; 
    boolean isLeft; 

    @Override 
    public void create() { 

     vector2=new Vector2(); 
     isLeft=true; 
     cam=new OrthographicCamera(); 
     extendViewport=new ExtendViewport(w,h,cam); 

     batch =new SpriteBatch(); 
     Gdx.input.setInputProcessor(this); 

     world=new World(new Vector2(0,-9.8f),true); 
     array=new Array<Body>(); 
     debugRenderer=new Box2DDebugRenderer(); 
     vector3=new Vector3(); 

     BodyDef bodyDef=new BodyDef(); 
     bodyDef.type= BodyDef.BodyType.KinematicBody; 
     bodyDef.position.set(0,0); 
     platform=world.createBody(bodyDef); 

     PolygonShape polygonShape=new PolygonShape(); 
     polygonShape.setAsBox(3,1); 

     FixtureDef fixtureDef=new FixtureDef(); 
     fixtureDef.shape=polygonShape; 
     fixtureDef.restitution=.5f; 
     platform.createFixture(fixtureDef); 
     polygonShape.dispose(); 
     platfrom.setLinearVelocity(1,0); 
    } 

    @Override 
    public void render() { 

     Gdx.gl.glClearColor(0,1,1,1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     world.step(1/60f,6,2); 
     batch.setProjectionMatrix(cam.combined); 
     batch.begin(); 

     world.getBodies(array); 
     for (Body body:array){ 
      if(body.getUserData()!=null) { 
       Sprite sprite = (Sprite) body.getUserData(); 
       sprite.setPosition(body.getPosition().x-sprite.getWidth()/2, body.getPosition().y-sprite.getHeight()/2); 
       sprite.setRotation(body.getAngle()*MathUtils.radDeg); 
       sprite.draw(batch); 
      } 
     } 
     batch.end(); 
     debugRenderer.render(world,cam.combined); 


     Vector2 pos=platfrom.getTransform().getPosition(); 
     if(pos.x>20-3) { 
      platfrom.setLinearVelocity(-1,0); 
     } 
     if(pos.x<3) { 
      platfrom.setLinearVelocity(1,0); 
     } 

    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void resize(int width, int height) { 

     extendViewport.update(width,height); 
     cam.position.x = w /2; 
     cam.position.y = h/2; 
     cam.update(); 
    } 

    private void createPhysicsObject(float x,float y){ 

     float sizeX=0.5f,sizeY=0.5f; 
     BodyDef bodyDef=new BodyDef(); 
     bodyDef.position.set(x,y); 
     bodyDef.type= BodyDef.BodyType.DynamicBody; 

     Body body=world.createBody(bodyDef); 

     PolygonShape polygonShape=new PolygonShape(); 
     polygonShape.setAsBox(sizeX,sizeY); 
     FixtureDef fixtureDef=new FixtureDef(); 
     fixtureDef.shape=polygonShape; 
     fixtureDef.restitution=.2f; 
     fixtureDef.density=2; 

     body.createFixture(fixtureDef); 
     body.setFixedRotation(false); 
     polygonShape.dispose(); 

     Sprite sprite=new Sprite(new Texture("badlogic.jpg")); 
     sprite.setSize(2*sizeX,2*sizeY); 
     sprite.setPosition(x-sprite.getWidth()/2,y-sprite.getHeight()/2); 
     sprite.setOrigin(sizeX,sizeY); 

     body.setUserData(sprite); 
    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
     debugRenderer.dispose(); 
     world.dispose(); 
    } 

    @Override 
    public boolean touchDown(int screenX, int screenY, int pointer, int button) { 

     vector3.set(screenX,screenY,0); 
     Vector3 position=cam.unproject(vector3); 
     createPhysicsObject(vector3.x,vector3.y); 

     return false; 
    } 
} 
+1

다시 한번 감사드립니다 :) –

+0

오 :(그 작동하지만, 그의 pox.x <0 때 그는 진동처럼 움직입니다 (자신의 디렉토리 또는 방향을 변경하지 마십시오) :) 내 영어에 대한 슬픈 :) –

+0

왜'setLinearVelocity' 대신'setTransform'을 시도하지 마십시오. 또한 게임의 적절한 상태 (어느 방향으로 움직이는 지)를 유지하는 것이 좋습니다. 나는 앞으로 나아갈 방향을 제시한다. – Aryan

관련 문제