2017-01-08 4 views
0

私はLibgdxで簡単なゲームを作っています。問題は、デスクトップ上でコードは正常に動作しますが、Androidでは動作しないことです(Galaxy S6)。 ゲームでは、デバイスの中心を中心に指で回転します(幅/ 2、高さ/ 2)。あなたが表示されている円を回転させるユーザーの入力はAndroid上でデスクトップと同じように動作します

touchpoint.set(Gdx.input.getX(),Gdx.input.getY()); 
speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Touchpunkt Gradzahl zur Mitte 

この計算された天使と:あなたは触れポイントが認識されており、このタッチポイントと中心との間の角度が計算され、speicher1に保存されます(それは常に0〜360です)画面上。これらはすべて両方でうまく動作します(デスクトップ、Android)。たとえば、指を180°に置くと、円は即座にこの点まで回転します。しかし、それは私が欲しいものではありません。あなたが指を動かすときだけそれは回転するはずです。ですから、どこに触れてもサークルは回転しません。ドラッグを開始したときだけです。うまくいけば私はあなたにこれを明らかにすることができました:D。 は、私は、このためのソリューションを作っ:

touchpoint.set(Gdx.input.getX(),Gdx.input.getY()); 
    speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Toucpunkt Gradzahl zur Mitte 

    if (Gdx.input.justTouched()) { 
     speicher2 = 360-(speicher1 - kcc.getCcdegreee()); 
    } 
    speicher1 = speicher1 + speicher2; 
    while (speicher1 >= 360) { 
     speicher1 -= 360; 
    } 
    kcc.setCcdegreee(speicher1); 

[KCCは、サークルのすべての情報が(テクスチャ、サイズ、位置、角度(Ccdegree))に保存されている私のクラスである]

私はこの問題を解決しjustTouchedメソッドを使用して、このポイントを「開始ポイント」として作成しました。今問題が出てきますが、それはデスクトップでうまくいきますが、Androidではうまくいきませんか?

コード全体:

public void render(SpriteBatch sb, SpriteBatch textsb) { 
    //Wenn getouched(gedreht wurde) 
    if (Gdx.input.isTouched()) { 
     handleInput(); 
    } 

    sb.begin(); 
    //COLORCIRCLE 
    sb.draw(kcc.getCc(),kcc.getCcposition().x,kcc.getCcposition().y,kcc.getCcwidth()/2,kcc.getCcwidth()/2,kcc.getCcwidth(),kcc.getCcheight(),1,1,-kcc.getCcdegreee(),true); 
    sb.end(); 
} 

[ディスプレイがタッチされた場合、私は見つけるRenderメソッドを算出天使と画面上に円を描画]

ハンドル入力方式:

protected void handleInput() { 
    touchpoint.set(Gdx.input.getX(),Gdx.input.getY()); 
    speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Toucpunkt Gradzahl zur Mitte 
    if (Gdx.input.justTouched()) { 
     speicher2 = 360-(speicher1 - kcc.getCcdegreee()); 
    } 
    speicher1 = speicher1 + speicher2; 
    while (speicher1 >= 360) { 
     speicher1 -= 360; 
    } 
    kcc.setCcdegreee(speicher1); 
} 

私が言ったように、すべてがデスクトップ上では完全に動作しますが、Androidでは動作しません。私は誰かがこれのための解決策を持っていること、または自分の間違いを見つけることを望む。

答えて

0

タッチポイントを直接ポーリングしないで、justTouched()とそのすべてのものを処理し、代わりにInputProcessorまたはGestureListenerを使用することを強くお勧めします。

これは、イベントベースの入力を提供します。これは、はるかに柔軟性が高く、実装が簡単です。

オプション1:あなたは、このインターフェイスを実装する場合InputProcessor

、あなたは実際にちょうど

public boolean touchDown (int x, int y, int pointer, int button) { 
     return false; 
    } 

    public boolean touchUp (int x, int y, int pointer, int button) { 
     return false; 
    } 

    public boolean touchDragged (int x, int y, int pointer) { 
     return false; 
    } 

メソッドを使用する必要があります。 touchDownでは、タッチダウンイベントの位置を保存するだけで済みます。 onDragged()では、回転した角度を計算します。 onDragged()は通常(通常は各フレーム)ドラッグすると非常に頻繁に呼び出されるため、ウィンドウ中心のサークルを回転させるために使用できる非常に小さなデルタ角度で終了します。

オプション2:GestureListener

でもより便利なこの1つは、すでにあなたがフレームごとデルタ角度を計算するために必要なすべてを与え、最後の位置にデルタを含んでいるので、それは、GestureListenerとなります。私は、それは明らかにあなたのロジックを簡素化し、コードがはるかに読みやすく、保守性行う必要があります...それが役に立てば幸い:)

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.GestureListener.html#pan-float-float-float-float-

関連する問題