問題タブ [surfaceview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - AndEngine & SurfaceView (CameraPreview)
AndEngine (Physics Example) の BaseGameActivity の背景としてカメラ プレビューを表示する SurfaceView を追加するにはどうすればよいですか。
android - 別のアクティビティがフォーカスされた後に SurfaceView に戻る
LunarLander API デモを使用して、Android 用の RPG に取り組んでいます。私はすでにこのデモを使用してゲームを作成しているので (Porcupine Assassin、チェックしてみてください!)、Canvas クラスとその性質についてよく理解しています。
私の問題は、RPG ではインベントリや統計などにアクセスする方法が必要なことです。そのため、Inventory.java クラスを開始するように [戻る] ボタンを設定しました。インベントリ アクティビティを終了()してゲーム (SurfaceView) に戻ろうとすると、問題が発生します。
これは SurfaceCreated() コールバックです。
「IllegalThreadStateException: thread already started」が原因で FC が発生していたので、SurfaceCreated() コールバックに try/catch を入れました。try/catch では FC は発生しませんが、黒い画面に戻ります。
try/catch を取り出して、最初にチェックを追加してみました: if(!thread.isAlive())。そうすれば、スレッドがすでに開始されている場合、何もしません。奇妙なことに、同じ FC の「スレッドが既に開始されています」を取得したため、thread.isAlive() は false を返したに違いありません.. ??
API からの onWindowFocusChanged() メソッドもあります。
私はこのゲームの側面にかなり熱心で、RPG の基礎のほとんどをレイアウトしました。しかし、私の頭を悩ませているのは、このすべての Android/Java のことです。誰かが私を正しい方向に向けることができますか?
android - Android MapView と SurfaceView の合成
SurfaceView と MapView を持つアプリケーションがあります。次のように、それらは 1 つのビューに表示されます。
MapView は SurfaceView の前にあることに注意してください。このため、MapView は SurfaceView の「下」に描画され、SurfaceView に描画したものが表示された黒い背景だけが表示されます。順序を入れ替えて、SurfaceView をファイルの最初に配置し、MapView を 2 番目に配置すると、MapView が描画され、SurfaceView は表示されません。
SurfaceView Javadocによると:
サーフェスは、SurfaceView を保持するウィンドウの背後にあるように Z オーダーされます。SurfaceView はウィンドウに穴を開けて、その表面を表示できるようにします。ビュー階層は、通常はその上に表示される SurfaceView の兄弟を Surface と正しく合成する処理を行います。
私にとって、これは、SurfaceView をファイルの最初に配置し、MapView を「パンチスルー」して、その内容を表示できるようにする必要があることを意味します。しかし、そのままでは、それらは 2 つのビューのように見え、一度に見えるのは 1 つだけです。
考えた後: 背景のアルファがゼロ (つまり透明) になるように背景を #00000000 に設定しようとしましたが、効果はありません。
java - Android サーフェスビューが機能しない
簡単な質問ですが、わかりません。
これは私のxmlです:
月着陸船では、メインスレッドが使用します
しかし、私は私のものを使用することはできません
R.layout.main を --> new testA(this) に変更すると、動作します
(testA は SurfaceView を拡張したクラスで、SurfaceHolder.Callback を実装しています)
どうして??
android - アンドロイドキャンバス描画についての効率
キャンバスに限界があるのではないかと思っていました。
drawline(), drawbitmap(), drawcircle(),
つまり、 Androidが実際にキャンバスに何かを描画し、CPUサイクルを浪費するなどの関数を使用する場合はどうなりますか?
すべての描画機能の後、画面に実際に印刷される画像は画面サイズによって決まるためです。また、画面サイズ以外のものを描画しても表示されません。
たくさんの描画関数を呼び出して、キャンバスに細かい部分を追加し、サーフェスを「ブリンブリン」にしたいです。それが範囲外である場合、それらが私の描画を遅くする場合、私はそれらを使用したくありません。
サーフェスビューの構造で小さなゲームに取り組んでいます。アドバイスをありがとうございます。
例えば:
<->b画面の外からロボットが歩いています。
ロボットの歩行画像をキャンバスに描くには、20個の描画機能が必要です。画面をスクロールすると、ロボットが見えます。
したがって、画面外の描画機能が実際に画面上に描画するのと同じくらいの時間がかかる場合。ロボットの位置がユーザーに見える場合にのみ、それを検出する必要があります。それから私は描画します。そうでなければ、私はしません。
描画機能がCPUサイクルをあまり浪費しないのであれば、現在の画面でロボットが見えなくても、毎回描画することができます。
android - SurfaceView に Android レイアウトをオーバーレイする
Google が提供する Lunar Lander サンプルに似た surfaceview を使用して、単純な Android ゲームを設計しています。ハイスコア、メッセージ、メニューなどのさまざまなものを、表面ビューをバックグラウンドで画面にポップアップ表示したいと考えています。
問題は、「ポップアップ」に画像、テキストボックスなどの多くのデザイン要素を含めることです.XMLでレイアウトを作成して、必要なポップアップをデザインし、それをサーフェスビューに表示する方法はありますか?コードで個々の要素を 1 つずつ作成し、それらすべてをキャンバスにペイントする必要はありません。
画面の横からポップアップをアニメーション化したいので、XML でレイアウトを設計して、すべてのオブジェクトが相互の関係を認識し、そのレイアウトを 1 つのオブジェクトとしてアニメーション化するとよいでしょう。
それは非常に単純なことのように思えますが、それを達成する方法を見つけることができないようです。
java - SurfaceView クラスまたはネストされたスレッド内からアクティビティを終了するにはどうすればよいですか
ユーザーがゲームに失敗したときにゲーム アクティビティを終了したいアプリケーション (ゲーム) を作成しています。私のゲームは大まかに lunarlander に基づいているので、多くの人が慣れ親しんでいるので、例として lunarlander を使用して助けを求める方が簡単かもしれないと思います.
ユーザーが lunarlander ゲームに失敗した場合、アクティビティを自動的に終了したいと考えています (私のアプリは複数のアクティビティを使用しているため)。アクティビティ クラス内で finish() メソッドを使用できることはわかっていますが、そのメソッドを surfaceview クラスまたはそのネストされたスレッド内で使用することはできません。アクティビティを終了したり、アクティビティ クラスに戻るトリガーを作成したりするために使用できるこのクラス内から何ができますか?
または、これにアプローチする必要があるまったく別の方法はありますか?
ありがとう。
android - SurfaceView を TextView や Buttons などの他のビューと組み合わせる
私はAndroidプログラミングにまったく慣れていません(チュートリアルをいくつか行った/開発ガイドを読んだだけです)。すべての初心者と同じように、役に立たないゲームをやりたいです:-)。
現在、さまざまなビューのレイアウトに苦労しています。例と同様に、 a を拡張してSurfaceView
に入れるクラスを作成しましたFrameLayout
。このあたりで、SurfaceView
他の View のようなButtons
&が必要TextViews
です。このようなもの:
FrameLayout
and RelativeLayouts
(画面の端に貼り付ける)を使用してこのようなことを行うことができましたが、オブジェクトの幅と高さの倍数にする必要があるためTextViews
、のサイズをより適切に制御したいと思います。SurfaceView
その中に描いていきます。layout_width
とをいくつかの dp 値に設定しようとしましlayout_height
たが、0,0 でペイントを開始すると、まだ左上隅にTextView
あります (..)。
では、上記のようなレイアウトを実現するためのベスト プラクティスは何ですか? どのレイアウトを使用していますか?または、代わりdraw()
に my の関数内でテキストを描画する必要がありますか?SurfaceView
java - Android エミュレーターが正しい密度または解像度をシミュレートしていません。おそらくサーフェスビューの実装の問題
surfaceholder.callback を拡張する surfaceview クラスを使用する小さなアプリを構築しています。lunarlander の例と同じように実装されています。私の問題は、私が使用する各タイプのエミュレーター (低密度、中密度、または高密度) が、実際には画面の密度や解像度を期待どおりに変更していないように見えることです。私は最近、スタック オーバーフローについてこの質問をしましたが、その関数で何も悪いことをしていないことに気づきました。
高密度エミュレータの画面には、非常にピクセル化された画像が表示されます。中密度エミュレーターの画像は素晴らしく見えます。低密度エミュレーターの画像はぼやけて見えますが、hdpi ほど悪くはありません。
各エミュレーターで mySurfaceHolder.getSurfaceFrame() を実行したところ、次のようになりました。
- WVGA800 - 480x800 - hdpi - 320 x 508 のサーフェスを生成
- デフォルト(HVGA) - mdpi - 320 x 455 のサーフェスを生成します
- QVGA - 240x320 - ldpi - 320 x 402 のサーフェスを生成します
これらのサーフェスはそれぞれ 480x800、320x480、240x320 であるべきではありませんか? 編集: 320x455 は理にかなっていますが、残りはおそらくタイトル バーに表示されます。しかし、ロー/ハイはどうですか?
したがって、私の問題が次のとおりかどうかはわかりません。
エミュレーターのセットアップ方法。– HVGA、QVGA、WVGA800、および WVGA854 を標準設定 (カスタム解像度なし) で使用しています
surfaceview クラスのコードに何か問題があります。サイズを手動で設定していないことに注意してください。このコールバック メソッドから返されるサイズに依存しています。
.
何かご意見は?いつものように、私はあなたのすべての助けに感謝します!
android - ゲーム開発のためのSurfaceViewとスレッド戦略によるプログラミング
LunarLander のような構造に基づくゲームを開発するために、SurfaceView とレンダリング スレッドを使用しています。
しかし、私は多くの問題に直面しました。ここでそれらをすべて指摘したいと思います。ゲームを開発したい人が、もう苦労する必要がなくなることを願っています。そして、私はまだアンドロイドに慣れていないので、構造についてより良いアイデアを持っている人なら誰でも経験を共有できます:)
[1] 関数thread.start()
は複数回呼び出されるべきではありません。
メソッドを使用してアクティビティが一時停止した後に再度レンダリングするために、サーフェスの作成時にスレッドを作成するために言及されている多くの記事:
スレッドが終了せずに関数が呼び出されると、アクティビティがクラッシュすることがわかります。
[2] 「電源」または「赤い電話」ボタンを押した場合、または電話が数分間アイドル状態の場合、アクティビティはonPause()
状態になりますが、スレッドはまだ実行中です。これは非常に悪い習慣なので、スレッドを停止させ、onResume()
.
[3] 画面ロックが縦向き / 横向きで、ゲームが他の向きに固執している場合、画面ロックによって一度「向き」を強制されました。それは活動をもう一度始めることを意味します。私はまだそれに対する解決策を見つけることができません。(Androidの画面の向きのバグで述べたように)
これらの問題を修正するための私のコードは次のとおりです。
UIスレッド
ゲームビュー
マニフェスト
新しいスレッドonResume()
の代わりに使用します。surfaceCreated()
そして、アプリケーションが初めて作成されたとき、または「画面オフ」の状況から来るsurfaceCreated
ことを知るために、ブール値を設定しました。onResume()
そのため、毎回スレッドダイonPause()
が呼び出されます。良い習慣のようです。スレッドを停止して再開するもう 1 つの方法は、オブジェクトを同期し、wait / notify を呼び出すことです。しかし、それが良いか悪いかはわかりません。
レンダリング スレッドを制御するより良い方法はありますか?