2012-01-08 6 views
2

以下のコードを使ってスクロールします Surfaceviewスレッドとオフキャンバステクスチャビットマップが生成(変更)され、最初の行(行)、フレームごとに1つの位置)を通常のサーフェイスビューのビットマップにスクロールしてスクロールしてから、その上に他のものを描き続けます。それは私が本当に欲しいものですが、オフスクリーンビットマップのために別のキャンバスを作成していても動作させることはできません。それはまったくスクロールしていないだけです。スクリーンメモリのビットマップをスクロールする方法

他の言葉私はメモリビットマップ、サーフェイスビューキャンバスと同じサイズを持っています。これは、フレームごとに1行下にスクロール(シフト)し、次にトップラインを新しいランダムテクスチャに置き換えてから、通常のサーフェイスビューキャンバス。

ここで私はうまくいくと思います。今、私のゲームトンネルを実行し、https://market.android.com/details?id=com.zubima.TunnelRunについて

@Override 
public void run() { 
    while (running) {  
    c = null; 
try { 
    // Lock canvas for drawing 
    c = myHolder.lockCanvas(null);     

    synchronized (mSurfaceHolder) { 
     // Scroll down off screen canvas and hopefully underlying bitmap bitmap 
     Rect src = new Rect(0, 0, intSurfaceWidth, intSurfaceHeight - 1); 
     Rect dst = new Rect(0, 1, intSurfaceWidth, intSurfaceHeight); 
     memCanvas.drawBitmap(memBitmap, src, dst, null); 

     // Note scrolling up like this works fine 
     // Rect src = new Rect(0, 1, intSurfaceWidth, intSurfaceHeight + 1); 
     // Rect dst = new Rect(0, 0, intSurfaceWidth, intSurfaceHeight); 
     // memCanvas.drawBitmap(memBitmap, src, dst, null); 

     // Create random one line(row) texture bitmap 
     textureBitmap = Bitmap.createBitmap(imgTexture, 0, rnd.nextInt(intTextureImageHeight), intSurfaceWidth, 1); 

     // Now add this texture bitmap to top of screen canvas and hopefully underlying bitmap 
     memCanvas.drawBitmap(textureBitmap, 
       intSurfaceWidth, 0, null); 

     // Draw above updated off screen bitmap to regular canvas, at least I thought it would update (save changes) shifting down and add the texture line to off screen bitmap the off screen canvas was pointing to. 
     c.drawBitmap(memBitmap, 0, 0, null); 

     // Other drawing to canvas comes here 


    } finally { 
     // do this in a finally so that if an exception is thrown 
     // during the above, we don't leave the Surface in an 
     // inconsistent state 
     if (c != null) { 
      myHolder.unlockCanvasAndPost(c); 
     } 
    } 
}  
} 

:のみ不可欠真ん中を示す実行中の一部を

@Override 
    public void surfaceCreated(SurfaceHolder holder) { 
    intSurfaceWidth = mSurfaceView.getWidth(); 
    intSurfaceHeight = mSurfaceView.getHeight(); 

    memBitmap = Bitmap.createBitmap(intSurfaceWidth, intSurfaceHeight, 
      Bitmap.Config.ARGB_8888); 
    memCanvas = new Canvas(memCanvas); 

    myThread = new MyThread(holder, this); 
    myThread.setRunning(true); 
    blnPause = false; 
    myThread.start(); 
} 

マイスレッド、:私はビットマップとキャンバスを指定し、スレッドを開始

マイsurfaceChanged私は代わりにビットマップの配列、表面の高さのサイズ、ランダムなテクスチャを設定した後、各フレームのループで下にシフトする作業ソリューションを持っています。私は毎秒50フレームを取得しますが、代わりにビットマップをスクロールしてよりうまくいくと思います。

+0

完全なオフトピックですが、市場のアプリの説明はフルテキスト、段落なし、何もない...あなたはそれを構造化する必要があります!最初の考えは:tldr – WarrenFaith

+0

良い提案、段落を追加しました。これはテキストのみのフィールドです。イメージを追加することはできません。 – DKDiveDude

+0

本当ですが、あなたのテキストフォーマットはかなり醜いものでした。私は完全な "使用方法/演奏方法"ガイドを説明書には欲しくない。広告テキストのような感じがします。リストにいくつかのクールな機能を要約し、読者があなたのゲームに興味を持ってもらうようにします。 – WarrenFaith

答えて

0

drawBitmap機能は、次のシグネチャとキャンバスの中にあります:

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint); 

あなたのDSTキャンバスの大きさにすることができ、そして、あなたのsrcは新しい

Rect(0,offset,width,height+offset) 
ように設定することができます

その後、フレームごとにオフセットをインクリメントして、スムーズにスクロールするビットマップをビューで取得できます。

+0

ご意見ありがとうございます。私はすでにそれを試していましたが、上記のコードの変更はここには当てはまりませんが、基本的にはビットマップを間違った方法でスクロールし、-1にオフセットしてもスクロールダウンしません。 – DKDiveDude

+0

あなたの例では、送信元と送信先は逆であってもよい。ソースはあなたが見ているビットマップの領域で、デスティネーションはディスプレイ上の領域です。 また、スクロールするコードは何ですか? – nmjohn

+0

私は追加されたコメントを混乱させるかもしれないと理解していますので、元のコードを修正して追加を取り除いてください – DKDiveDude

1

自分自身の上にビットマップを描画しようとしていますが、これはAndroid AFAIKでは一度も動作しませんでした。私は最初のゲーム、Mole Minerと呼ばれるサイド・スクローラーでこの正確な穴に落ちた。

問題は非常に簡単です:drawBitmap()は、本質的に、バイトが常にアドレス指定される特別な種類のmemcpy()です。は、を転送します。これはうまくいき、L1キャッシュを最適に使用していますが、ソースと宛先の領域(a)が重複していれば、明らかに問題が発生します(b)ソースアドレス< destアドレス。

(memcpyを()、ところで、この可能性をチェックし、必要に応じて逆方向のコピーを行うの実実装は。Canvas.drawBitmap()これを行いません。)

私はほくろマイナーに使用する回避策を2つのオフスクリーンビットマップを持ち、フレーム間で切り替えることでした。しかし、それは2009年であり、今日は私はたぶんスクロールを全く使わないでしょう。

+0

それはバグ/悪い実装だと思った。私は2つのオフスクリーンビットマップを試し、後でそれらの間で切り替えるでしょう。もしうまくいけば、私はあなたの答えに感謝します、ありがとう! – DKDiveDude

+0

一方向(下向き)にしかスクロールしない場合は、これを変更して、ビットマップを上下逆に描画して*上にスクロール*することができます。 dest

+0

おそらく私はこれを正しく可視化できませんが、それはうまくいかないようです。私のゲームのトンネルは時間の経過とともに幅が減少しています。トンネルが下から上の幅の最大幅から逆のVになる1つの画面で、スクロールダウンすると、これを完全にアニメートすると想像してください。ビットマップをミラーリングして再び1つの画面トンネルで最大幅から最小幅に移動すると、新しいビットマップマテリアル(線)が一番下に表示されてスクロールアップされ、そのアニメーションが完全にオフになります。私が間違っているなら、私を修正してください、ありがとう! – DKDiveDude

関連する問題