Błąd.Miganie ekranu przy ruchu . JAVA

Błąd.Miganie ekranu przy ruchu . JAVA
W1
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Kraków
  • Postów:24
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:

Kopiuj
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:

Kopiuj
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();
	}

}

edytowany 1x, ostatnio: werty12121
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}
					 };
Kopiuj


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.
W1
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Kraków
  • Postów:24
0

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

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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

Kopiuj
        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();
            }
        }

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
W1
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Kraków
  • Postów:24
0

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

W1
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Kraków
  • Postów:24
0

Zmieniłem rozszerzenie klasy Main z

Kopiuj
JApplet

na Applet

Kopiuj
 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

edytowany 1x, ostatnio: werty12121
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
dasiek
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 5 lat
  • Postów:10
2
Kopiuj
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.

W1
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Kraków
  • Postów:24
0

OK działa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.