You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

253 lines
7.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.event.*;
import util.Constant;
import model.Block;
/**
* 自定义类
*
*/
//定义自定义对话框类Zidingyi继承自JDialog实现ActionListener接口
public class Zidingyi extends JDialog implements ActionListener{
// 创建多个面板用于不同功能设置
JPanel jp_sudu=new JPanel();
JPanel jp_rank=new JPanel();
JPanel jp_she=new JPanel();
JPanel jp_b=new JPanel();
// 创建单选按钮用于等级选择
JRadioButton jr_rank1=new JRadioButton("初级");
JRadioButton jr_rank2=new JRadioButton("中级");
JRadioButton jr_rank3=new JRadioButton("高级");
// 创建滑动条用于速度调节
JSlider jsl=new JSlider(1,10);//滑动框1-10
int newspeed;// 存储新的速度值
Block block;// 引用Block类对象用于游戏中的方块
GameCanvas gc;// 引用GameCanvas类对象用于游戏界面显示
ButtonGroup bg_rank=new ButtonGroup(); // 创建ButtonGroup管理单选按钮
JLabel tj_sudu=new JLabel("下落速度");// 速度标签
// 创建复选框用于附加功能开关
JCheckBox jc1=new JCheckBox("方块是否自动上涨");
JCheckBox jc2=new JCheckBox("游戏过程是否播放声音");
JCheckBox jc3=new JCheckBox("更换背景");
// 图片资源引用
ImageIcon image=new ImageIcon(Constant.backGround1);
JLabel label=new JLabel(image);// 使用图片作为背景的标签
// 构造函数初始化对话框和组件
public Zidingyi(JFrame j,String s,boolean a,Block block,GameCanvas gc){
super(j,s,a);
this.setBounds(0,170, 480, 350);// 设置对话框大小和位置
this.setVisible(false);// 初始时对话框不可见
this.setResizable(false);// 对话框不可调整大小
this.setLayout(null); // 使用null布局管理器
this.block=block;// 初始化Block对象引用
this.gc=gc;// 初始化GameCanvas对象引用
label.setBounds(0, 0, this.getWidth(), this.getHeight());// 设置背景图片大小与对话框一致
// 添加各个面板到对话框中
add1();
add2();
add3();
add4();
}
/**
* 调节速度面板
*/
public void add1(){
jp_sudu.setBounds(0, 40, 500, 80);// 设置面板位置和大小
jp_sudu.add(tj_sudu);
tj_sudu.setFont(new Font("华文行楷", Font.BOLD, 15));// 设置字体
jsl.setValue(11-Constant.step);// 设置滑动条初始值
newspeed=11-jsl.getValue();// 获取新的速度值
// 添加滑动条监听器以响应速度变化
jsl.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent ce) {
// TODO Auto-generated method stub
newspeed=11-jsl.getValue();// 更新速度值
}
});
jsl.setMajorTickSpacing(9);// 设置主刻度间隔
jsl.setMinorTickSpacing(1);// 设置次刻度间隔
jsl.setPaintTicks(true);// 显示刻度标记
jsl.setPaintLabels(true);// 显示刻度标签
jp_sudu.add(jsl);
// 添加速度说明标签
JLabel tj_sudu1=new JLabel("速度1到10依次加快");
tj_sudu1.setFont(new Font("华文行楷", Font.BOLD, 15));
// 添加所有组件到面板并将其添加到对话框中
jp_sudu.add(tj_sudu1);
this.add(jp_sudu);
}
/**
* 设置等级面板
*/
public void add2(){
// 设置面板位置、大小和组件
JPanel jp_rank=new JPanel();
jp_rank.setBounds(90, 140, 300, 30);
JLabel tj_shape=new JLabel("方块形状");
tj_shape.setFont(new Font("华文行楷", Font.BOLD, 15));
int i=Block.get_addl();// 获取当前难度级别
// 单选按钮监听器及设置
jr_rank1.addActionListener(this);
jr_rank1.setActionCommand("初级");
jr_rank2.addActionListener(this);
jr_rank2.setActionCommand("中级");
jr_rank3.addActionListener(this);
jr_rank3.setActionCommand("高级");
// 根据当前等级预选单选按钮
if(i==7)
jr_rank1.setSelected(true);
else if(i==10)
jr_rank2.setSelected(true);
else
jr_rank3.setSelected(true);
bg_rank.add(jr_rank1);
bg_rank.add(jr_rank2);
bg_rank.add(jr_rank3);
jp_rank.add(tj_shape);
jp_rank.add(jr_rank1);
jp_rank.add(jr_rank2);
jp_rank.add(jr_rank3);
// 设置单选按钮位置
jr_rank1.setBounds(0, 0, 80, 30);
jr_rank2.setBounds(90, 0, 80, 30);
jr_rank3.setBounds(180, 0, 80, 30);
this.add(jp_rank);
}
/**
* 附加功能面板
*/
public void add3(){
JPanel jp_she=new JPanel();
// 复选框监听器及设置
jp_she.setBounds(20, 190, 400, 30);
jc1.addActionListener(this);
if(MyFrame.high==true)
jc1.setSelected(true);
else
jc1.setSelected(false);
jc1.setBounds(0, 0, 160, 30);
jp_she.add(jc1);
jc2.addActionListener(this);
jp_she.add(jc2);
if(MyFrame.isMusic==true)
jc2.setSelected(true);
else
jc2.setSelected(false);
if(MyFrame.changeBack==true)
jc3.setSelected(true);
else
jc3.setSelected(false);
jc3.addActionListener(this);
// 添加复选框到面板
jp_she.add(jc3);
this.add(jp_she);
}
/**
* 确定,取消按钮
*/
public void add4(){
JPanel jp_b=new JPanel();
jp_b.setBounds(100, 240, 300, 40);
JButton jb_y=new JButton("确定");
jb_y.addActionListener(this);
jp_b.add(jb_y);
JButton jb_n=new JButton("取消");
jb_n.addActionListener(this);
jp_b.add(jb_n);
// 创建包含所有面板的容器面板,并添加到对话框中
JPanel jp_zi=new JPanel();
jp_zi.setLayout(null);
jp_zi.setBounds(0, 0, this.getWidth(), this.getHeight());
jp_zi.add(jp_sudu);
jp_zi.add(jp_rank);
jp_zi.add(jp_she);
jp_zi.add(jp_b);
this.add(jp_zi);
}
// 实现ActionListener接口方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() instanceof JButton) {
int i=Block.get_addl();
String buttonCommand = e.getActionCommand();//获取信息
if (buttonCommand.equals("确定")) {
// 处理确定按钮点击事件
String actionCommand = bg_rank.getSelection().getActionCommand();
// 根据用户选择的等级更新Block对象的等级属性
if (actionCommand.equals("初级") ) {
Block.set_addl(7);
} else if (actionCommand.equals("中级")) {
Block.set_addl(10);
} else if (actionCommand.equals("高级")) {
Block.set_addl(13);
}
// 更新附加功能状态
if (jc1.isSelected()) {
MyFrame.high=true;
}else
MyFrame.high=false;
if (!jc2.isSelected()) {
MyFrame.isMusic=false;
}else
MyFrame.isMusic=true;
if(jc3.isSelected()){
MyFrame.changeBack=true;
MyFrame.background = new ImageIcon(Constant.backGround2);
MyFrame.setBackGround();}
else
{MyFrame.changeBack=false;
MyFrame.background = new ImageIcon(Constant.backGround1);
MyFrame.setBackGround();}
// 更新速度值和游戏相关属性
Constant.step=newspeed;
jsl.setValue(11-Constant.step);
MyFrame.rank=11-Constant.step;
MyFrame.jt10.setText("等级:"+MyFrame.rank);
this.dispose();
} else if (buttonCommand.equals("取消")) {
// 恢复原有设置并关闭对话框
Block.set_addl(i);
if(i==7)
jr_rank1.setSelected(true);
else if(i==10)
jr_rank2.setSelected(true);
else
jr_rank3.setSelected(true);
this.dispose();
}
}
}}