[解決済み] BufferStrategyを理解する
2022-03-03 13:50:56
質問
私はjavaの初心者です。ゲームを作りたいと思っています。いろいろ調べても、bufferstrategyの仕組みがわかりません...。 基本はわかっているのですが、オフスクリーンイメージを作成し、後でウィンドウオブジェクトに入れることができます。こんな感じです。
public class Marco extends JFrame {
private static final long serialVersionUID = 1L;
BufferStrategy bs; //create an strategy for multi-buffering.
public Marco() {
basicFunctions(); //just the clasics setSize,setVisible,etc
createBufferStrategy(2);//jframe extends windows so i can call this method
bs = this.getBufferStrategy();//returns the buffer strategy used by this component
}
@Override
public void paint(Graphics g){
g.drawString("My game",20,40);//some string that I don't know why it does not show
//guess is 'couse g2 overwrittes all the frame..
Graphics2D g2=null;//create a child object of Graphics
try{
g2 = (Graphics2D) bs.getDrawGraphics();//this new object g2,will get the
//buffer of this jframe?
drawWhatEver(g2);//whatever I draw in this method will show in jframe,
//but why??
}finally{
g2.dispose();//clean memory,but how? it cleans the buffer after
//being copied to the jframe?? when did I copy to the jframe??
}
bs.show();//I never put anything on bs, so, why do I need to show its content??
//I think it's a reference to g2, but when did I do this reference??
}
private void drawWhatEver(Graphics2D g2){
g2.fillRect(20, 50, 20, 20);//now.. this I can show..
}
}
どうしたものか... ずっと勉強してきたんだけど...全然ダメで... もしかしたら、全てはそこにあって、本当に明確でシンプルなのですが、私があまりにも愚かで、それに気づかないだけなのかもしれません......。
いろいろとありがとうございました... :)
解決方法は?
その仕組みはこうです。
-
は
JFrame
を構築します。BufferStrategy
を呼び出すとcreateBufferStrategy(2);
. そのBufferStrategy
の特定のインスタンスに属していることを知っています。JFrame
. あなたはそれを取得してbs
フィールドを使用します。 -
いざ、自分のものを描こうとすると、取得するのは
Graphics2D
からbs
. これはGraphics2D
オブジェクトが所有する内部バッファの 1 つに関連付けられます。bs
. 描画すると、すべてがそのバッファに入ります。 -
を最終的に呼び出すと
bs.show()
,bs
のカレントバッファになります。JFrame
. この方法を知っているのは、(ポイント 1 を参照)JFrame
へのサービスである。
それだけなんです。
あなたのコードへのコメントですが、描画ルーチンを少し変更したほうがいいでしょう。この代わりに
try{
g2 = (Graphics2D) bs.getDrawGraphics();
drawWhatEver(g2);
} finally {
g2.dispose();
}
bs.show();
のようなループになるはずです。
do {
try{
g2 = (Graphics2D) bs.getDrawGraphics();
drawWhatEver(g2);
} finally {
g2.dispose();
}
bs.show();
} while (bs.contentsLost());
これにより、バッファーフレームの損失から保護されます。 ドキュメント が、時折発生することがあります。
関連
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】スレッド「main」での例外 java.lang.StringIndexOutOfBoundsException: 文字列のインデックスが範囲外です。0 [閉店]
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み] JavaでSSLピアが正しくシャットダウンされない
-
[解決済み】Javaの".class expected "について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】ResultSetの例外 - 結果セットの開始前
-
[解決済み】宣言されたパッケージが期待されるパッケージと一致しない ""
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】なぜjava.io.Fileにはcloseメソッドがないのでしょうか?
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】破損したjarファイル
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。