Błąd.Miganie ekranu przy ruchu . JAVA

0

Witam ma problem z grą .Przy wciskaniu klawiszy ekran miga i jest ok do następnego ruchu , powiedzcie mi jak to usunąć.
Oto kod do klasy:

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;

import javax.swing.JApplet;
import javax.swing.JButton;





public class Main extends JApplet implements KeyListener,ActionListener
{ 
	private static final long serialVersionUID = -6424241029525055908L;
	private Image Bufor ;
	private Graphics bg;
	private boolean lvl1=true,menu=false;
	private JButton k;
	private Container s;
	private Timer timer=new Timer();
	private Plansza planszaSkrypt=new Plansza();
	static JApplet applet;
    public void init()
        {
        	applet=this;
        	applet.setSize(1200,800);
        	applet.addKeyListener(this);
        	applet.setBackground(Color.black); 
        	applet.setLayout(null);
        	applet.addKeyListener(this);
        	applet .setFocusable(true );
        	lvl1=false;
        	menu=true;
        	if(menu)
        	{
	        	s=getContentPane();
	        	s.setLayout(null);
	        	s.setBackground(Color.red);
	        	k=new JButton("");
	        	k.setBounds(100, 100, 200, 50);
	        	k.addActionListener(this);
	        	s.add(k);
        	}
        	planszaSkrypt.inicjujPlansze();
        	applet.repaint();
        	
        	Bufor = createImage(1200,800);
    		bg=Bufor.getGraphics();
        	timer.scheduleAtFixedRate(planszaSkrypt, 1, 1);
        	
        }
    public void start ()
    {
        	
    }
    public void update(Graphics g)
    {
    	bg.clearRect(0, 0, 1200, 800);
    	paint(bg);
    	g.drawImage(Bufor, 0, 0, applet);
    	applet.repaint();
    		
    }
    public void paint(Graphics g) 
        {
        	super.paint(g);
        	if(lvl1)
        	{
	        	rysujPlansze(g);
        	}
        }
    public void rysujPlansze(Graphics g)
    {
    	for(int i = 0 ;i<planszaSkrypt.plansza.length;i++)
    	{
    		for(int k = 0 ;k<planszaSkrypt.plansza[0].length;k++)
    		{
    			switch (planszaSkrypt.plansza[i][k]) {
				case 0:
					g.setColor(Color.black);
    				g.fillRect(k*40, i*40, 40, 40);
				break;
				case 1:
					g.setColor(Color.orange);
        			g.fillRect(k*40, i*40, 40, 40);
				break;
				case 2:
					g.setColor(Color.blue);
        			g.fillRect(k*40, i*40, 40, 40);
				break;
				case 3:
					g.setColor(Color.white);
        			g.fillRect(k*40, i*40, 40, 40);
        			planszaSkrypt.pozycjaGraczaX=k;
        			planszaSkrypt.pozycjaGraczaY=i;
				break;
    			}
				
    			
    		}
    	}
    }
    @Override
	public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			
			int klawisz = e.getKeyCode();
			if(klawisz==KeyEvent.VK_W)
			{
				
				if(planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY-1][planszaSkrypt.pozycjaGraczaX]==0)
				{	
					System.out.println("W");
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX]=0;
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY-1][planszaSkrypt.pozycjaGraczaX]=3;
					applet.repaint();
				}
			}else
			if(klawisz==KeyEvent.VK_S)
			{
				
				if(planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY+1][planszaSkrypt.pozycjaGraczaX]==0)
				{	
					System.out.println("S");
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX]=0;
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY+1][planszaSkrypt.pozycjaGraczaX]=3;
					applet.repaint();
				}
			}else
			if(klawisz==KeyEvent.VK_A)
			{
				
				if(planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX-1]==0)
				{	
					System.out.println("A");
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX]=0;
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX-1]=3;
					applet.repaint();
				}
			}else
			if(klawisz==KeyEvent.VK_D)
			{
				
				if(planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX+1]==0)
				{	
					System.out.println("D");
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX]=0;
					planszaSkrypt.plansza[planszaSkrypt.pozycjaGraczaY][planszaSkrypt.pozycjaGraczaX+1]=3;
					applet.repaint();
				}
			}
	}
		@Override
	public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}
		@Override
	public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}
		@Override
	public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			menu=false;
			lvl1=true;
			k.removeActionListener(this);
			s.remove(k);
			s.setBackground(null);
			applet.repaint();
			
		}
       	
        
		
        
}

Ato kod do klasy plansza:

package werty12121.gry.graaplet;

import java.util.TimerTask;

public class Plansza extends TimerTask {
	int[][] plansza=new int[20][30];
	int pozycjaGraczaX;
	int pozycjaGraczaY;
	public void inicjujPlansze()
    {
    	int[][] planszatemp={
    					 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    					 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
    					 };
    	for(int i = 0 ;i<plansza.length;i++)
    	{
    		for(int k = 0 ;k<plansza[0].length;k++)
    		{
    			plansza[i][k]=planszatemp[i][k];
    			Main.applet.repaint();
    		}
    	}
    }
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//Main.applet.repaint();
	}

}

0
werty12121 napisał(a):

Witam ma problem z grą .Przy wciskaniu klawiszy ekran miga i jest ok do następnego ruchu , powiedzcie mi jak to usunąć.

	int[][] planszatemp={
					 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
					 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
					 };


przemyśl to 20razy. 

na dodatek nie widze abyś gdzieś miał dobrze napisany wątek dla mapy. na dodatek run() jest puste. ogólnie to trochę koncepcja bez sensu bo nie wykorzystujesz wszystkiego co oferuje ci klasa.
0

ok ale co mam zrobić żeby przestało mi tak migać ?

0

Przemyśl poniższy fragment, dlaczego jest tyle razy repaint()?

        for(int i = 0 ;i<plansza.length;i++)
        {
            for(int k = 0 ;k<plansza[0].length;k++)
            {
                plansza[i][k]=planszatemp[i][k];
                Main.applet.repaint();
            }
        }
0

próbowałem bez tego i dzieję się to samo problem tkwi gdzieś w sterowaniu graczem bo miga tylko jak gracz wykonuje ruch.

0

Zmieniłem rozszerzenie klasy Main z

JApplet

na Applet

 i tym razem nic nie miga ale za to nie działają przyciski więc zostanę przy <code class="java">JApplet

. Ale problem jest cały czas aktwny :( . Pomóżcie

0

Początkowo zniechęcił mnie sposób definiowania macierzy planszatemp, ostatecznie zrezygnowałem z próby pomocy po przeczytaniu napisu na przycisku.

2
for(int i = 0 ;i<plansza.length;i++)
        {
            for(int k = 0 ;k<plansza[0].length;k++)
            {
                plansza[i][k]=planszatemp[i][k];
                Main.applet.repaint(); // <<<----!!!!!!!
            }
        }
 

nie dziw się, że miga ekran, skoro w momencie odświeżenia "grafiki" w tych 4 linijkach działania odświeża Ci mapę 600 razy. Zrób rysowanie planszy do "obrazka" a potem obrazek do appletu. i już masz jedno odświeżenie apletu, zamiast 600set.

0

OK działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1