📄 main.java
字号:
package xn.tetris;
import java.io.IOException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
/**
* 主类
* 此类完成控制面板的界面
* 及各种事件处理
* */
public class Main {
private Menu menuBar, fileMenu, helpMenu;
private MenuItem fileMenuHeader, helpMenuHeader;
private MenuItem fileExitItem, aboutItem, helpItem;
Display display;
Shell shell;
private Canvas tetrisBoardCanvas;
private Canvas nextBoardCanvas;
private Button btStartPause;
private Label lbScore;
private Label lbLevel;
private int score;
private int level;
private int highestScore;
private int highestLevel;
private String creator;
private GC tetrisGC;
private GC nextGC;
private Game game;
private Label lbHighestScoreInfo;
private Label lbHighestScore;
private Label lbHighestLevel;
private Label lbCreator;
private SaveFileIO io;
private String[] info;
public Main(){
io = new SaveFileIO();
try {
info = io.readFromFile();
creator = info[0];
highestScore = Integer.valueOf(info[1]);
highestLevel = Integer.valueOf(info[2]);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
init();
}
//初始化,画出控制面板界面
public void init(){
display = new Display();
shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE &
~SWT.MAX );
shell.setText("myTetris");
shell.setMinimumSize(600, 600);
GridLayout gdLayout = new GridLayout(2, true);
int xCenter = shell.getSize().x / 8;
int yCenter = shell.getSize().y / 8;
shell.setLocation(xCenter, yCenter);
shell.setLayout(gdLayout);
createMenuBar();
tetrisBoardCanvas = new Canvas(shell, SWT.NONE);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.verticalSpan = 9;
gd.heightHint = 600;
gd.widthHint = 300;
tetrisBoardCanvas.setBackground(new Color(display, 0, 0, 0));
tetrisBoardCanvas.setLayoutData(gd);
nextBoardCanvas = new Canvas(shell, SWT.NONE);
gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
gd.heightHint = 150;
gd.widthHint = 150;
nextBoardCanvas.setBackground(new Color(display, 0, 0, 0));
nextBoardCanvas.setLayoutData(gd);
score = 0;
lbScore = new Label(shell, SWT.NONE);
lbScore.setText("Score: " + score);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = 150;
gd.horizontalIndent = 80;
gd.verticalIndent = 20;
lbScore.setLayoutData(gd);
level = 1;
lbLevel = new Label(shell, SWT.NONE);
lbLevel.setText("Level: " + level);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = 150;
gd.horizontalIndent = 80;
gd.verticalIndent = 20;
lbLevel.setLayoutData(gd);
btStartPause = new Button(shell, SWT.PUSH);
btStartPause.setText("Start");
gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER );
gd.widthHint = 100;
gd.verticalIndent = 50;
btStartPause.setLayoutData(gd);
lbHighestScoreInfo = new Label(shell, SWT.NONE);
lbHighestScoreInfo.setText("Best Result:");
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = 150;
gd.horizontalIndent = 45;
gd.verticalIndent = 50;
lbHighestScoreInfo.setLayoutData(gd);
lbHighestScore = new Label(shell, SWT.NONE);
lbHighestScore.setText("Score: " + highestScore);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = 150;
gd.horizontalIndent = 80;
gd.verticalIndent = 15;
lbHighestScore.setLayoutData(gd);
lbHighestLevel = new Label(shell, SWT.NONE);
lbHighestLevel.setText("Level: " + highestLevel);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = 150;
gd.horizontalIndent = 80;
gd.verticalIndent = 15;
lbHighestLevel.setLayoutData(gd);
lbCreator = new Label(shell, SWT.NONE);
lbCreator.setText("Creator: " + creator);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = 180;
gd.horizontalIndent = 68;
gd.verticalIndent = 15;
lbCreator.setLayoutData(gd);
game = new Game(10, 20, display, this);
tetrisGC = new GC(tetrisBoardCanvas);
nextGC = new GC(nextBoardCanvas);
addListeners();
shell.pack();
shell.open();
retainShell();
}
public void retainShell(){
while(!shell.isDisposed()){
if(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
//设置最高分数的显示
public void setHighestScore(int score){
lbHighestScore.setText("Score: " + score);
}
//设置分数的显示
public void setScoreText(int score){
lbScore.setText("Score: " + score);
}
//设置玩家玩到的最高等级显示
public void setHighestLevel(int level){
lbHighestLevel.setText("Level: " + level);
}
//设置最高分玩家姓名
public void setCreatorName(String name){
lbCreator.setText("Creator: " + name);
}
//设置等级的显示
public void setLevelText(int level){
lbLevel.setText("Level: " + level);
}
//设置按钮上的文字
public void setBtStartPauseText(String text){
btStartPause.setText(text);
}
//得到游戏主面板的画布
public Canvas getTetrisBoardCanvas(){
return tetrisBoardCanvas;
}
//得到显示下一个方块面板的画布
public Canvas getNextBoardCanvas(){
return nextBoardCanvas;
}
// 创建menu bar
private void createMenuBar(){
menuBar = new Menu(shell, SWT.BAR);
fileMenuHeader = new MenuItem(menuBar, SWT.CASCADE);
fileMenuHeader.setText("文件");
fileMenu = new Menu(shell, SWT.DROP_DOWN);
fileMenuHeader.setMenu(fileMenu);
fileExitItem = new MenuItem(fileMenu, SWT.PUSH);
fileExitItem.setText("退出");
helpMenuHeader = new MenuItem(menuBar, SWT.CASCADE);
helpMenuHeader.setText("帮助");
helpMenu = new Menu(shell, SWT.DROP_DOWN);
helpItem = new MenuItem(helpMenu, SWT.PUSH);
helpItem.setText("操作方法");
helpMenuHeader.setMenu(helpMenu);
aboutItem = new MenuItem(helpMenu, SWT.PUSH);
aboutItem.setText("关于");
shell.setMenuBar(menuBar);
}
//添加监听器
public void addListeners() {
tetrisBoardCanvas.addKeyListener(new ControlGameByKey());
tetrisBoardCanvas.addPaintListener(new PaintTetrisBoard());
nextBoardCanvas.addPaintListener(new PaintNextBoard());
fileExitItem.addSelectionListener(new FileExitItemAdapter());
aboutItem.addSelectionListener(new AboutItemAdapter());
helpItem.addSelectionListener(new HelpItemAdapter());
btStartPause.addSelectionListener(new StartPauseAdapter());
shell.addListener(SWT.Close, new SwtCloseAdapter());
}
//键盘事件处理
class ControlGameByKey extends KeyAdapter{
public void keyPressed(KeyEvent e) {
game.controlGame(e);
}
}
//tetrisBoardCanvas上的重绘事件处理
class PaintTetrisBoard implements PaintListener{
public void paintControl(PaintEvent e) {
MyGC.setMyGC(tetrisGC);
if(!game.isPlaying()){
if(!game.isGameOver()){
game.tetrisBoard.drawMessage("Press Start");
}
else{
game.tetrisBoard.draw();
game.tetrisBoard.drawMessage("Game Over");
}
}
else{
if(game.isPaused()){
game.tetrisBoard.draw();
game.currentBlock.draw();
game.tetrisBoard.drawMessage("Paused");
}
else{
game.currentBlock.draw();
game.tetrisBoard.draw();
}
}
}
}
//nextBlockBoardCanvas上的重绘事件处理
class PaintNextBoard implements PaintListener{
public void paintControl(PaintEvent e) {
// TODO Auto-generated method stub
MyGC.setMyGC(nextGC);
if(game.isGameOver()){
game.nextBoard.clear();
}
else if(!game.isPlaying()){
game.nextBoard.clear();
}
else{
game.nextBoard.draw();
}
MyGC.setMyGC(tetrisGC);
}
}
// 红叉按钮事件处理
class SwtCloseAdapter extends SelectionAdapter implements Listener{
public void handleEvent(Event event) {
display.dispose();
game.quit();
tetrisGC.dispose();
nextGC.dispose();
}
}
//退出按钮事件处理
class FileExitItemAdapter extends SelectionAdapter{
public void widgetSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
display.dispose();
game.quit();
tetrisGC.dispose();
nextGC.dispose();
}
}
//关于按钮事件处理
class AboutItemAdapter extends SelectionAdapter{
public void widgetSelected(SelectionEvent arg0) {
if(game.isPlaying() && !game.isPaused()){
game.pauseGame();
btStartPause.setText("Resume");
}
new AbortUI(display);
}
}
//操作方法按钮事件处理
class HelpItemAdapter extends SelectionAdapter{
public void widgetSelected(SelectionEvent arg0) {
if(game.isPlaying() && !game.isPaused()){
game.pauseGame();
btStartPause.setText("Resume");
}
new HelpUI(display);
}
}
// start按钮事件处理
class StartPauseAdapter extends SelectionAdapter{
public void widgetSelected(SelectionEvent arg0) {
if(!game.isPlaying()){
if(!game.isGameOver()){
game.startGame();
btStartPause.setText("Pause");
}
else{
game.gameOver();
if(game.isTryAgain()){
btStartPause.setText("Pause");
game.startGame();
}
}
}
else{
if(!game.isPaused()){
btStartPause.setText("Resume");
game.pauseGame();
}
else{
btStartPause.setText("Pause");
game.resumeGame();
}
}
tetrisBoardCanvas.forceFocus();//强制将焦点移到tetrisBoardCanvas上
tetrisBoardCanvas.redraw();
}
}
//主函数
public static void main(String[] args){
new Main();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -