set Double Buffered

0

witam! probuje zrobic podwojne buforowanie przy pomocy setDoubleBuffered()

lub

JPanel panel = new JPanel(true);//true czyli buforowanie wlaczone
panel.add(obrazek);

ale jak zrobie

Image ludzik;
    

     JPanel panel = new JPanel(true);


 public void init(){        

        try{
            ludzik =new ImageIcon(this.getClass().getResource("avsk/lud.png")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać obrazu");}

      panel.add(ludzik);


    }

wywala blad
a tego to juz calkiem nie wiem jak uzyc setDoubleBuffered()

prosze o pomoc

caly kod


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class a_avsk extends Applet implements KeyListener, Runnable{
    private String tekst = new String( );
    private String nr = new String( );
    String src_kl = "avsk/klakier_p.png", pkt = "Punkty:";
    int il_pkt, Ym=0, Yp=0, Xm=0, Xp=0, los = 0, ow_img;
    int x = 400, y = 200, speed = 10, sek;
    int xk = 0, yk = 0, ow_x, ow_y;
    Image ludzik , klakier, owoc;
    String name_ow;
     Random losuj=new Random();

     JPanel panel = new JPanel(true);//true czyli buforowanie wlaczone




    @Override
    public void init(){
        Thread watek1=new Thread(this);
        watek1.start();
        Watek2 watek2=new Watek2();
        watek2.start();

         Watek3 watek3=new Watek3();
        watek3.start();
        
        addKeyListener(this);
        requestFocus( );
        setBackground(Color.white);
        setSize(900,800);



        //isDoubleBuffered(false);
        //setDoubleBuffered(true);

        try{
            ludzik =new ImageIcon(this.getClass().getResource("avsk/lud.png")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać obrazu");}

      


    }

    @Override
    public void paint(Graphics g){
        super.paint(g);
        //g.setDoubleBuffered(true);
        g.setColor(Color.black);
        g.drawString(tekst, 10, 40);
        g.drawString(nr, 40, 80);       
        if(los == 0){
            ow_x =losuj.nextInt(890);
            ow_y =losuj.nextInt(750);
            ow_img =losuj.nextInt(400);           
            if(ow_img < 100) name_ow = "avsk/jab.jpg";
            else if(ow_img >= 100 && ow_img < 200) name_ow = "avsk/mysz.jpg";
            else if(ow_img >= 200 && ow_img < 300)  name_ow = "avsk/pies.jpg";
            else if(ow_img >= 300) name_ow = "avsk/speed.jpg";
                                
             

            los = 1;
        }


        try{
           owoc =new ImageIcon(this.getClass().getResource(name_ow)).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać owoca"+name_ow);}

        try{
           klakier =new ImageIcon(this.getClass().getResource(src_kl)).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać klakiera");}


        g.drawImage(owoc,ow_x,ow_y,null); // owoc
        
        g.drawImage(ludzik,x-17,y-80,null); // czlowiek

        g.drawImage(klakier,xk,yk-98,null); // klakier

        g.setColor(Color.black);
        g.fillRect(0, 760, 900, 40);

        g.setColor(Color.white);
        g.drawString(pkt, 10, 780);
    }



    public void keyPressed(KeyEvent e){
        int key = e.getKeyCode();
        if(key == 38){
            Ym = 1;
            Yp = 0;
        }
        else if(key == 40){
            Yp = 1;
            Ym = 0;
        }

        if(key == 37){
            Xm = 1;
            Xp = 0;
        }else if(key == 39){
            Xm = 0;
            Xp = 1;
        }

    }

    public void keyTyped(KeyEvent e){}

    public void keyReleased(KeyEvent e) {
       int key = e.getKeyCode();
        if(key == 38 || key == 40){
            Ym = 0;
            Yp = 0;
        }

       if(key == 37 || key == 39){
           Xp = 0;
            Xm = 0;
       }
      

    }



public void run(){
    int sp = 0;
     while(true){
       if(Ym > 0){
           y--;
           if(y-40 < 0) y = 760;
       }else if(Yp > 0){
           y++;
           if(y-40 > 760) y = 0;
       }

       if(Xm > 0){
           x--;
           if(x < 0)x=900;
       }else if(Xp > 0){
           x++;
           if(x > 900)x=0;
       }

       if(y <= yk && y >= yk-45 && x >= xk && x <= xk + 98) il_pkt=0;

       if(y >= ow_y && y <= ow_y+40 && x >= ow_x && x <= ow_x + 40){
           speed = 10;
            if(ow_img < 100) il_pkt += 10;
            else if(ow_img >= 100 && ow_img < 200) il_pkt += 15;
            else if(ow_img >= 200 && ow_img < 300)  il_pkt += 20;
            else if(ow_img >= 300){
                sp = 1;
                sek = 0;
            }
           
          los = 0;
       }
       if(sp > 0 && sek <= 20){
           speed =1;
       } else{
           sp = 0;
           speed = 10;
       }

      // il_pkt++;
       pkt = "Punkty: "+il_pkt+" czas: "+sek;
            try {                
                Thread.sleep(speed);
                
            } catch (InterruptedException ex) {}
       

        //repaint();
        }
    }



    class Watek2 extends Thread {
        @Override
        public void run(){
            while(true){

                if(y > yk){
                   yk++;
               }else if(y < yk ){
                   yk--;
               }

                if(x > xk){
                   xk++;
                   src_kl = "avsk/klakier_p.png";
               }else if(x < xk ){
                   xk--;
                   src_kl = "avsk/klakier_l.png";
               }

             try{
                    Thread.sleep(16);
             }catch(Exception e){}

              repaint();
            }//koniec while
        }//koniec metody run()
    }//koniec klasy wew






    class Watek3 extends Thread {
        @Override
        public void run(){
           
                while(true){
                    sek++;
                 try{
                        Thread.sleep(1000);
                 }catch(Exception e){}


                }//koniec while
           
        }//koniec metody run()
    }//koniec klasy wew





}

wiem ze to juz bylo ale tam bylo napisane dla zaawansowanych :)

0

Tworzysz nowy JPanel z podwojnym buforowaniem:

JPanel panel = new JPanel(true);

ktorego potem w ogole nie wykorzystujesz. Rysowanie natomiast, wykonujesz na obiekcie Applet, a dokladniej java.awt.Component w hierarchii dziedziczenia klasy java.applet.Applet. Poprawienie powyzszego powinno rozwiazac problem.

Natomiast idac dalej:
#1 z kazdym wywolaniem paint(Graphics g) tworzysz w pamieci nowe obrazki:

        try{
           owoc =new ImageIcon(this.getClass().getResource(name_ow)).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać owoca"+name_ow);}

        try{
           klakier =new ImageIcon(this.getClass().getResource(src_kl)).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać klakiera");}

Nie lepiej bedzie zaladowac wszystkie potrzebne obrazki raz, podczas inicjowania apletu, a potem wykorzystywac referencje do nich?

#2 Twoje watki wykorzystuja konstrukcje while(true) {//...}. Zamiast tego, efektywniej byloby uzyc mechanizmu Timer i wzorca kontrolera.

0

poprawilem troche kod i w mojej przegladarce (u mnie) juz nie miga a w innych

nie wiem jak skorzystac z:

JPanel panel = new JPanel(true);
panel.add(ludzik);

wydaje mi sie ze po takim czyms obrazek ludzik by juz byl zbuforowany nie wiem czy to o to chodzi

public class a_avsk extends Applet implements KeyListener, Runnable{
    JPanel panel = new JPanel(true);

    public void init(){
        try{
            ludzik =new ImageIcon(this.getClass().getResource("avsk/     lud.png")).getImage();
            //ludzik.isDoubleBuffered(true);
        }catch(Exception e){ System.out.println("Nie można wczytać obrazu");}
     panel.add(ludzik); // blad ze nie ma metody add
    }
}


jestem zielony w javie i chce sie tego na uczyc najlepiej jak by ktos mogl powiedziec co i w ktorym miejscu mam zrobic

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class a_avsk extends Applet implements KeyListener, Runnable{
    private String tekst = new String( );
    private String nr = new String( );
    String pkt = "Punkty:";
    String time2 = "";
    int szer = 900, wys = 700;
    int il_pkt, Ym=0, Yp=0, Xm=0, Xp=0, los = 0, ow_img, old_pkt;
    int x = 400, y = 200, speed = 10, sek, tim_g, st_game = 0, st_game1 = 0;
    int xk = 0, yk = 0, ow_x, ow_y, src_kl=1, pkey=0;
    Image ludzik , klakier, klakier_l, klakier_p, owoc, owoc1, owoc2, owoc3, owoc4;
    String name_ow;
    Random losuj=new Random(); 
    
public char[] ch_czas(int czas){
    double day, hs, min, seg;
    String time ="";
    int iday, ihs, imin, iseg, x =0;          
    day = Math.floor(tim_g / (42*3600));
    hs = Math.floor(tim_g / 3600 % 60);
    min = Math.floor(tim_g / 60 % 60);
    seg = Math.floor(tim_g / 1 % 60);
    iday = (int) (day + 0);
    ihs = (int) (hs);
    imin = (int) (min);
    iseg = (int) (seg);
    if(day < 0) day = 0;
    if(hs < 0) hs = 0;
    if(min < 0) min = 0;
    if(seg < 0) seg = 0;
    if(day != 0) time += iday+"d ";
    if(hs != 0) time += ihs+"h ";
    if(min != 0) time += imin+"m ";
    time += iseg+"s";
    int length = time.length();          
    char timech[]=new char [length];
    timech = time.toCharArray();        
    return timech;
}
@Override
    public void init(){
        Thread watek1=new Thread(this);
        watek1.start();
        Watek2 watek2=new Watek2();
        watek2.start();

         Watek3 watek3=new Watek3();
        watek3.start();
        
        addKeyListener(this);
        requestFocus( );
        setBackground(Color.white);
        setSize(szer,wys);       

        try{
            ludzik =new ImageIcon(this.getClass().getResource("avsk/lud.png")).getImage();
            //ludzik.isDoubleBuffered(true);
        }catch(Exception e){ System.out.println("Nie można wczytać obrazu");}
        //owoce
        try{
           owoc1 =new ImageIcon(this.getClass().getResource("avsk/jab.jpg")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać owoca");}
        try{
           owoc2 =new ImageIcon(this.getClass().getResource("avsk/mysz.jpg")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać owoca");}
        try{
           owoc3 =new ImageIcon(this.getClass().getResource("avsk/pies.jpg")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać owoca");}
       try{
           owoc4 =new ImageIcon(this.getClass().getResource("avsk/speed.jpg")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać owoca");}
        //owoce koniec
        //klakier
        try{
           klakier_l =new ImageIcon(this.getClass().getResource("avsk/klakier_l.png")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać klakiera");}
        try{
           klakier_p =new ImageIcon(this.getClass().getResource("avsk/klakier_p.png")).getImage();
        }catch(Exception e){ System.out.println("Nie można wczytać klakiera");}

        
    }

    @Override
    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2=(Graphics2D)g;
        //g.setDoubleBuffered(true);
        g.setColor(Color.black);
        g.drawString(tekst, 10, 40);
        g.drawString(nr, 40, 80);       
        if(los == 0){
            ow_x =losuj.nextInt(890);
            ow_y =losuj.nextInt(650);
            ow_img =losuj.nextInt(400);           
            if(ow_img < 100) owoc = owoc1;
            else if(ow_img >= 100 && ow_img < 200) owoc = owoc2;
            else if(ow_img >= 200 && ow_img < 300)  owoc = owoc3;
            else if(ow_img >= 300) owoc = owoc4;
            los = 1;
        }
        if(src_kl==1) klakier = klakier_p; else klakier = klakier_l;
        g.drawImage(owoc,ow_x,ow_y,null); // owoc        
        g.drawImage(ludzik,x-17,y-80,null); // czlowiek
        g.drawImage(klakier,xk,yk-98,null); // klakier
        g.setColor(Color.black);
        g.fillRect(0, 660, 900, 40);
        g.setColor(Color.white);
        g.drawString(pkt, 10, 680);
        if(st_game <= 0){
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
                g.setColor(Color.black);
                g.fillRect(0, 0, szer, wys);
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
                g.setColor(Color.red);
                Font czcionka = new Font("SansSerif", Font.BOLD, 16);
                g.setFont(czcionka);
            if(st_game == 0){                
                g.drawString("WCISNIJ ENTER", (szer/2), (wys/2));
            }else if(st_game == -1){              
                g.drawString("PAUSA WCISNIJ ENTER", (szer/2), (wys/2));
            }else if(st_game == -2){
                g.drawString("Game Over", (szer/2), (wys/2));
                 g.drawString("Twoje punkty: "+old_pkt, (szer/2), (wys/2 + 20));
                 g.drawString("Czas gry: "+time2, (szer/2), (wys/2 + 40));
                 g.drawString("WCISNIJ ENTER", (szer/2), (wys/2 + 60));
                  tim_g = 0;
            }
        }
    }
0

W zalaczniku przyklad, jakby mozna bylo co nieco poprawic: http://www.megaupload.com/?d=I5OK8J7V

A idac dalej, sprobuj zrobic Sobie plan: na czym polega gra, z jakich elementow jest zbudowana, jak ma wygladac plansza, w jaki sposob odbywa sie sterowanie, kiedy gra sie konczy, itd. Potem sprobuj zbudowac wszystkie potrzebne elementy i scalic je w taki sposob, zeby odpowiadalo postawionym wymaganiom.

W Twoim przypadku potrzebna jest plansza 2D (klasa java.awt.Canvas bedzie wystarczajacym rozwiazaniem), ludzik (np. obiekt klasy Postac) i owoce do zbierania (np. obiekt klasy Owoc). Nie dolaczyles obrazkow do Swojego kodu, ale wyglada na to, ze ludzik podrozuje z kotem (awatary z forum, uzyte jako obrazki, srednio odzwierciedlaja charakter gry ;)). Jesli tak, to ten kot rowniez moze byc klasy Postac.

Klasa Postac: powinna posiadac jakas nazwe (String), lokalizacje na planszy(java.awt.Point), wymiary (int), predkosc poruszania sie (int), no i oczywiscie wygladac (java.awt.Image). Dodatkowo, kot powinien miec wlasciciela.
Nasza Postac powinna umiec sie poruszac po planszy (np. metoda move(x, y)).

Klasa Owoc: ma wiedziec, jak wyglada (java.awt.Image), miec jakies rozmiary (int), typ (int) i wartosc dla zbieracza (int).

Dodatkowo, obie klasy, tj. Postac i Owoc, powinny potrafic sie narysowac na planszy. Mozna w tym celu zaimplementowac im wlasny interfejs Printable z jedna metoda public void print(Graphics g), ktora bedzie wywolywana przy kazdym przerysowywaniu planszy.

Klasa Plansza: powinna posiadac inf. o postaci(ach) oraz owocu (a moze wielu owocach?). Powinna oferowac zarzadzanie ruchem postaci (w zaleznosci od klawiszy wcisnietych przez gracza, KeyListener), losowac pozycje i typ owocu (java.util.Random) oraz wykrywac, kiedy gracz jest przy owocu (standardowa detekcja kolizji). Dodatkowo potrzebny jest mechanizm zliczania punktow (prosty atrybut typu int w tej klasie powinien na poczatek wystarczyc) i ew. licznik czasu (javax.swing.Timer() wydaje sie byc do tego stworzony ;)).

Dzialanie:

  • plansza reaguje na akcje klawiatury i w zaleznosci od kodu klawisza (klawisze strzalek), porusza postacia w odpowiednim kierunku. Kot (postac#2 porusza sie samoistnie, relatywnie do polozenia wlasciciela, tj. postac#1).
  • na planszy znajduje sie owoc (w losowym miejscu). Jesli postac#1 jest w bezposrednim kontakcie z owocem, naliczane sa punkty (w zaleznosci od wartosci owocu), owoc znika, a pojawia sie kolejny w innym losowym miejscu.
  • w tle dziala niezalezny watek, liczacy czas od momentu uruchomienia gry. Watek jest wstrzymywany w momencie, gdy uzytkownik wstrzyma gre (klawisz SPACJA).
  • w przypadku wstrzymania gry (klawisz SPACJA), wszystkie ruchy sa blokowane, licznik czasu jest wstrzymywany, az do momentu wznowienia gry (ponownie wcisniety klawisz SPACJA).
  • gra konczy sie, gdy...
0

Dzieki kolego Twoj przykad na pewno mi pomoze :)

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