JAVA入门到精通-第33讲-绘图技术.坦克大战1



 

  用的是Access数据库,安全性不够好,性能也不够强大;



  躲在这里,坦克很少过来,做了一个随机数;

把得分的记录保存在数据库里面;

SQLServer2005中型数据库;



 

 (x,y)坐标;



 

  800x600;  

  表示计算机屏幕上的每一行由800个点组成,共有600行;

  共有480000个像素;

  java绘图技术:

  绘图一般在JPane上画;

覆盖JPanel的paintat方法

Graphics是一个图形画笔类,绘图的重要类,可以理解为一只画笔

super.paint(g);

drawOval画一个圆形;

JFrame不提供画图方法,是在JPanel上画的;

把JPanel放到JFrame里面;



 MyPanel是自己定义的继承自JPanel的面板;



 

  坦克为什么在动?

repaint( )不断的刷新;

paint()方法会被系统自动调用;



 比如拖动窗口,最大化最小化会重新画了了一次;paint()会被调用;



 

 fillRect实心矩形;



 deaw3DRect 矩形3D的凹凸感,由boolean决定;



 setColor设置颜色;



 

----------------------------------------------------------------------------------

坦克大战游戏演示

为什么选择这个项目

1、好玩

2、涉及到java各个方面的技术

1、java面向对象编程;2、界面编程;3、绘图技术;4、多线程;5、文件i/o操作;6、数据库

3、巩固旧知识,学习新知识

java绘图坐标体系

绘图坐标本系--介绍

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

坐标体系--像素

计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,而厘米是长度单位,两者无法比较。

9

绘图原理(1)[Window013.java]

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

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

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

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

/**
* 功能:java绘图原理
*/
import java.awt.*;
import javax.swing.*;
public class Window013 extends JFrame{
//定义组件
MyPanel mp=null;
public static void main(String[] args) {
Window013 th=new Window013();
}
public Window013 (){
//创建组件
mp=new MyPanel();
//加入组件
this.add(mp);
//设置窗体
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}

//定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)
class MyPanel extends JPanel{
//重写(覆盖)JPanel的paint方法
public void paint(Graphics g){//Graphics是绘图的重要类,可以把它理解成一只画笔
//1、调用父类函数,完成初始化任务
super.paint(g);//super.paint(g);这句话不能少
System.out.println("Paint被调用");//用于测试绘图原理2paint调用
//先画一个圆
g.drawOval(10, 10, 30, 30);//drawOval方法是画圆
}
}

x

1

/**

2

* 功能:java绘图原理

3

*/

4

import java.awt.*;

5

import javax.swing.*;

6

public class Window013 extends JFrame{

7

    //定义组件

8

    MyPanel mp=null;

9

    public static void main(String[] args) {

10

        Window013 th=new Window013();

11

    }

12

    public Window013 (){

13

        //创建组件

14

        mp=new MyPanel();

15

        //加入组件

16

        this.add(mp);

17

        //设置窗体

18

        this.setSize(400, 300);

19

        this.setLocationRelativeTo(null);

20

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

21

        this.setVisible(true);

22

    }

23

}

24


25

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

26

class MyPanel extends JPanel{

27

    //重写(覆盖)JPanel的paint方法

28

