2017-02-18 60 views
2

Java中的代码(Android Studio)libgdx,...当你点击/触摸时如何计算圆的弹丸(像一个球)屏幕,你会如何显示它? 像射击一个篮球 ....例如圆是在0,0(x,y)与50度角... 感谢!Java中的代码(Android Studio)libgdx,如何计算弹丸

I want like this

+0

问题不明确。发布和图像示例,并添加一些你已经尝试过的代码。 – JonZarate

+0

欢迎来到Stack Overflow!请参考[游览](http://stackoverflow.com/tour),环顾四周,阅读[帮助中心](http://stackoverflow.com/help),特别是[我该如何问一个好问题?](http://stackoverflow.com/help/how-to-ask)和[我可以问什么问题?](http://stackoverflow.com/help/on-topic)。 –

+0

你使用box2d吗? – Aryan

回答

1

如果您使用的Box2D然后抛运动是由您的Box2D引擎处理。你只需要应用线速度。

float speed,angle; 

Vector2 startingVelocity =new Vector2(speed,speed); 
startingVelocity.rotate((float) angle - 45); 

body.setLinearVelocity(startingVelocity); 

速度和角度由您提供。

如果你不使用box2d,那么你需要像这样处理你的球的位置和速度。

public class TestGame extends Game implements InputProcessor{ 

    SpriteBatch spriteBatch; 
    Sprite ball; 
    Texture ballTex; 
    boolean isFired; 

    Vector2 gravity; 
    private float throwAngle=50; 
    private float deltaTime=2; 
    private Vector2 initialVelocity; 

    @Override 
    public void create() { 

     spriteBatch=new SpriteBatch(); 
     ballTex=new Texture("image/ball.png"); 
     ball=new Sprite(ballTex); 
     ball.setSize(50,50); 
     ball.setPosition(0,0); 

     Gdx.input.setInputProcessor(this); 
     gravity=new Vector2(0, -Gdx.graphics.getHeight()*.05f); 
     float throwVelocity=Gdx.graphics.getWidth()*.3f; 
     initialVelocity=new Vector2((float)(throwVelocity*Math.sin(throwAngle * Math.PI/180)),(float)(throwVelocity*Math.cos(throwAngle * Math.PI/180))); 
    } 

    @Override 
    public void render() { 
     super.render(); 

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

     updateBall(); 

     spriteBatch.begin(); 
     ball.draw(spriteBatch); 
     spriteBatch.end(); 
    } 

    private void updateBall(){ 

     if(isFired){ 

      float delta=Gdx.graphics.getDeltaTime(); 
      initialVelocity.x=initialVelocity.x+gravity.x*delta*deltaTime; 
      initialVelocity.y=initialVelocity.y+gravity.y*delta*deltaTime; 

      ball.setPosition(ball.getX()+initialVelocity.x * delta * deltaTime,ball.getY()+initialVelocity.y * delta * deltaTime); 
     } 

    } 

    @Override 
    public void resize(int width, int height) { 
     super.resize(width, height); 
    } 

    @Override 
    public void dispose() { 
     super.dispose(); 
     ballTex.dispose(); 
     spriteBatch.dispose(); 
    } 

    @Override 
    public boolean keyDown(int keycode) { 

     return false; 
    } 

    @Override 
    public boolean keyUp(int keycode) { 
     return false; 
    } 

    @Override 
    public boolean keyTyped(char character) { 
     return false; 
    } 

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

     isFired=true; 
     return false; 
    } 

    @Override 
    public boolean touchUp(int screenX, int screenY, int pointer, int button) { 
     return false; 
    } 

    @Override 
    public boolean touchDragged(int screenX, int screenY, int pointer) { 
     return false; 
    } 

    @Override 
    public boolean mouseMoved(int screenX, int screenY) { 
     return false; 
    } 

    @Override 
    public boolean scrolled(int amount) { 
     return false; 
    } 
} 
+0

非常感谢你,非常感谢。 –