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();
打破;
默认值:
打破;
}
}
}
}