    public void paint(Graphics g){//Graphics是绘图的重要类,可以把它理解成一只画笔

29

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

30

        super.paint(g);//super.paint(g);这句话不能少

31

        System.out.println("Paint被调用");//用于测试绘图原理2paint调用

32

        //先画一个圆

33

        g.drawOval(10, 10, 30, 30);//drawOval方法是画圆

34

    }

35

}

------------------------------------------------------------------------------

绘图原理(2)

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

1、窗口最小化,再最大化

2、窗口的大小发生变化

3、repaint函数被调用


java绘图技术--Graphics

Graphics类[Window014.java]

Graphics类你可以理解就是画笔,为我们提供了各种绘制图形的方法:[多看jdk帮助文档]

1、画直线 drawLine(int x1,int y1,int x2,int y2);

2、画矩形边框 drawRect(int x,int y,int width,int height);

3、画椭圆边框 drawOval(int x,int y,int width,int height);

4、填充矩形 fillRect(int x,int y,int width,int height);

5、填充椭圆 fillOval(int x,int y,int width,int height);

6、画图片 drawImage(Image img.int x,int y,..);

7、画字符串 drawString(String str,int x,int y);

8、设置画笔的字体 setFont(Font font);

9、设置画笔的颜色 setColor(Color c);

//java画图Graphics绘图类的使用方法

import java.awt.*;
import javax.swing.*;
public class Window014 extends JFrame{
//定义组件
MyPanel1 mp=null;
public static void main(String[] args) {
Window014 th=new Window014();
}
//构造函数
public Window014(){
//构建组件
mp=new MyPanel1();
//加入组件
this.add(mp);
//设置窗体
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
//定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)
class MyPanel1 extends JPanel{
//重写(覆盖)JPanel的paint方法
public void paint(Graphics g){//Graphics是绘图的重要类,可以把它理解成一只画笔
//1、调用父类函数,完成初始化任务
super.paint(g);
//画一个直线
g.drawLine(10, 10, 40, 10);
//画矩形边框
g.drawRect(50, 50, 40, 40);
//画椭圆边框
g.drawOval(100, 100, 60, 60);
//画填充矩形
g.setColor(Color.blue);
g.fillRect(10, 150, 70, 70);
//画填充椭圆
g.setColor(Color.red);//设置画笔颜色
g.fillOval(200, 50, 80, 80);
}
}

xxxxxxxxxx

41

1

import java.awt.*;

2

import javax.swing.*;

3

public class Window014 extends JFrame{

4

    //定义组件

5

    MyPanel1 mp=null;

6

    public static void main(String[] args) {

7

        Window014 th=new Window014();

8

    }

9

    //构造函数

10

    public Window014(){

11

        //构建组件

12

        mp=new MyPanel1();

13

        //加入组件

14

        this.add(mp);

15

        //设置窗体

16

        this.setSize(400, 300);

17

        this.setLocationRelativeTo(null);

18

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

19

        this.setVisible(true);

20

    }

21

}

22

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

23

class MyPanel1 extends JPanel{

24

    //重写(覆盖)JPanel的paint方法

25

    public void paint(Graphics g){//Graphics是绘图的重要类,可以把它理解成一只画笔

26

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

27

        super.paint(g);

28

        //画一个直线

29

        g.drawLine(10, 10, 40, 10);

30

        //画矩形边框

31

        g.drawRect(50, 50, 40, 40);

32

        //画椭圆边框

33

        g.drawOval(100, 100, 60, 60);

34

        //画填充矩形

35

        g.setColor(Color.blue);

36

        g.fillRect(10, 150, 70, 70);

37

        //画填充椭圆

38

        g.setColor(Color.red);//设置画笔颜色

39

        g.fillOval(200, 50, 80, 80);

40

    }

41

}

MyTank01:(画出一个坦克)

/**
* 功能:坦克游戏的1.0
* 1、画出坦克
*/
import java.awt.*;
import javax.swing.*;
public class MyTank01 extends JFrame{
//定义组件
MyPanel mp=null;
public static void main(String[] args) {
MyTank01 mt=new MyTank01();
}
//构造函数
public MyTank01(){
//构建组件
mp=new MyPanel();

//加入组件
this.add(mp);

//设置JFrame窗体
this.setTitle("坦克大战");//JFrame标题
this.setSize(400, 300);//JFrame窗体大小
this.setLocationRelativeTo(null);//在屏幕中心显示
this.setVisible(true);//显示
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出并关闭JFrame

}
}

//我的面板Panel
class MyPanel extends JPanel{
//定义一个我的坦克
Hero hero=null;

//构造函数
public MyPanel(){
hero=new Hero(10,10);//我的坦克初始位置
}

//重写paint函数
public void paint(Graphics g){
super.paint(g);//调用父类paint方法
//设置Panel底色
g.fillRect(0, 0, 400, 300);//fillRect(0,0,X?,Y?)中X?/Y?为活动区域
//调用坦克
this.drawTank(hero.getX(), hero.getY(), g, 0, 1);

}

//画出坦克的函数
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);
//2、画出右边的矩形
g.fill3DRect(x+15, y, 5, 30, false);
//3、画出中间矩形
g.fill3DRect(x+5, y+5, 10, 20, false);
//4、画出中间圆形
g.fillOval(x+5, y+10, 10, 10);
//5、画出线(炮筒)
g.drawLine(x+10, y+15, x+10, y);
break;
}
}

}

