더블 버퍼링을 이용하여 그래픽을 출력중 이상현상
꽃짱아
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class main
{
ballcanvas can;
main()
{
jframe jf = new jframe(피하자!);
jpanel p1= new jpanel();
can = new ballcanvas(this);
p1.add(can);
can.addkeylistener(new moveproc(can));
jf.addwindowlistener(new windowproc());
p1.setbackground(color.black);
jf.add(p1);
jf.setsize(400,600);
jf.setvisible(true);
//jf.setresizable(false);
}
public static void main(string[] args)
{
new main();
}
}
////////////////////////////////////////////////////////////
class ballcanvas extends canvas
{
int[]x = new int[100];
int[]y = new int[100];
int[]skipx = new int[100];
int[]skipy = new int[100];
int ux = 350;
int uy = 500;
main main;
ballthreadt;
uthread u;
color[]color = new color[100];
randomrand = new random();
image imgu,imgm;
ballcanvas(main main)
{
this.main=main;
imgm = toolkit.getdefaulttoolkit().getimage(imgm.gif);
imgu = toolkit.getdefaulttoolkit().getimage(imgu.gif);
//이 클래스는 시작하는 순간 공의 좌표와 색상을 지정하자.
for(int i = 0; i 100; i++)
{
x[i] = rand.nextint(400);
y[i] = rand.nextint(600);
inttempx = rand.nextint(10);
if(tempx % 5 == 0)
{
skipx[i] = 0;
}
if(tempx % 5 == 1)
{
skipx[i] = 1;
}
if(tempx % 5 == 2)
{
skipx[i] = 2;
}
if(tempx % 5 == 3)
{
skipx[i] = 3;
}
if(tempx % 5 == 4)
{
skipx[i] = 4;
}
int tempy = rand.nextint(10);
if(tempy % 5 == 0)
{
skipy[i] = 1;
}
if(tempy % 5 == 1)
{
skipy[i] = 2;
}
if(tempy % 5 == 2)
{
skipy[i] = 3;
}
if(tempy % 5 == 3)
{
skipy[i] = 4;
}
if(tempy % 5 == 4)
{
skipy[i] = 5;
}
color[i] = new color(rand.nextint(256), rand.nextint(256), rand.nextint(256));
}
t = new ballthread(this);
u=new uthread(this);
u.start();
t.start();
}
//더블 버퍼링 부분
graphics tempg;
image tempi;
int xpos;
int ypos;
public void tempgraphics(){
xpos=getwidth();
ypos=getheight();
tempi=createimage(xpos,ypos);
tempg=tempi.getgraphics();
}
public void update(graphics g){
if(tempg == null)
tempgraphics();viewpaint(g);
}
public void paint(graphics g)
{
g.clearrect(0, 0, 400, 600);
for(int i = 0; i 100; i++)
{
g.drawimage (imgm, x[i] + 5, y[i] + 5, this);
}
g.drawimage (imgu, ux+5 , uy+10, this);
}
public void viewpaint(graphics g){
paint(tempg);
g.drawimage(tempi,0,0,this);
}
public dimension getpreferredsize()
{
return new dimension(400, 600);
}
}
////////////////////////////////////////////////////////////////
class ballthread extends thread
{
boolean flag=false;
ballcanvasmain;
ballthread(ballcanvas temp)
{
main = temp;
}
public void run()
{
while(true)
{
if(flag)
continue;
for(int i = 0; i 100; i++)
{
main.x[i] = main.x[i] + main.skipx[i];
main.y[i] = main.y[i] + main.skipy[i];
}
main.repaint();
for(int i = 0; i 100; i++)
{
//만약 벽에 도착하면 방향을 바꿔주어야 한다.
if(main.x[i] = 0 || main.x[i] = 400)
{
main.skipx[i] = -main.skipx[i];
}
if(main.y[i] = 0 || main.y[i] = 600)
{
main.y[i] = 1;
}
}
try
{
thread.sleep(50);
}
catch(exception e)
{}
}
}
}
///////////////////////////////////////////////////////////////////
class moveproc extends keyadapter
{
ballcanvasmain;
//moveproc(){}
moveproc(ballcanvas temp)
{
main = temp;
}
public void keypressed(keyevent e)
{
int key=e.getkeycode();
if (key == keyevent.vk_right)
{
if ( main.ux == 380)
{}
else
{
main.ux = main.ux + 5;
}
}
else if (key == keyevent.vk_left)
{
if (main.ux == 20)
{}
else
{
main.ux = main.ux - 5;
system.out.println(움직여);
}
}
else if (key == keyevent.vk_up)
{
if (main.uy == 20)
{}
else
{
main.uy = main.uy - 5;
};}
}
else if (key == keyevent.vk_down)
{
if (main.uy == 520)
{}
else
{
main.uy = main.uy + 5;
}
}
main.repaint();
}
}
/////////////////////////////////////////////
class uthread extends thread
{
boolean life=true;
ballcanvasmain;
uthread(ballcanvas temp)
{
main = temp;
}
public void run()
{
while(true){
if (life == true)
{
try
{
thread.sleep(50);
}
catch(exception e)
{
system.out.println(e);
}
for (int i = 0; i100 ;i++ )
{
if (( main.ux = (main.x[i]-6))
&& (main.ux =(main.x[i]+6)))
{
if (( main.uy = (main.y[i]-10))
&& (main.uy =(main.y[i]+10)))
{
//life = false;
try
{
system.out.println(부딛침);
//thread.yield();
//main.t.flag=true;
//main.u.yield();
}
catch (exception e)
{
system.out.println(e);
}
}
}
}
}
else
{
//thread.yield();
}
}
}
}
//////////////////////////////////////////////
class windowproc extends windowadapter
{
public void windowclosing (windowevent e)
{
system.exit(0);
}
}
주제는 공피하기입니다만,
위 소스 코드에서 더블 버퍼링부분을 처리하였습니다.
확실이 깜빡임 현상이 없어 지긴했지만 이상한 현상이 발생하였습니다.아래 사진처럼 특정 부분만 계속 깜박이는 현상이 일어납니다.
보시는 봐와 같이 아래 부분과 같은 부분이 그려지는거 같은데 원인을 못찾겠습니다..
왜이러한 현상이 일어나는 걸까요?... 힌트좀 주세요...