一、实现思路(emmmm,这个地方我很大程度参照了别人的写法)

   由于键盘按键众多,因此使用选择框JComboBox 进行按键选择,点击一个JButton 按钮后,读取所有选择框中的内容,然后存到一个用于保存键位设置的对象Key中,然后在坦克移动的时候根据对象Key中的数据判断对坦克的操作。

    同时,为了保证每次打开游戏时,能够保留上一次的按键设置,使用对象流将对象Key存入文件,以后创建KeySet的对象后,从文件中读取保存对象Key的信息,并使用;如果文件不存在或者文件为空,那么就重新new一个Key对象,并在用户确定按键设置后将新的Key对象存入文件中,以便下一次打开。

  同时,我们也需要绘制选择界面,首先就是将选择框JComboBox 以及按钮JButton 加入JFrame里面,并设置好位置等等,同时我们需要提示用户当前的按键是什么,为了简单,直接paint到JFrame里面了。

二、JComboBox的使用

  1) JComboBox  UP =  new JComboBox<String>()

      创建类JComboBox的对象,用String代表选择内容的类型,这里用的是String型

    2) UP.setFont(new Font(Font.SERIF, Font.BOLD, 20));

      设置选择框中字体的类型

    3)   UP.setBounds(100, 100, 150, 50);

      设置选择框的大小和相对位置,相对位置为相对于JFrame的位置

    4)   UP.addItem("VK_UP");

      像选择框中添加选择,这里我添加了上移键的默认位置 VK_UP就是键盘上的那个向上的箭头

    5)  jframe.add(UP);

      jrame就是JFrame的对象,我们需要把选择框加入其中,才可以让别人看得见并进行操作

    6)  String up = (String) UP.getSelectedItem();

      获取选择框的选择内容,并转型,因为返回值是Object类型的

 三、一些次要的功能

  1)错误提示

    比如选择按键的时候,同一个按键实现了两个功能,就会出现如下的情况

    同时,出现了用户名没有输入或者为空的时候也会进行提示,如下

    实现方法:JOptionPane.showMessageDialog(jframe, "按键重复!", "警告", 0);

      第一个参数代表要显示在的窗口,第二个参数为提示信息,第三个参数为标题,第四个参数为提示信息类型

  2)音乐播放

    this.music = new Music(11);

     music.start();

    构造方法中参数为音乐类型,Music为自定义的类,具体请参考另一篇博文

    通过start()方法用多线程开始播放音乐。

public void actionPerformed(ActionEvent e) {
if(e.getSource() == music_button) {
if(tot++ % 2 == 0) {
music.close();
}else {
music.open();
}
}
  ......
}

    这个地方设置了一个musci_button的按钮,就是图中左上角的那个,实现点击后暂停或者重新播放。

四、效果展示

 五、代码区

   类Key

package component;

import java.awt.event.KeyEvent;
import java.io.Serializable; public class Key implements Serializable{
private static final long serialVersionUID = 1L;
public int MY_UP;
public int MY_DOWN;
public int MY_LEFT;
public int MY_RIGHT;
public int MY_ATTACK;
public Key() {
MY_UP = KeyEvent.VK_UP;
MY_DOWN = KeyEvent.VK_DOWN;
MY_LEFT = KeyEvent.VK_LEFT;
MY_RIGHT = KeyEvent.VK_RIGHT;
MY_ATTACK = KeyEvent.VK_SPACE;
}
public Key(int MY_UP,int MY_DOWN,int MY_LEFT,int MY_RIGHT,int MY_ATTACK) {
this.MY_UP = MY_UP;
this.MY_DOWN = MY_DOWN;
this.MY_LEFT = MY_LEFT;
this.MY_RIGHT = MY_RIGHT;
this.MY_ATTACK = MY_ATTACK;
}
}

  类KeySet

package component;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*; public class KeySet extends JPanel implements ActionListener{
private static final long serialVersionUID = 1675L;
private Key key = null;
private JFrame jframe;
private JComboBox<String> UP;
private JComboBox<String> RIGHT;
private JComboBox<String> DOWN;
private JComboBox<String> LEFT;
private JComboBox<String> ATTACK;// 攻击
private JTextField txt = null;// 输入名字
private JButton ENSURE;
private JButton music_button = new JButton("");
private Music music;
private static int tot = 0; public static void main(String[] args) {
new KeySet();
} public KeySet() {
this.readData();
this.music = new Music(11);
music.start();
jframe = new JFrame("设置");
jframe.setSize(1200, 600);
jframe.setLocationRelativeTo(null);// 不可扩大
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setLayout(null); ENSURE = new JButton("保存");// 确定按键
ENSURE.setFont(new Font(Font.SERIF, Font.BOLD, 20));// 设置字体
ENSURE.setBounds(100, 400, 100, 50);// 设置按钮
jframe.add(ENSURE);
ENSURE.addActionListener(this); UP = new JComboBox<String>();
UP.setFont(new Font(Font.SERIF, Font.BOLD, 20));
UP.addItem("VK_UP");// 初始值
UP.setBounds(100, 100, 150, 50);
addChoose(UP);// 添加备选项 RIGHT = new JComboBox<String>();
RIGHT.setFont(new Font(Font.SERIF, Font.BOLD, 20));
RIGHT.addItem("VK_RIGHT");
RIGHT.setBounds(400, 200, 150, 50);
addChoose(RIGHT); DOWN = new JComboBox<String>();
DOWN.setFont(new Font(Font.SERIF, Font.BOLD, 20));
DOWN.addItem("VK_DOWN");
DOWN.setBounds(400, 100, 150, 50);
addChoose(DOWN); LEFT = new JComboBox<String>();
LEFT.setFont(new Font(Font.SERIF, Font.BOLD, 20));
LEFT.addItem("VK_LEFT");
LEFT.setBounds(100, 200, 150, 50);
addChoose(LEFT); ATTACK = new JComboBox<String>();
ATTACK.setFont(new Font(Font.SERIF, Font.BOLD, 20));
ATTACK.addItem("VK_SPACE");
ATTACK.setBounds(100, 300, 150, 50);
addChoose(ATTACK); txt = new JTextField("用户名");
txt.setBounds(400, 300, 150, 50);
txt.setFont(new Font(Font.SERIF, Font.BOLD, 20)); //music_button.setBackground(Color.CYAN);
music_button.setBounds(0, 0, 75, 75);
music_button.setIcon(new ImageIcon("img/music2.png"));
music_button.addActionListener(this); jframe.add(UP);
jframe.add(RIGHT);
jframe.add(DOWN);
jframe.add(LEFT);
jframe.add(ATTACK);
jframe.add(txt);
jframe.add(music_button); this.setBounds(0, 0, 1200, 600);
jframe.add(this); // 将画板加入画笔
jframe.repaint();
jframe.setVisible(true); } public void paint(Graphics g) {
Font f = new Font(Font.SERIF,Font.BOLD,20);
g.setFont(f);
g.drawString("上移键:", 100, 80);
g.drawString("下移键:", 400, 80);
g.drawString("左移键:", 100, 180);
g.drawString("右移键:", 400, 180);
g.drawString("攻击键:", 100, 280);
g.drawString("名字:",400,280);//画出选项 String up = "向上键 VK_"+(char)key.MY_UP+" ";
String down = "向下键 VK_"+(char)key.MY_DOWN+" ";
String left = "向左键 VK_"+(char)key.MY_LEFT+" ";
String right = "向右键 VK_"+(char)key.MY_RIGHT+" ";
String attack = "攻击键 VK_" +(char)key.MY_ATTACK+" ";
System.out.println(key.MY_ATTACK); g.drawString("当前键:", 600, 150);//画出当前选择
if(key.MY_UP == 38) {
g.drawString("向上: VK_UP", 600, 200);
}
else {
g.drawString(up, 600, 200);
}
if(key.MY_DOWN == 40) {
g.drawString("向下: VK_DOWN", 800, 200);
}
else {
g.drawString(down, 800, 200);
}
if(key.MY_LEFT == 37) {
g.drawString("向左: VK_LEFT",600,250);
}
else {
g.drawString(left, 600, 250);
}
if(key.MY_RIGHT == 39) {
g.drawString("向右: VK_RIGHT",800,250);
}
else {
g.drawString(right, 800, 250);
}
if(key.MY_ATTACK == 32) {
g.drawString("攻击: 空格",700,300);
}
else {
g.drawString(attack, 700, 300);
}
} // 判断按键是否重复
private boolean judge() {
String a = (String) UP.getSelectedItem();
String b = (String) RIGHT.getSelectedItem();
String c = (String) DOWN.getSelectedItem();
String d = (String) LEFT.getSelectedItem();
String e = (String) ATTACK.getSelectedItem();
if (a.equals(b) || a.equals(c) || a.equals(d) || a.equals(e)) {
return true;
} else if (b.equals(c) || b.equals(d) || b.equals(e)) {
return true;
} else if (c.equals(d) || c.equals(e) || c.equals(e)) {
return true;
}
return false;
} private void addChoose(JComboBox<String> now) {
for (int i = 0; i <= 9; i++) {
now.addItem(String.valueOf(i));// 添加 1 - 9
}
for (int i = 65; i <= 90; i++) {
now.addItem((char) (i) + " "); // 添加'A' ~ 'Z'
}
} // 读入本地文件 如果文件不存在 就创建一个新的key
private boolean readData() {
File file = new File("key.txt");
if(!file.exists() || file.length() == 0) {
try {
file.createNewFile();
key = new Key();
saveData();
return true;
} catch (IOException e) {
e.printStackTrace();
}
} ObjectInputStream ois = null;// 读入流
try {
FileInputStream fis = new FileInputStream("key.txt");
ois = new ObjectInputStream(fis);
key = (Key) ois.readObject(); // 读入 } catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
this.saveData(); // 保存
}
return true;
} private boolean saveData() {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("key.txt"));
oos.writeObject(key);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
} @Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == music_button) {
if(tot++ % 2 == 0) {
music.close();
}else {
music.open();
}
}else if(e.getSource() == ENSURE) {
if (judge()) {
JOptionPane.showMessageDialog(jframe, "按键重复!", "警告", 0);
} else if (txt.getText().equals("") || txt.getText().equals("用户名")) {
JOptionPane.showMessageDialog(jframe, "请输入用户名", "警告", 0);
} else {// 只有一个按键
String up = (String) UP.getSelectedItem();// 获取向上
if (!up.equals("VK_UP")) { // 不是默认值
char a = up.charAt(0); // 获取选中的
key.MY_UP = (int) a; // 用int保存
} else {
key.MY_UP = 38;
}
String down = (String) DOWN.getSelectedItem();// 获取向下的操作
if (!down.equals("VK_DOWN")) {
char a = down.charAt(0);
key.MY_DOWN = (int) a;
} else {
key.MY_DOWN = 40;
}
String left = (String) LEFT.getSelectedItem();
if (!left.equals("VK_LEFT")) {
char a = left.charAt(0);
key.MY_LEFT = (int) a;
} else {
key.MY_LEFT = 37;
}
String right = (String) RIGHT.getSelectedItem();
if (!right.equals("VK_RIGHT")) {
char a = right.charAt(0);
key.MY_RIGHT = (int) a;
} else {
key.MY_RIGHT = 39;
}
String attack = (String) ATTACK.getSelectedItem();
if (!attack.equals("VK_SPACE")) {
char a = attack.charAt(0);
key.MY_ATTACK = (int) a;
System.out.println((char)a + " " + attack);
} else {
key.MY_ATTACK = 32;
}
String name = txt.getText();
System.out.println(name); saveData();// 存入文件
music.close();
new Choose(name,key); // 进入关卡选择
jframe.dispose();
} } } }

最新文章

  1. nginx负载下站点错误响应会导致其他节点重复响应问题的解决过程
  2. UICollectionView 简单使用
  3. 纯CSS制作“跳动的心”demo
  4. Python+Bottle+Sina SAE快速构建网站
  5. JavaSE replaceAll 方法
  6. POJ 3267 The Cow Lexicon 简单DP
  7. 使用atomic一定是线程安全的吗
  8. hdu 1242 Rescue_bfs+优先队列
  9. Python高手之路【十二】面向对象设计模式
  10. JQuery选择所有标题的元素
  11. 通过js来设置cookie和读取cookie,实现登陆时记住密码的功能
  12. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
  13. webpack学习笔记 ——篇2
  14. Spring Boot笔记六:Thymeleaf介绍
  15. ES6的let和const的不同点
  16. 51nod 1344
  17. as3.0橡皮擦功能
  18. python--求参赛两队所有可能的比赛组合情况
  19. 根据twitter的snowflake算法生成唯一ID
  20. 术语-软件-软件开发:SDK(软件开发工具包)

热门文章

  1. 灰度图像--图像分割 Marr-Hildreth算子(LoG算子)
  2. 2019暑假集训 windy数
  3. fiddler(四)、断点(转)
  4. JavaWeb_(Hibernate框架)Hibernate中事务
  5. Jmeter -- 脚本录制
  6. 【软件工程】Alpha冲刺(2/6)
  7. koa 基础(十六)koa 中 session 的使用
  8. python 类中__call__内置函数的使用
  9. IPV6测试方法
  10. 无缝滚动的float属性