//定义坦克类
class Tank{
//表示坦克的X横坐标Y纵坐标
int x=0,y=0;

public Tank(int x,int y){
this.x=x;
this.y=y;
}

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;
}
}

//我的坦克
class Hero extends Tank{
public Hero(int x,int y){
super(x,y);
}
}

x

1

/**

2

 * 功能:坦克游戏的1.0

3

 * 1、画出坦克

4

 */

5

import java.awt.*;

6

import javax.swing.*;

7

public class MyTank01 extends JFrame{

8

    //定义组件

9

    MyPanel mp=null;

10

    public static void main(String[] args) {

11

        MyTank01 mt=new MyTank01();

12

    }

13

    //构造函数

14

    public MyTank01(){

15

        //构建组件

16

        mp=new MyPanel();

17

        

18

        //加入组件

19

        this.add(mp);

20

        

21

        //设置JFrame窗体

22

        this.setTitle("坦克大战");//JFrame标题

23

        this.setSize(400, 300);//JFrame窗体大小

24

        this.setLocationRelativeTo(null);//在屏幕中心显示

25

        this.setVisible(true);//显示

26

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出并关闭JFrame

27

        

28

    }

29

}

30


31

//我的面板Panel

32

class MyPanel extends JPanel{

33

    //定义一个我的坦克

34

    Hero hero=null;

35

    

36

    //构造函数

37

    public MyPanel(){

38

        hero=new Hero(10,10);//我的坦克初始位置

39

    }

40

    

41

    //重写paint函数

42

    public void paint(Graphics g){

43

        super.paint(g);//调用父类paint方法

44

        //设置Panel底色

45

        g.fillRect(0, 0, 400, 300);//fillRect(0,0,X?,Y?)中X?/Y?为活动区域

46

        //调用坦克

47

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

48

        

49

    }

50

    

51

    //画出坦克的函数

52

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

53

        //判断是什么类型的坦克

54

        switch(type){

55

        case 0:

56

            g.setColor(Color.cyan);//我的坦克颜色

57

            break;

58

        case 1:

59

            g.setColor(Color.yellow);//敌人坦克颜色

60

            break;

61

        }

62

        

63

        //判断坦克的方向

64

        switch(direct){

65

        //向上走

66

        case 0:

67

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

68

            //1、画出左边的矩形

69

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

70

            //2、画出右边的矩形

71

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

72

            //3、画出中间矩形

73

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

74

            //4、画出中间圆形

75

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

76

            //5、画出线(炮筒)

77

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

78

            break;

79

        }

80

    }

81

    

82

}

83


84

//定义坦克类

85

class Tank{

86

    //表示坦克的X横坐标Y纵坐标

87

    int x=0,y=0;

88


89

    public Tank(int x,int y){

90

        this.x=x;

91

        this.y=y;

92

    }

93

    

94

    public int getX() {

95

        return x;

96

    }

97

    public void setX(int x) {

98

        this.x = x;

99

    }

100

    public int getY() {

101

        return y;

102

    }

103

    public void setY(int y) {

104

        this.y = y;

105

    }

106

}

107


108

//我的坦克

109

class Hero extends Tank{

110

    public Hero(int x,int y){

111

        super(x,y);

112

    }

113

}

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/xuxaut-558/p/10045702.html

时间: 2024-11-05 13:33:16

JAVA入门到精通-第33讲-绘图技术.坦克大战1的相关文章

JAVA入门到精通-第94讲-山寨QQ项目8-好友在线提示

遇到的问题: 现在每登录一个人,后面的人是能看到前面的登录的人的: 但是,前面的人看不到后面的人登录: //后面每登录一个人,有责任去通知前面登录的人他已经上线了: 通知了完以后,需要更改好友在线的情况: //不让同一个账号反复登录 //如果 好友不在线,则不能聊天 ================================ [ManageQqChat.java] /** * 这是一个管理用户聊天界面的类 */ package com.qq.client.tools; import jav

JAVA入门到精通-第35讲-事件处理-坦克大战3

