应一起学习java的众兄弟姐妹们的要求,对塔防游戏小程序做一个简单的说明,本人学习java两年时间,现在刚刚入职,虽然上班基本不用java swing相关的知识,但由于大学期间运用awt、swing编写小游戏的那种成就感与喜悦使我仍然对编写小游戏有着很强烈的兴趣,编程么,没有什么比编写游戏更吸引人了(I think so),大学期间,当我第一次接触java图形化界面(awt)时,心里很是激动,那是我在校期间头一次感觉到自己写的程序与应用软件有点联系了,因为之前已经写了一年的控制台程序,整天scanf、printf什么的,那时候俄罗斯方块在我心目中一直是个神话,往事不堪回首啊。。。
        当然,对于喜欢编游戏的朋友们,我还是推荐从简单到复杂,我是先后编写的贪吃蛇、俄罗斯方块(这两个比较经典了)、扫雷(这个可以编,只要你会一点awt,基本就是按钮+递归)、超级玛丽(背景不会移动)、坦克大战(这个绝对没看马士兵视频)、愤怒的小鸟(障碍物不会动)、塔防那款(这些游戏在我的资源里都有),超级玛丽后是我看过魔乐科技超级玛丽教学后编写完成的,这个视频对我编写贴图游戏有很大的帮助,内面有关于双缓冲图片、图片刷新的讲解,建议大家可以看一下。

