Java小游戏编程

/**

*文件:ControlPanel.java

*用户:相思免费。

*日期:2004.12.3

*描述:俄罗斯方块的Java实现

*/

导入javax . swing . *;

导入javax . swing . border . border;

导入javax . swing . border . etchedborder;

导入Java . awt . *;

导入Java . awt . event . *;

/**

*控制面板类,继承自JPanel。

*在上面放预览窗口,成绩,分数,控制按钮。

*主要用于控制游戏进程。

*/

类控制面板扩展JPanel {

二等兵JTextField

TF level = new JTextField("+ers blocks game。默认_级别),

TF score = new JTextField(" 0 ");

私有JButton

btPlay = new JButton("Play "),

btPause = new JButton("Pause "),

btStop = new JButton("Stop "),

btTurnLevelUp = new JButton("转硬"),

btTurnLevelDown = new JButton(" Turn easy ");

private JPanel pl tip = new JPanel(new BorderLayout());

private TipPanel plTipBlock = new TipPanel();

private JPanel plInfo = new JPanel(new GridLayout(4,1));

private JPanel pl button = new JPanel(new GridLayout(5,1));

私人定时器Timer;

私人ErsBlocksGame游戏;

private Border Border = new etched Border(

EtchedBorder。凸起,Color.white,新颜色(148,145,140));

/**

*控制面板类的构造函数

* @ paramgameersblocksgame,ersboxesname类的实例引用,

*直接控制ErsBoxesGame类的行为很方便。

*/

公共控制面板(最终ErsBlocksGame游戏){

setLayout(new GridLayout(3,1,0,4));

this.game =游戏;

plTip.add(new JLabel("Next block "),BorderLayout。北);

pl tip . add(plTipBlock);

pl tip . set border(border);

plinfo . add(new JLabel(" Level "));

plinfo . add(TF level);

plinfo . add(new JLabel(" Score "));

plinfo . add(TF score);

plinfo . set border(border);

TF level . set editable(false);

TF score . set editable(false);

pl button . add(Bt play);

pl button . add(Bt pause);

pl button . add(Bt stop);

pl button . add(btTurnLevelUp);

pl button . add(btTurnLevelDown);

pl button . set border(border);

添加(pl tip);

添加(plInfo);

添加(pl button);

addkey listener(new controlkey listener());

Bt play . addactionlistener(new action listener(){

public void action performed(action event AE){

game . play game();

}

});

Bt pause . addactionlistener(new action listener(){

public void action performed(action event AE){

if (btPause.getText()。等于(新字符串(“暂停”)){

game . pausegame();

}否则{

game . resume game();

}

}

});

Bt stop . addactionlistener(new action listener(){

public void action performed(action event AE){

game . stop game();

}

});

btturnlevelup . addactionlistener(new action listener(){

public void action performed(action event AE){

尝试{

int level = integer . parse int(TF level . gettext());

如果(级别& ltErsBlocksGame。最高级别)

TF level . settext("+(level+1));

} catch(NumberFormatException e){

}

request focus();

}

});

btturnleveldown . addactionlistener(new action listener(){

public void action performed(action event AE){

尝试{

int level = integer . parse int(TF level . gettext());

if(level & gt;1)

TF level . settext("+(level-1));

} catch(NumberFormatException e){

}

request focus();

}

});

addComponentListener(new component adapter(){

public void component resized(component event ce){

pltipblock . fanning();

}

});

timer = new Timer(500,new ActionListener() {

public void action performed(action event AE){

TF score . settext("+game . get score());

int scoreForLevelUpdate =

game . getscoreforlevelupdate();

if(scoreForLevelUpdate & gt;= ErsBlocksGame。每级分数

& amp& ampscoreForLevelUpdate & gt0)

game . level update();

}

});

timer . start();

}

/**

*设置预览窗口的样式,

* @param style int,对应ErsBlock类样式中的28个值。

*/

public void setTipStyle(int style){

pltipblock . set style(style);

}

/**

*获取用户设置的游戏级别。

* @return int,难度等级,1-ersblockgame.max _ level。

*/

public int getLevel() {

int level = 0;

尝试{

level = integer . parse int(TF level . gettext());

} catch(NumberFormatException e){

}

回报水平;

}

/**

*让用户修改游戏的难度等级。

* @param level修改了游戏难度等级

*/

公共void setLevel(int level) {

if(level & gt;0 & amp& amp级别& lt11)TF level . settext("+level);

}

/**

*设置"开始"按钮的状态。

*/

public void setPlayButtonEnable(布尔启用){

btPlay.setEnabled(启用);

}

public void setPauseButtonLabel(布尔暂停){

btPause.setText(暂停?“暂停”:“继续”);

}

/**

*重置控制面板

*/

公共void重置(){

TF score . settext(" 0 ");

pltipblock . set style(0);

}

/**

*重新计算TipPanel中box[][]中小框的大小。

*/

公共void fanning() {

pltipblock . fanning();

}

/**

*预显示窗口实现细节类

*/

私有类TipPanel扩展JPanel {

私有颜色backColor = Color.darkGray,front Color = Color . light gray;

私有ErsBox[][]盒=

新的ErsBox[ErsBlock。box _ ROWS][ers block。box _ COLS];

private int style,boxWidth,boxHeight

private boolean isTiled = false

/**

*预览窗口类构造函数

*/

公共TipPanel() {

for(int I = 0;我& lt盒子.长度;i++) {

for(int j = 0;j & lt方框[i]。长度;j++)

box[I][j]= new ers box(false);

}

}

/**

*预览窗口类构造函数

* @param backColor Color,窗口的背景色。

* @param frontColor颜色,窗口的前景色。

*/

公共TipPanel(彩色背景色,彩色前景色){

this();

this . back color = back color;

this . front color = front color;

}

/**

*设置预览窗口的框样式。

* @param style int,对应ErsBlock类样式中的28个值。

*/

public void setStyle(int style) {

this.style = style

repaint();

}

/**

*覆盖JComponent类和draw组件的功能。

* @param g图形设备环境

*/

public void paint component(Graphics g){

super . paint component(g);

如果(!isTiled)fanning();

int key = 0x8000

for(int I = 0;我& lt盒子.长度;i++) {

for(int j = 0;j & lt方框[i]。长度;j++) {

color color =(((key & amp;风格)!= 0) ?front color:back color);

g.setColor(颜色);

g.fill3DRect(j * boxWidth,i * boxHeight,

boxWidth,boxHeight,true);

key & gt& gt= 1;

}

}

}

/**

*根据窗口的大小,自动调整网格的大小。

*/

公共void fanning() {

boxWidth = getSize()。宽度/ ErsBlock。BOXES _ COLS

boxHeight = getSize()。身高/身高块。BOXES _ ROWS

isTiled = true

}

}

私有类ControlKeyListener扩展KeyAdapter {

公共void按键(按键事件ke) {

如果(!game.isPlaying())返回;

ers block block = game . getcurblock();

switch (ke.getKeyCode()) {

案例关键事件。VK _唐:

block . move down();

打破;

案例关键事件。VK _左:

block . move left();

打破;

案例关键事件。VK右:

block . moveright();

打破;

案例关键事件。VK_UP:

block . turn next();

打破;

默认值:

打破;

}

}

}

}