画出弧形: g.drawArc: 前两个参数:代表中心点,后面代表宽,高,后面是弧度的大小:  50代表弧度,后面方向:    SWING编程三个部分: (1)组件和布局管理器: (2)绘图技术: (3)事件处理机制:  鼠标,键盘按下的某个按钮或者移动等都是事件: JAVA认为,消息是一种事件对象:事件监听者也是一个类: 事件监听者中有函数或者方法专门去处理事件: import  java.awt.Event.*; 需要对事件进行处理,把Event包带进去:  Border布局中间是 默认的:

JAVA入门到精通-第36讲-事件监听-坦克大战4

Java事件处理机制:  事件源:事件:事件监听者:事件处理方法:  任何一个类,只要实现了相应的接口,就可以去监听某个事件源: 一个类要实现监听的基本步骤:  a.实现相应的接口[KeyListener,MouseListener,ActionListener,WindowListener] b.把接口的处理方法根据需要重新编写(override) c.在事件源注册监听 d.事件传递是靠事件对象 通过ActionEvent传递事件: 通过事件进行委派事件模型进行事件处理:  一个事件源可能会生

JAVA入门到精通-第31讲-常见组件

面板组件-Jpanel  一个JFrame,多个JPanel: JPanel默认是流布局:FlowLayout:  通过JPanel达到复杂布局的目的:  可以认为是网格布局,有3个JPanel:2个Label:2个按钮: 一个密码框和一个文本输入框:   最终展现出来的还是靠JFrame展现的  网格布局好点,3个JPanel,用流布局,控件往里加: ButtonGroup按钮组:一组里面只能选择一个:    对单选框管理,就是把它加入到ButtonGroup里面: 单选框也是一个个放进JPa

JAVA入门到精通-第45讲-IO编程

image1=ImageIO.read(new File("bomb_1.gif")); 图片拷贝: 输入流和输出流同时要用的问题: 图片读入到内存: 写入,输出到某个文件: 二进制文件,字节流完成: FileInputStream fis=new FileInputStream("xxxx.jpg"); 输出到指定文件:FileOutputStream  fos=null; 关闭打开的文件流: -----------------------------------

JAVA入门到精通-第72讲-学生管理系统4-model 2模式(1)

删除.查询.添加.修改: -修改: 每个字段都可能修改: //给?赋值 //在prepareStatement语句后面赋值才好用 //修改完了,更新数据 目前为止,已经完成了增删改查-Model1模式 最大特点: 界面和业务逻辑操作是放在一起的: 优点:简单,开发方便: 缺点:代码复用性不高: 中大型项目可读性差,可维护性不高: 前台后端混杂在一起的: 比如:"数据库密码换了, 所有涉及到数据库的地方都需要发生变化" =================================

JAVA入门到精通-第32讲-swing编程实战

 JBorderLayout,左边是JList,拆分窗格: 图片是放在JLabel上的,图片的地址写好就行:  在相关项目下面建立一个文件夹Folder,放置图片:或者复制粘贴:   拆分:水平拆分?垂直拆分?    拆分之后把jList和jl1这两个组件放进去: 可以伸缩:  在窗口左上角出现自己的图标? Border布局: 多行文本框带滚动条,聊天窗口可滚动:   加入QQ左上角图标:      转成图片,getImage; Border布局很有用, CENTER会被自动挤满:  QQ号码.

JAVA入门到精通-第38讲-线程-坦克大战6

 应用程序在内存中开辟空间-进程: 内存-大脑容量:  反应切换的速度-CPU: 试图去尝试别的进程的地址空间---病毒: 线程是由进程(应用程序)创建的: 涉及到并发,就会涉及到线程:迅雷下载:      线程不会跑出到进程外面去的: 地址空间是由操作系统和JVM决定的: 32/64位,CPU的寻址空间范围,加载内存的大小:  线程的调度:  CPU.内存资源OK?--->Running,运行状态: 运行过程CPU,内存不够---->Blocked,阻塞状态: 资源空闲,可用-------&

JAVA入门到精通-第44讲-IO编程

//FileOutputStream的使用 准备把它输出到d:\\ss.txt 文件, 文件不存在直接创建: 如果存在,可能会被覆盖: //字节流 FileOutputStream fos=null; //输出-Output-离开内存-Output/Write //如何把string转换成bytes数组: s.getBytes() //关闭文件流 //两个字符串的换行 world\r\n \r\n就是回车换行的意思 ----------------------------------------