24 Ocak 2018 Çarşamba

Java form üzerinde klavyeden kontrol


Java da form üzerinde nesnelerin harekitini sağlamak için öncelikle formun koordinat sistemini bilmemiz gerekli. Sol üst köşe x,y olarak 0,0 noktasıdır. Sağ alt köşe ise maksimum x,y noktasıdır. Nesneyi sağa hareket ettirmek için x++, sola ise x-- kullanılmalıdır. Y ekseninde ise durum biraz farklıdır, yukarı giderken y ekseninde 0'a gidilmektedir, dolayısı ile yukarı hareket y-- ile gerçekleşir, aşağı ise y++ ile gerçekleşir.
Jframe x,y koordinat sistemi
Program için kullanabileceğiniz resim dosyaları;

 
 Şimdi label nesnesini ok tuşları ile hareket ettiren kodlara bakalım;

addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                   x = (int) tank.getBounds().getX();
                   y = (int) tank.getBounds().getY();
                   if(x<677) x += 5;
                   tank.setIcon(new ImageIcon(imgr));
                   tank.setBounds(x, y, 103, 50);
                   yon[sayac] = 1;
                   for(int i=sayac+1;i<100;i++) yon[i]=1;
                }
               
                if(e.getKeyCode()==KeyEvent.VK_LEFT) {
                       x = (int) tank.getBounds().getX();
                       y = (int) tank.getBounds().getY();
                       if(x>0) x -= 5;
                       tank.setIcon(new ImageIcon(imgl));
                       tank.setBounds(x, y, 103, 50);
                       yon[sayac] = 2;
                       for(int i=sayac+1;i<100;i++) yon[i]=2;
                    }
               
                if(e.getKeyCode()==KeyEvent.VK_UP) {
                       x = (int) tank.getBounds().getX();
                       y = (int) tank.getBounds().getY();
                       if(y>0) y -= 5;
                       tank.setIcon(new ImageIcon(imgu));
                       tank.setBounds(x, y, 50, 103);
                       yon[sayac] = 3;
                       for(int i=sayac+1;i<100;i++) yon[i]=3;
                    }               

                if(e.getKeyCode()==KeyEvent.VK_DOWN) {
                       x = (int) tank.getBounds().getX();
                       y = (int) tank.getBounds().getY();
                       if(y<355) y += 5;
                       tank.setIcon(new ImageIcon(imgd));
                       tank.setBounds(x, y, 50, 103);
                       yon[sayac] = 4;
                       for(int i=sayac+1;i<100;i++) yon[i]=4;
                    }

Burada e.getKeyCode bize basılan tuşun ASCII kodunu getirir, eğer tuş VK_RIGHT ise sağ ok tuşuna basılmış demektir. Her 4 tuş için label nesnesinin x ve y değeri alınmış ve üzerine + veya - yapılarak hareket sağlanmıştır. Tankın ateş etmesi için ise bir label dizisi, yön dizisi, ve timertask dizisi tanımlanmıştır. Aslında burada tank mermisi tam bir nesnedir, kendisine ait bir yönü ve zamanı vardır.

if(e.getKeyCode()==KeyEvent.VK_SPACE) {
                       ldizi[sayac] = new JLabel(""); 
                       ldizi[sayac].setIcon(new ImageIcon(imgt));
                      
                      
                       if(yon[sayac]==1) {
                           tx[sayac] = (int) (tank.getBounds().getX() + 100);
                           ty[sayac] = (int) (tank.getBounds().getY() + 18);
                       }
                       else if(yon[sayac]==2) {
                           tx[sayac] = (int) (tank.getBounds().getX());
                           ty[sayac] = (int) (tank.getBounds().getY() + 18);      
                       }
                       else if(yon[sayac]==3) {
                           tx[sayac] = (int) (tank.getBounds().getX() + 18);
                           ty[sayac] = (int) (tank.getBounds().getY());      
                       }
                       else if(yon[sayac]==4) {
                           tx[sayac] = (int) (tank.getBounds().getX() + 18);
                           ty[sayac] = (int) (tank.getBounds().getY() + 100);      
                       }
                      
                       ldizi[sayac].setBounds(tx[sayac], ty[sayac], 15, 15);
                       contentPane.add(ldizi[sayac]);                      
                       ldizi[sayac].repaint();      
                      
                      
                       hareket(sayac,yon[sayac]);
                      
                       sayac++;
                     
                    }               
            }
        });

Mermiyi hareket ettiren timer fonksiyonu ise;

static void hareket(int sayac,int yon) {
        tdizi[sayac] = new TimerTask() {  
           
            @Override
            public void run() {
                tx[sayac] = (int) ldizi[sayac].getBounds().getX();
                ty[sayac] = (int) ldizi[sayac].getBounds().getY();
               
                if(yon==1) tx[sayac]++;
                else if(yon==2) tx[sayac]--;
                else if(yon==3) ty[sayac]--;
                else if(yon==4) ty[sayac]++;
               
                ldizi[sayac].setBounds(tx[sayac], ty[sayac], 15, 15);
            }
          };
          myTimer.schedule(tdizi[sayac],0,3);
    }

Bu işlemleri anlatan video dersler aşağıdadır;

Hiç yorum yok:

Yorum Gönder