2013-01-21 5 views
0

애플릿을 사용하여 테트리스 게임을 개발 중입니다. 나는 임의의 모양을 생성하고 움직이게 만듭니다. 그러나 나는 그것이 바닥에 안정되게하는 방법을 모른다. 화면의 끝 부분에 도달하면 내 모양이 사라집니다. 이 점에 대해 도와주세요. 여기 내 코드가 간다.애플릿에서 테트리스 게임으로 이미지를 정하는 방법

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 



public class TetrisGame 
{ 
    public static void main (String argsp[]) 
    { 
     JFrame frame = new JFrame("Tetris"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final AppletClass applet = new AppletClass(); 
     frame.getContentPane().add(applet); 
     applet.init(); 
     Thread t = new Thread(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       while(true) 
       { 
        try 
        { 
         Thread.sleep(1000); 
         applet.repaint(); 
        } 
        catch (InterruptedException e) 
        { 
         e.printStackTrace(); 
        }    
       } 
      } 

     }); 
     t.start(); 

     frame.setBounds(10,10,410,610); 
     frame.setVisible(true); 
    } 
} 

class AppletClass extends Applet implements KeyListener 
{ 

    private static final long serialVersionUID = 1L; 
    static int xpos = 190; 
    static int ypos =0; 
    static int random1; 
    static int reached_end=1; 


    public void init() 
    { 
      System.out.println("aaa"); 
     setFocusable(true); 
     requestFocus(); 
     addKeyListener(this); 

    } 
    public void paint (Graphics g) 
    { 

     generateRandomShapes(g); 
    } 

    public void generateRandomShapes (Graphics g) 
    { 

     int i=0; 
     int x[] = new int[4]; 
     int y[] = new int[4]; 

     if(reached_end==1) 
     { 
      random1=(int)Math.floor(Math.random()*100); 
      ypos=0; 
     } 

     x[0]=xpos; 
     ypos =ypos+30; 
     y[0]=ypos; 

     if(ypos>420) 
     { 
      reached_end=1; 
      ypos=0; 
     } 
     else 
      reached_end=0; 





     switch(random1%7) 
     { 
       case 0: 
        //straight line 
        for(i = 0;i<3;i++) 
        { 
         x[i+1]=x[i]; 
         y[i+1]=y[i]+30; 
        } 
        break; 
       case 1: 
        //L shape 
        for(i = 0;i<2;i++) 
        { 
         x[i+1]=x[i]; 
         y[i+1]=y[i]+30; 
        } 
        x[i+1]=x[i]+30; 
        y[i+1]=y[i]; 
        break; 
       case 2: 
        //reverse L shape 
        for(i = 0;i<2;i++) 
        { 
         x[i+1]=x[i]; 
         y[i+1]=y[i]+30; 
        } 
        x[i+1]=x[i]-30; 
        y[i+1]=y[i]; 
        break; 
       case 3: 
        //square shape 
        i=0; 
         x[i+1]=x[i]; 
         y[i+1]=y[i]+30; 
        i++; 
         x[i+1]=x[i]+30; 
         y[i+1]=y[i]; 
        i++; 
         x[i+1]=x[i]; 
         y[i+1]=y[i]-30; 
        break; 
       case 4: 
        //Inverse T shape 
        x[i+1]=x[i]-30; 
        y[i+1]=y[i]+30; 
        for(i = 1;i<3;i++) 
        { 
         x[i+1]=x[i]+30; 
         y[i+1]=y[i]; 
        } 
        break; 
       case 5: 
        //S shape 
        x[i+1]=x[i]-30; 
        y[i+1]=y[i]+30; 
        i++; 
        x[i+1]=x[i]+30; 
        y[i+1]=y[i]; 
        i++; 
        x[i+1]=x[i]+30; 
        y[i+1]=y[i]-30; 
        break; 
       case 6: 
        //Z shape 
        x[i+1]=x[i]+30; 
        y[i+1]=y[i]; 
        i++; 
        x[i+1]=x[i]; 
        y[i+1]=y[i]+30; 
        i++; 
        x[i+1]=x[i]+30; 
        y[i+1]=y[i]; 
        break; 

     } 
     g.setColor(Color.BLACK); 
     for(i=0;i<4;i++) 
     { 
      g.fillRect(x[i], y[i], 30, 30); 
     } 


    } 

    public void keyReleased(KeyEvent e){;} 
    public void keyTyped(KeyEvent e){;} 

    public void keyPressed(KeyEvent e) 
    { 
     System.out.println("Kkk "+e.getKeyCode()); 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) 
    { 
     if(xpos>=30) 
     { 
      xpos=xpos-30; 
     } 
     System.out.println("xpos is :" + xpos); 
    } 
    if(e.getKeyCode() == KeyEvent.VK_RIGHT) 
    { 
     xpos=xpos+30; 
    } 

    if(e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_SPACE) 
    { 
     ypos=420; 
    } 
} 
} 

TIA

+0

1)'Thread.sleep (1000);'EDT (Event Dispatch Thread)를 막지 마라. GUI가 멈출 때 멈출 것이다. 'Thread.sleep (n)'을 호출하는 대신에 태스크를 반복하기 위해 Swing Timer를 구현하거나 장시간 실행되는 태스크를 위해 SwingWorker를 구현하십시오. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. 2)이 천년기에 스윙 (JApplet)보다는 AWT (애플릿)이 필요한 이유는 무엇입니까? 3) 편의성과 최상의 사용자 경험을 위해'JApplet' 또는'Applet' 대신'JFrame'과 [JWS] (http://stackoverflow.com/tags/java-web-start/info)를 사용하지 않을까요? –

답변

0

코드는 단 하나의 블록을 그립니다. 생성 된 모든 블록의 좌표를 저장하고 모든 게임 프레임에서 다시 그려야합니다.