`

坦克大战自学全过程 v1.0

    博客分类:
  • JAVA
 
阅读更多

内容介绍:

1.坦克大战游戏图片

2.java绘图坐标体系

3.java绘图技术

4java时间处理机制

5.我的坦克大战游戏(1.0版)

目标:

1)理解java绘图坐标体系

2)掌握java绘图基本技术

3)充分理解java时间处理机制

4)完成坦克大战游戏(1.0版)


 

 

 

用到的知识:

1.java绘图坐标体系

    下图说明了java坐标体系,坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位,在java的坐标体系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直放行,距离坐标原点y个像素。


 

 

案例:我们画一个圆圈



 案例代码:

 

 

/**

 * 功能:java绘图技术

 * 

 * @author Administrator

 * 

 */

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class Test extends JFrame {

MyPanel mp = null;

 

public static void main(String[] args) {

Test test = new Test();

}

 

public Test() {

mp = new MyPanel();

this.add(mp);

 

this.setSize(400, 300);

this.setLocation(100, 100);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

this.setVisible(true);

 

}

}

 

// 定义一个MyPanel(我自己的面板,是用于绘图和显示的区域)

class MyPanel extends JPanel {

 

// 覆盖JPanel 的paint放啊

// Graphics是绘图的重要类,你可以把它理解成一只画笔

public void paint(Graphics g) {

// 1.调用父类函数完成初始化任务

// 这句话,不能少

super.paint(g);

// 先画一个圆圈

// g.drawOval(10, 10, 30, 30);

// 画出直线

// g.drawLine(10, 10, 100, 10);//(x1,y1)起点坐标,(x2,y2)终点坐标

// 矩形边框

// g.drawRect(10, 10, 100, 100);// (x1,y1)左上角的坐标,(x2,y2)右下角坐标

// 填充矩形

// 设置矩形颜色

// g.setColor(Color.YELLOW);

// g.fillRect(10, 10, 100, 100);

// 填充椭圆

// g.drawOval(10, 10, 50, 100);

// 在面板上画出图片

// Image im = Toolkit.getDefaultToolkit().getImage(

// Panel.class.getResource("/labixiaoxin.png"));// 图片放在src目录下面

// g.drawImage(im, 80, 80, 200, 150, this);

// // 如何画出字

// g.setColor(Color.blue);

// g.setFont(new Font("隶书",Font.BOLD,30));

// g.drawString("祖国万岁", 100, 100);

// g.draw3DRect(100, 100, 50, 30, true);

// g.drawRect(10, 10, 10, 10);

 

}

}

绘图原理(1)

Component类提供了两个和绘图相关的最重要的方法:

1)paint(Graphics g)绘制组件的外观

2)repaint()刷新组件的外观

 

当组件第一次在屏幕上显示的时候,程序会自动的调用paint()方法来绘制组件

绘图原理(2)

 在以下情况paint()将会被调用:

 1)窗口最小化,再最大化。

2)窗口的大小发生变化。

3)repaint函数被调用


 

绘图小练习

坦克大战游戏中,我们用到坦克,现在我们就利用java绘图技术来画出一个小坦克,完成我们坦克大战的1.0版本,因为用图片很浪费资源,所以我们还是自己用java画坦克。

 

开始画坦克:


案例代码:


 /**

 * 功能:坦克游戏的1.0

 * 1.画出坦克

 */

package tankev1;

 

import java.awt.Color;

import java.awt.Graphics;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class MyTankGame1 extends JFrame {

MyPanel mp = null;

 

public static void main(String[] args) {

MyTankGame1 myTankGame1 = new MyTankGame1();

}

 

public MyTankGame1() {

mp = new MyPanel();

 

this.add(mp);

this.setSize(400, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

}

 

// 我的面板

class MyPanel extends JPanel {

// 定义一个我的坦克

Hero hero = null;

 

// 构造函数

public MyPanel() {

hero = new Hero(10, 10);

}

 

// 重写paint方法

public void paint(Graphics g) {

super.paint(g);

g.fillRect(0, 0, 400, 300);

this.drawTank(hero.getX(), hero.getY(), g, 0, 0);

}

 

// 画出坦克的函数

public void drawTank(int x, int y, Graphics g, int direct, int type) {

// 判断坦克类型

switch (type) {

case 0:

g.setColor(Color.CYAN);

break;

case 1:

g.setColor(Color.YELLOW);

break;

}

// 判断方向

switch (direct) {

case 0:

// 画出我的坦克(到时候在封装成一个函数)

// 1.画出左面的矩形

g.fill3DRect(x, y, 5, 30, false);

// 画出右面矩形

g.fill3DRect(x + 15, y, 5, 30, false);

// 3画出中间矩形

g.fill3DRect(x + 5, x + 5, 10, 20, false);

// 4画出圆形

g.fillOval(x + 5, x + 10, 10, 10);

// 画线

g.drawLine(x + 10, x + 15, x + 10, y);

break;

}

 

}

}

 

// 坦克类

class Tank {

// 表示坦克横坐标

int x = 0;

// 坦克纵坐标

int y = 0;

 

public int getX() {

return x;

}

 

public void setX(int x) {

this.x = x;

}

 

public int getY() {

return y;

}

 

public void setY(int y) {

this.y = y;

}

 

public Tank(int x, int y) {

this.x = x;

this.y = y;

}

}

 

// 我的坦克

class Hero extends Tank {

public Hero(int x, int y) {

super(x, y);

}

}

//-----------------------------------------------------------------------------------------------------------------

java事件处理机制

       请大家看一个小程序,怎么样让小球受到键盘的空值,上下左右移动呢?

初步介绍

java事件处理是采用“委派事件模型” ,所谓“委派事件模型”是指当事件发生时,产生事件的对象(即事件源),会把此“信息”传递给“事件的监听者” 处理的一种方式,而这里所说的“信息”,实际上市java.awt.event 事件类库里面的某个类所创建的对象,我们暂时把它称为“事件的对象”。

请大家看一个示意图:


 

案例:

 
案例代码:

 

/**

 * 功能:讲解事件处理机制

 */

package demo9;

 

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class Test extends JFrame implements ActionListener {

// 定义一个Panel

JPanel jp = null;

JButton jb1 = null;

JButton jb2 = null;

 

public static void main(String[] args) {

Test test = new Test();

}

 

public Test() {

jp = new JPanel();

jb1 = new JButton("黑色");

jb2 = new JButton("红色");

 

this.add(jb1, BorderLayout.NORTH);

jp.setBackground(Color.yellow);

this.add(jp);

this.add(jb2, BorderLayout.SOUTH);

 

Cat cat = new Cat();

// 注册监听

jb1.addActionListener(this);// this代表当前JFrame监听,也可以写成类的对象来继承

//事件源对象时jb1,事件监听对象时cat

jb1.addActionListener(cat);

// 指定action命令

jb1.setActionCommand("黑色");// 用来区分事件源

jb2.addActionListener(this);

jb2.setActionCommand("红色");

 

this.setSize(200, 150);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

//对事件处理的方法

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

// 判断是哪个按钮被点击

if (arg0.getActionCommand().equals("黑色")) {

jp.setBackground(Color.BLACK);

} else if (arg0.getActionCommand().equals("红色")) {

jp.setBackground(Color.RED);

}

}

 

}

 

class Cat implements ActionListener {

//对事件处理的方法

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if (e.getActionCommand().equals("黑色")) {

System.out.println("猫也在监听");

}

}

 

}



 

运动的小球案例:


案例代码:

 

/**

 * 功能:加深对事件处理机制的理解

 * 1.通过上下左右的光标来控制一个小球的位置

 */

package demo9;

 

import java.awt.Graphics;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class Test2 extends JFrame {

MyPanel mp = null;

 

public static void main(String[] args) {

Test2 test2 = new Test2();

}

 

public Test2() {

mp = new MyPanel();

this.add(mp);

// 事件监听

this.addKeyListener(mp);

this.setTitle("运动的小球");

this.setSize(400, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

}

 

// 定义自己的面板

class MyPanel extends JPanel implements KeyListener {

int x = 10;

int y = 10;

 

public void paint(Graphics g) {

super.paint(g);

g.fillOval(x, y, 10, 10);

}

 

// 键被按下

public void keyPressed(KeyEvent e) {

// TODO Auto-generated method stub

System.out.println("键被按下" + (char) e.getKeyCode());

if (e.getKeyCode() == KeyEvent.VK_DOWN) {

y++;

System.out.println("下");

 

} else if (e.getKeyCode() == KeyEvent.VK_UP) {

y--;

System.out.println("上");

 

}else if (e.getKeyCode() == KeyEvent.VK_LEFT) {

x--;

System.out.println("左");

 

}else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

x++;

System.out.println("右");

 

}

// 重绘

// 调用repaint()函数

this.repaint();

}

 

// 键被释放

public void keyReleased(KeyEvent e) {

// TODO Auto-generated method stub

 

}

 

// 键的一个值被输出

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

 

}

}

 

注:一个类要实现监听的步骤

1)实现相应的接口(KeyListener,MouseListener,ActionLister,WindowListener)

2)把接口的处理方法根据需要重新编写(Override)

3) 在事件源注册监听

4)事件传递时靠事件对象传递

//-------------------------------------------------------------------------------------------------------

java事件处理机制深入理解

        前面我们提到的几个重要概念

1)事件源2)事件3)事件监听器

我们下面来看全面的介绍他们,因为这几个概念是非常重要的。

1)事件源

     事件源是一个产生(或触发)事件的对象,比如前面的JButton的一个对象btn1.当这个事件源对象的某些状态可能会生成多个不同类时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册,比如前面的案例。

2)事件

事件就是承载事件源状态改变的信息对象。或者说,事件是事件源向事件监听器传输事件源状态的载体。在用户和GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动时,就会生成一个鼠标移动的事件对象,而这个对象保存着当前鼠标在面板中位置信息。java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的有:

 


 

 

 

 

 

 

 

 

 

 

 

 

 

正在续写中!!!

 

 

 

  • 大小: 85.6 KB
  • 大小: 11.3 KB
  • 大小: 5.1 KB
  • 大小: 50.1 KB
  • 大小: 5.1 KB
  • 大小: 6.2 KB
  • 大小: 4.9 KB
  • 大小: 30.5 KB
  • 大小: 6.3 KB
  • 大小: 54.8 KB
分享到:
评论

相关推荐

    网络版坦克大战V1.0

    《网络版坦克大战V1.0》的出现,就是这一演变过程中的一个典范,它将经典的坦克大战游戏重新包装,注入现代网络技术,为玩家带来了全新的游戏体验。 《网络版坦克大战V1.0》的核心理念是多人协作与竞技。在这个游戏...

    易语言坦克大战V1源码,易语言坦克大战V1.0单机版

    易语言坦克大战V1.0 单机版源码,坦克大战V1.0 单机版,画战场,画雕堡,初始化敌人坦克1,画敌人坦克1,敌人坦克定位撤销1,敌人炮弹定位撤销1,敌人行走判断1,敌人炮弹打砖墙1,敌人炮弹打钢板1,敌人爆炸1,初始化敌人坦克2,...

    python坦克大战v1.0.zip

    【Python坦克大战v1.0.zip】是一款使用Python编程语言开发的小型游戏,它通过简单的代码实现了一款经典坦克战斗的模拟,旨在提供娱乐的同时,让学习者了解Python编程的基本概念和游戏开发的基础知识。 首先,我们要...

    软件名称:坦克大战,软件版本:1.0,软件容量:1940Kb

    是标准坦克大战的Windows升级版。高超的人工智能,超强的游戏引擎,华丽的图形处理,使你找回令人怀念的电视游戏机上的坦克射击游戏。而且简单易用的地图关卡编辑器更加丰富此款游戏

    C++大作业坦克大战源码.zip

    C++大作业坦克大战源码C++大作业坦克大战源码C++大作业坦克大战源码C++大作业坦克大战源码C++大作业坦克大战源码。C++大作业坦克大战源码C++大作业坦克大战源码C++大作业坦克大战源码C++大作业坦克大战源码C++大作业...

    Android游戏之FC坦克大战V1.0

    只是APK程序,非源码。 这个是本人自行开发的游戏,参考经典的FC90...该游戏目前只是V2.0版本,会不断更新中,不断更新关卡,修改错误,以让游戏更好玩。 下载请看附件,欢迎大家提供建议,联系可q:285203528, 谢谢。

    FC经典坦克大战源码 v1.0.zip

    FC经典坦克大战源码采用VB.NET开发的经典坦克大战FC游戏源码,模拟任天堂的坦克大战。全开源代码,测试请注意开启键盘大写。控制方式:大写的J K L I 控制坦克方向,F发弹。 FC经典坦克大战源码截图 相关阅读 ...

    (Unity源码)坦克大战Battle Tank Starter Kit 1.0.zip

    Unity插件源码,资源完整,真实可用Unity插件源码,资源完整,真实可用Unity插件源码,资源完整,真实可用Unity插件源码,资源完整,真实可用Unity插件源码,资源完整,真实可用Unity插件源码,资源完整,真实可用...

    Java 第二阶段提升编程能力【坦克大战1.0】---- 代码

    Java 第二阶段提升编程能力【坦克大战1.0】---- 代码 Java 第二阶段提升编程能力【坦克大战1.0】---- 代码 Java 第二阶段提升编程能力【坦克大战1.0】---- 代码 Java 第二阶段提升编程能力【坦克大战1.0】---- 代码 ...

    坦克大战小游戏源码 1.0.rar

    坦克大战小游戏源码程序实现了小霸王游戏机上坦克大战的功能,主要功能是开火、移动、3种不同的敌方坦克、用户自制地图等,缺点是有些小细节还处理的不好,感觉画面不够好,还没实现自动的下一关功能(主要是嫌做...

    人人坦克大战 v1.0.2.1

    软件简介人人坦克大战可以实现人机大战或双人大战,由人人棋牌游戏网开发,是一款受众非常广的单机游戏。使用步骤下载软件——解压——双击主程序,打开软件人人坦克大战玩法简单,极易操作,是一款非常好玩的单机...

    Java语言编写的经典坦克大战游戏.zip

    Java语言编写的经典坦克大战游戏.zipJava语言编写的经典坦克大战游戏.zip Java语言编写的经典坦克大战游戏.zipJava语言编写的经典坦克大战游戏.zip Java语言编写的经典坦克大战游戏.zipJava语言编写的经典坦克大战...

    经典坦克大战全套资源.zip

    《坦克大战》是一款深受玩家喜爱的经典游戏,其背后蕴含了丰富的IT知识点。在这个"经典坦克大战全套资源.zip"压缩包...对于想要学习游戏开发的人来说,这是一个极好的研究对象,可以帮助他们深入理解游戏制作的全过程。

    Python坦克大战源代码坦克大战.zip

    【Python坦克大战源代码坦克大战.zip】是一个包含Python语言实现的坦克大战小游戏的源代码集合。这个项目旨在提供一个互动的、基于文本的娱乐体验,让玩家能够享受经典的坦克战斗游戏,同时学习和理解Python编程的...

    Unity3d 多人在线坦克大战源码

    Unity3d 多人在线坦克大战源码 Unity精品小游戏源码 , Unity完整项目源码 是完整项目的压缩包,可直接运行,无需其他操作。 适合二次开发和学习使用,都是经典游戏,需要其他游戏源码包可以看我主页。 直接可以运行 , ...

    期末作业课程设计使用java开发的坦克大战小游戏源码.zip

    期末作业课程设计使用java开发的坦克大战小游戏源码期末作业课程设计使用java开发的坦克大战小游戏源码期末作业课程设计使用java开发的坦克大战小游戏源码期末作业课程设计使用java开发的坦克大战小游戏源码期末作业...

    Android游戏之坦克大战V1.0

    只是APK程序,非源码,本人开发的FC游戏90坦克攻城游戏,与原游戏有所不同,结合了一代二代的特点,即怪物也可以吃宝贝,同时引入了一种新地形--冰面地形,设计了一个智力关,总共有6个关卡。 具体可看 ...

    vb.net 坦克大战 小游戏程序源码

    资源名:vb.net 坦克大战 小游戏程序源码 资源类型:程序源代码 源码说明: FC经典坦克大战(VB.NET)源码 源码描述: 一、源码特点 1、采用VB.NET开发的经典坦克大战(FC),仿任天堂的坦克大战。全开源代码,测试请...

    C++坦克大战完整代码.zip

    《C++实现坦克大战游戏详解》 坦克大战是一款经典的双人对战小游戏,深受程序员和游戏爱好者的喜爱。本文将围绕使用C++编程语言实现的坦克大战游戏进行深入解析,帮助读者理解游戏背后的编程思想和技术。 首先,...

Global site tag (gtag.js) - Google Analytics