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
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)를 사용하지 않을까요? –