接下来简单说一下我编游戏的基本步骤吧,希望对大家有帮助,我编写的基本都是贴图游戏,所谓贴图游戏也就是把图片一张一张画到窗体中(包括背景、敌人、障碍物),我在绘制的时候要用到双缓冲技术,简单说一下我对双缓冲的理解,我是按照视频上学来的方法,首先创建一张缓冲图片,然后将游戏所需要绘制的图片全部画到缓冲图片中,最后将缓冲图片画到窗体,这样做的目的是为了避免图片闪烁,因为这样每次都是将一张完整的图片绘制到窗体,如果不用这张缓冲图片,也就是将背景、敌人、障碍物等元素逐一绘制到窗体的话,由于不同元素绘制不是同时的(有先后顺序),所以会产生图片闪烁的现象,上一段代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class BaseFrame extends JFrame {
/**
* 构造函数
*/
public BaseFrame() {
this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
this.setVisible(true); // 设置窗体可见
}
/**
* 绘制方法
*/
public void paint(Graphics gr) {
BufferedImage image = new BufferedImage(500, 500,
BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
/*
*
* 这里面就可以画东西了,而且时候到image缓冲图片上,想画什么查阅java API里的Graphics 例如
* g2.drawRect(50, 50, 100, 100);
*/
g2.setColor(Color.WHITE); // 设置画笔颜色
g2.drawRect(50, 50, 100, 100);
g2.fillRect(200, 200, 100, 100);
gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
}
public static void main(String[] args) {
new BaseFrame();
}
}

这个差不多算是我编写游戏的基本架构,创建一个窗体,绘制一张缓冲图片到窗体,而且获取到了缓冲图片的画笔,这样你就可以用画笔画你需要的形状或是图片了。如果想让绘制的东西动起来,可以通过加入线程来实现,改变绘制物体的坐标,最重要一点不要忘记repaint;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class BaseFrame extends JFrame implements Runnable {
/**
* 绘制方块x坐标
*/
private int x = 30;
/**
* 绘制方块y坐标
*/
private int y = 30;
/**
* 构造函数
*/
public BaseFrame() {
this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
this.setVisible(true); // 设置窗体可见
Thread thread = new Thread(this); //创建线程
thread.start(); //启动线程
}
/**
* 绘制方法
*/
public void paint(Graphics gr) {
BufferedImage image = new BufferedImage(500, 500,
BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
/*
*
* 这里面就可以画东西了,而且时候到image缓冲图片上,想画什么查阅java API里的Graphics 例如
* g2.drawRect(50, 50, 100, 100);
*/
g2.setColor(Color.WHITE); // 设置画笔颜色
g2.fillRect(x, y, 100, 100);
gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
}
/**
* 线程执行方法
*/
public void run() {
try {
while (true) {
x++;
y++;
if (x > 400 || y > 400) {
x = 0;
y = 0;
}
this.repaint();
Thread.sleep(50); //while(true)的循环里一点要记得sleep一会,要不然太可怕了。。。
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new BaseFrame();
}
}

这个就实现了让图片动起来,但是这顶多算是一个动画,因为没有交互性,游戏是人来玩的嘛,这个可以通过加入事件来完成,下面加入一个键盘事件:

接下来,就是见证奇迹的时刻

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class BaseFrame extends JFrame implements Runnable, KeyListener {
/**
* 绘制方块x坐标
*/
private int x = 200;
/**
* 绘制方块y坐标
*/
private int y = 200;
/**
* 构造函数
*/
public BaseFrame() {
this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
this.setVisible(true); // 设置窗体可见
this.addKeyListener(this); // 添加键盘监听器
Thread thread = new Thread(this); // 创建线程
thread.start(); // 启动线程
}
/**
* 绘制方法
*/
public void paint(Graphics gr) {
BufferedImage image = new BufferedImage(500, 500,
BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
g2.setColor(Color.WHITE); // 设置画笔颜色
g2.fillRect(x, y, 100, 100);
gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
}
/**
* 线程执行方法
*/
public void run() {
try {
while (true) {
this.repaint();
Thread.sleep(50);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 按下时调用
*/
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
// System.out.println(keyCode); // 打印按键的keyCode
if (keyCode == 38) { // 上按键
y--;
}
if (keyCode == 40) { // 下按键
y++;
}
if (keyCode == 37) { // 左按键
x--;
}
if (keyCode == 39) { // 右按键
x++;
}
}
/**
* 释放按键时调用
*/
public void keyReleased(KeyEvent e) {
}
/**
* 不解释
*/
public void keyTyped(KeyEvent e) {
}
public static void main(String[] args) {
new BaseFrame();
}
}

这个程序可以用上下左右按键控制方块移动了,运用这些知识基本可以搞定贪吃蛇、俄罗斯方块了,想再来复杂的可以学习一下鼠标监听器,祝你成功。

如何用java编写小游戏相关推荐

  1. 用java编写运行的小游戏_第一次用Java编写小游戏!

    哈哈,我又来发帖了- -话说好久没碰eclipse了,所以这次就给大家带来一个我的原创作品:Java猜拳!!! 先上效果: 1.PNG (13.21 KB, 下载次数: 34) 2016-1-24 1 ...

  2. java 制作小游戏_如何用java制作小游戏

    展开全部 import javax.swing.Icon; import javax.swing.JOptionPane; public class CaiShuZi4JOptionPane { /* ...

  3. java入门教程:如何用java编写一款王者荣耀游戏?

    Java是一种编程语言,被特意设计用于互联网的分布式环境.Java具有类似于C++语言的"形式和感觉",但它要比C++语言更易于使用,而且在编程时彻底采用了一种"以对象为 ...

  4. (心得三)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得02"中,我们已经做到了方块的各种功能的实现,那么接下来我们需要一个destroyLine()方法来对方块进行消除.我们需要想一个问题,当一个方 ...

  5. (心得二)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得01"中已经将游戏界面完成,那么接下来就是要让方块动起来. 我们之前在写Cell类时,曾经给每个最基本小方块定义了三个方法,即左移.右移.下落, ...

  6. 如何用java编写一个简单的多人PK游戏

    如何用java编写一个简单的多人PK游戏 类与对象---PK游戏的编写 素材取用----王者荣耀和BILIBILI 创建两个对战的角色(PK游戏最少需要两名角色) 创建孙尚香和Van 设置孙尚香和Va ...

  7. 一分钟教你学会python_十分钟教你学会python编写小游戏

    原标题:十分钟教你学会python编写小游戏 看过,估计大家都已经精通了吧,好的,话不多说,今天就活学活用,用python来编写纸牌游戏21点,江湖人称黑杰克,BLACK JACK-(注意法式卷舌). ...

  8. java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第一次写java的小游戏 想实现点击右下角的暂停 实现游戏的暂停和继续 不知道该怎么加,自己找了线程的内容但试了还是成功不了,求大佬们帮一下小白.代码有点 ...

  9. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

最新文章

  1. OGRE 2.1 Windows 编译
  2. AI对人类社会的真正威胁
  3. 评定星级的前端显示js
  4. iOS10 UI教程管理层次结构
  5. Linux命令netstat解读
  6. elasticSearch6源码分析(7)node
  7. 研究.jpg图片马赛克问题
  8. dbcp连接mysql,8小时会自动断开连接
  9. id文本框适应文字_Indesign中对同一行文字进行分行缩排的操作方法
  10. step2 . day7 C语言阶段小的项目总结
  11. android 三星 拍照,安卓里面拍照最好的三个品牌,OPPO华为三星怎么选
  12. 求立方根_「每日一学」数学七上:立方根的知识要点
  13. 【Gym - 101196F】Removal Game (环形区间dp,环状,细节优化)
  14. java事件绑定,Java编程GUI中的事件绑定代码示例
  15. 《算法竞赛入门经典训练指南》pdf
  16. click 点击图片不起作用_JavaScript 练手小案例:基于SVG的图片切换效果
  17. Oracle的体系结构
  18. vi 和vim的区别
  19. Javascript - Cookie
  20. Windows上的Oracle检查列表。 (文档ID 443813.1)

热门文章

  1. 小米路由器7000 docker怎么安装迅雷?
  2. VC6.0软件安装教程
  3. python开发跟淘宝有关联微_python分析淘宝用户行为
  4. 如何恢复计算机工具栏,电脑任务栏怎么还原,详细教您怎么还原电脑任务栏
  5. vnc远程桌面下载,三款能够下载文件的vnc远程桌面软件
  6. python数据库查询语句_python-SQL查询语句精华使用简要
  7. 软件测试常见问题 开发模型 PC端qq登录测试用例 BUG的相关问题 测试用例设计的常用方法
  8. 写在软构博客前面(手动狗头)
  9. Java操作Redis(四)--Java操作Redis实现排行榜
  10. 渗透测试-菜刀冰蝎蚁剑哥斯拉等webshell工具及特征分析