【Java】ちらつきを無くしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
masahiko

【Java】ちらつきを無くしたい

#1

投稿記事 by masahiko » 9年前

[1] 質問文
 Javaアプリケーションの質問を失礼します。
 画面に描画した図形がちらついてしまいます。
 下のコードでは四角と丸を移動させていますが、移動中に斜めに割れるようなチラツキをします。

コード:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;


public class GameMain extends JFrame{
	//ウィンドウサイズ
	private final int windowW = 640;
	private final int windowH = 480;

	//マルチバッファリングをしようとしています
	BufferStrategy strategy;

//簡単に動かすために作った変数
	int i = 100;
	int t = 0;
	boolean f = true;

	//コンストラクタ
	GameMain()
	{
		setTitle("AboutGame");
		setSize(windowW,windowH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
		setResizable(false);

       //マルチバッファリングをしようとしています
       setIgnoreRepaint(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
   }


	public void Render()
	{
       Graphics2D g = (Graphics2D)strategy.getDrawGraphics();

		//簡単に動かしてます
		if(i <= 100)f = true;
		if(i >= 600)f = false;
		t++;
		if(t == 10)
		{
			if(f == false)i-=1;
			if(f == true)i+=1;
			t = 0;
		}

		g.setColor(Color.black);
		g.fillRect(0, 0, windowW, windowH);

		g.setColor(Color.white);
		g.fillRect(i,200, 64, 64);
		g.fillOval(i, 300, 64, 64);

		g.dispose();
		strategy.show();
	}
	
	
	public static void main(String[] args) 
	{
		GameMain gm = new GameMain();

		while(true) gm.Render();
	}
}
下記のようなサイトは見てきたのですが自分一人ではどうにもできないようです。
 http://www.gamesite8.com/archives/615401.html
 http://lecture.ecc.u-tokyo.ac.jp/~ktana ... s/2-5.html
 http://aidiary.hatenablog.com/entry/20070502/1251466876

チラつきの除去、正しい描画の仕方のご教授お願いします。
 

[2] 環境  
 [2.1] OS : Windows7 x64
 [2.2] Jave 1.7

[3] その他
Javaはほぼ素人です。
 他の言語もDXライブラリを使ってC++で簡単なアクションゲームを作ったことがある程度です。

アバター
海Sea
記事: 102
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: 【Java】ちらつきを無くしたい

#2

投稿記事 by 海Sea » 9年前

一度、g.dispose()だけをコメント化して、
実行を試してみてください。

masahiko

Re: 【Java】ちらつきを無くしたい

#3

投稿記事 by masahiko » 9年前

すみません。
変わりませんでした。

アバター
海Sea
記事: 102
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: 【Java】ちらつきを無くしたい

#4

投稿記事 by 海Sea » 9年前

masahiko さんが書きました:すみません。
変わりませんでした。
すいません。ではそれは元に戻して頂いて。
えと、今試せる状態ではないので、
masahiko さんのソースは実行していないのですが、

http://www.mltlab.com/wp/archives/457

お時間がよろしければ、一旦ここ読んでみてください。
描画や画面の参考になると思います。

アバター
海Sea
記事: 102
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: 【Java】ちらつきを無くしたい

#5

投稿記事 by 海Sea » 9年前

本題のちらつきに関しては、以下が参考になると思います。

http://hp.vector.co.jp/authors/VA012735/java/dbuf1.htm

http://sasuke.main.jp/javadaburu.html

おそらくもうわかっていることと思いますが、
ライブラリを使わずに一から構築するということは、
ゲームの中身を制作するのとは違いますので、
焦らずにやったほうがいいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 【Java】ちらつきを無くしたい

#6

投稿記事 by softya(ソフト屋) » 9年前

私はAndroidゲームをCocos2d-x(c++)で組んでいるでJavaでのゲームの組み方には詳しくないですが、海外製のJavaゲーム・ライブラリAndEngineやlibGDXを検討されると少しは楽になるかもしれません。まぁ日本語情報が少ないのが難点で英語に苦しむかも知れませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

masahiko

Re: 【Java】ちらつきを無くしたい

#7

投稿記事 by masahiko » 9年前

色々有り難うございます。こんなに返信貰えると思っていなかったので嬉しいかぎりです。


問題はまだ解決していません。
移動している画像に画面上部から斜めの分割線が降りてくるような(解りにくくてすみません)

色々なサイトにある「ちらつかないサンプル」でも全てこうなってしまうので別の問題、コンピューターやJavaの設定のせいかもしれません。
そっちの方向で調べなおしてきます。
その結果はまたこちらに書かせてもらいたいと思います。

ISLe()

Re: 【Java】ちらつきを無くしたい

#8

投稿記事 by ISLe() » 9年前

BufferStrategyが正しく機能していれば、自分でオフスクリーンイメージを用意する必要はないばすなのですよね。

No.1に提示されたコードをこちらで動かしてみましたが、特にチラツキはありませんでした。

試しにうちのブログからJavaのサンプルプログラムをダウンロードして動かしてみてもらえないでしょうか。
タイルマップ関連のが分かりやすいかもしれません。
デスクトップで動いているとき、Altキーを押しながらEnterキーを押すとフルスクリーンモードになります。
もう一度同じ操作でウィンドウモードに戻ります。
フルスクリーンとウィンドウで違いがあるかも確認してみてください。

masahiko

Re: 【Java】ちらつきを無くしたい

#9

投稿記事 by masahiko » 9年前

Re:ISLe()さん

動かしてくださってありがとうございます。
自分の環境だと動いている白い四角と丸の左右が階段上になるように見えます。
高速に動かすほど顕著になります。

ISLe()さんのブログから記事:「タイルマップ座標のオフセットを求める」のプログラムを動かしてみました。
動かしていると走査線のようなズレが上から下へ流れるように見えます。

下記のHPで公開されているゲームも同じように見えるのでJavaとはそういったものなのでしょうか?
http://aidiary.hatenablog.com/entry/20050205/1272881434
http://perfect-logic.net/SampleAction/
また、それなら自分が悩んでいる現象は同じものなのでしょうか?

頼りきりで申し訳ありませんがご教授お願いします。

ISLe()

Re: 【Java】ちらつきを無くしたい

#10

投稿記事 by ISLe() » 9年前

Javaも内部ではDirect3Dを使っているので、Javaだからチラつくということはないはずです。

Windows7でAeroが有効な環境では、ウィンドウ表示がチラつかない処理をウィンドウズがやってくれます。
それでもチラつくということであればグラフィックボード(ドライバ)、あるいはモニタの問題ではないでしょうか。

DXライブラリで同内容のプログラムを作った場合はチラつかないのでしょうか。

masahiko

Re: 【Java】ちらつきを無くしたい

#11

投稿記事 by masahiko » 9年前

Re:ISLe()様

返信有難うございます。そしてすみませんでした。

http://www.pasoble.jp/windows/7/08812.html
ココを見てご指摘のAeroを有効化したら普通に見えるようになりました。
過去にシンプルな方がいいからとWindows 7 ベーシックをテーマにしていたのだと思われます。

全くプログラムと違う問題で書き込んでしまい申し訳ありませんでした。

ISLe()

Re: 【Java】ちらつきを無くしたい

#12

投稿記事 by ISLe() » 9年前

Aeroを有効にしてチラつかないのなら、グラボやモニタの問題ではないことが明らかになっただけですよ。

こちらの環境(Windows 7 64ビット,JRE 8u20)ではAeroが無効でも基本的にテアリングは発生しません。
何回か起動しているとたまに発生することがありますが。
フルスクリーンモードだとAero関係ないですし。

あるいはテアリングとは別のものなのでしょうか。

閉鎖

“C言語何でも質問掲示板” へ戻る