JAVA坐标
下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一
个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素:第二个是y坐标,表示当
前位置为垂直方向,距离坐标原点y个像素。
画一个圆和长方形
java
package com.draw;
import javax.swing.*;
import java.awt.*;
//在面板上画圆
public class Circle extends JFrame {//JFrame是一个大窗口(画框)
//定义一个面板
private MyPanel mp = null;
public static void main(String[] args) {
new Circle();
}
//定义一个构造器,把面板放入画框
public Circle(){
mp = new MyPanel();
this.add(mp);//把面板放入画框
this.setSize(400,300);//定义画框的大小
this.setVisible(true);//设置此画框可以显示
//当点击窗口的x,就直接彻底退出程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//1、定义一个画板MyPanel,继承JPanel
class MyPanel extends JPanel{
@Override
public void paint(Graphics g) {//画图的方法
super.paint(g);
//画一个椭形
g.drawOval(13,13,150,150);
//画一个长方形
g.draw3DRect(131,131,150,150,true);
}
}
画坦克
java
package com.TankGame;
import javax.swing.*;
import java.awt.*;
public class MyPanel extends JPanel {
//绘图区域
Hero hero = null;
public MyPanel(){
hero = new Hero(200,200);//初始化位置
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);
//调用画坦克的方法
drawTank(hero.getX(),hero.getY(),g,0,0);
drawTank(hero.getX()+60,hero.getY(),g,0,1);
}
//画tank
/***
* 画tank
* @param x 坐标
* @param y 坐标
* @param g 画笔
* @param direct 方向
* @param type 各种各样的类型
*/
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.pink);//设置颜色
break;
}
switch (direct){
case 0 ://表示向上
g.fill3DRect(x,y,10,60,false);
g.fill3DRect(x+30,y,10,60,false);
g.fill3DRect(x+10,y+10,20,40,false);
g.fillOval(x+10,y+20,20,20);
g.drawLine(x+20,y+30,x+20,y);//坦克大炮
default:
System.out.println(" ");
}
}
}
JAVA事件处理机制
基本说明
java事件处理是采取"委派事件模型"。当事件发生时,产生事件的对象,会把此"信息"传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象,把它称为"事件的对象"。

事件处理机制深入理解
1、前面我们提到几个重要的概念事件源,事件,事件监听器我们下面来全面的介绍它们。
2、事件源:事件源是一个产生事件的对象,比如按钮,窗口等。
3、事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent对象有含义被按下键的Code值。java.awt.event包和javax.swing.event包中定义了各种事件类型
5.事件监听器接口:
(1)当事件源产生一个事件,可以传送给事件监听者处理
(2)事件监听者实际上就是一个类,该类实现了某个事件监听器接口比如前面我们案例中的MyPanle就是一个类,它实现了KeyListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理
(3)事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
(4)这些接口在java.awt.event包和javax.swing.event包中定义。列出常用的事件监听器接口,查看jdk文档聚集了.
坦克移动

java
package com.TankGame02;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
public class MyPanel extends JPanel implements KeyListener {
//绘图区域
Hero hero = null;
Vector<EnemyTank> enemyTanks = new Vector<>();
public MyPanel() {
hero = new Hero(200, 200);//初始化位置
int enemyTankCount = 3;
for (int i = 0; i < enemyTankCount; i++) {
enemyTanks.add(new EnemyTank(100*(i+1),100));
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 1000, 750);
//调用画坦克的方法
drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 0);//自己的tank
for (int i = 0; i < enemyTanks.size(); i++) {//敌人的tank
EnemyTank enemyTank = enemyTanks.get(i);
drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 1);
}
}
//画tank
/***
* 画tank
* @param x 坐标
* @param y 坐标
* @param g 画笔
* @param direct 方向
* @param type 各种各样的类型
*/
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.pink);//设置颜色
break;
}
switch (direct) {
case 0://表示向上
g.fill3DRect(x, y, 10, 60, false);
g.fill3DRect(x + 30, y, 10, 60, false);
g.fill3DRect(x + 10, y + 10, 20, 40, false);
g.fillOval(x + 10, y + 20, 20, 20);
g.drawLine(x + 20, y + 30, x + 20, y);//坦克大炮
break;
case 1://表示向右
g.fill3DRect(x, y, 60, 10, false);
g.fill3DRect(x, y + 30, 60, 10, false);
g.fill3DRect(x + 10, y + 10, 40, 20, false);
g.fillOval(x + 20, y + 10, 20, 20);
g.drawLine(x + 30, y + 20, x + 60, y + 20);//坦克大炮
break;
case 2://表示向下
g.fill3DRect(x, y, 10, 60, false);
g.fill3DRect(x + 30, y, 10, 60, false);
g.fill3DRect(x + 10, y + 10, 20, 40, false);
g.fillOval(x + 10, y + 20, 20, 20);
g.drawLine(x + 20, y+30 , x + 20, y+ 60);//坦克大炮
break;
case 3://表示向左
g.fill3DRect(x, y, 60, 10, false);
g.fill3DRect(x, y + 30, 60, 10, false);
g.fill3DRect(x + 10, y + 10, 40, 20, false);
g.fillOval(x + 20, y + 10, 20, 20);
g.drawLine(x + 30, y + 20, x, y + 20);//坦克大炮
break;
default:
System.out.println(" ");
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {//用于对监听的键盘输入 进行相应操作
if(e.getKeyCode() == KeyEvent.VK_W){//用WASD来选择坦克的方向,同时进行坦克的移动
hero.setDirect(0);
hero.setY(hero.getY()-1);//向上移动
} else if(e.getKeyCode() == KeyEvent.VK_S){
hero.setDirect(2);
hero.setY(hero.getY()+1);//向下移动
} else if (e.getKeyCode() == KeyEvent.VK_A) {
hero.setDirect(1);
hero.setX(hero.getX()-1);//向左移动
}else if (e.getKeyCode() == KeyEvent.VK_D){
hero.setDirect(3);
hero.setX(hero.getX()+1);//向右移动
}
repaint();//重绘
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Day37 END
其实这个写了两天,之后的课都是下午和晚上连着上,晚上到宿舍已经十点左右了,而且不知道为什么晚上的课尤其的累,加油吧,下面是多线程了
回家还有45天~