P568坦克大战
P568坦克大战
看到Java的画图想起了python的GUI,绘图学起来应该比较简单
P569java绘图坐标
P570绘图入门与原理
将图形最大然后最小真的会
import javax.swing.*;
import java.awt.*;
public class Draw01 extends JFrame{//Fram框架,窗口
private MyPannel mp=null;//定义一个面板
public static void main(String[] args) {
//听老师讲课总想起Python小乌龟在我脑海里瞎走,哈哈哈救命
new Draw01();//
System.out.println("退出程序");
}
public Draw01(){//构造器
//初始化面板
mp = new MyPannel();
//把面板放入到窗口(画框)
this.add(mp);
//设置窗口的大小
this.setSize(400, 300);
//当点击窗口的小×,程序完全退出.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//可以显示
}
}
//1.先定义一个MyPanel, 继承JPanel 类, 画图形,就在面板上画
class MyPannel extends JPanel{
//1. MyPanel 对象就是一个画板
// 2. Graphics g 把g 理解成一支画笔
// 3. Graphics 提供了很多绘图的方法
// Graphics g
@Override
public void paint(Graphics g) {//绘图方法
super.paint(g);//调用父类的方法完成初始化.
System.out.println("paint方法被调用");
g.drawOval(10,10,100,100);//画一个圆形
}
}
P571Java绘图技术
package YUE1;
import javax.swing.*;
import java.awt.*;
public class Draw01 extends JFrame{//框架
private MyPannel mp= null;//定义一个面板
public static void main(String[] args) {
new Draw01();
}
public Draw01() {//构造器
//初始化面板
mp = new MyPannel();
//把面板放入到窗口(画框)
this.add(mp);
//设置窗口的大小
this.setSize(400, 400);
//当点击窗口的小×,程序完全退出.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//可以显示
}
}
//先定义一个MyPannel,画板继承JPanle
class MyPannel extends JPanel{
@Override
public void paint(Graphics g) {//重写构造器
super.paint(g);//调用父类的方法完成初始化
//演示绘制不同的图形..
//画直线drawLine(int x1,int y1,int x2,int y2)
//g.drawLine(10, 10, 100, 100);
//画矩形边框drawRect(int x, int y, int width, int height)
//g.drawRect(10, 10, 100, 100);
//画椭圆边框drawOval(int x, int y, int width, int height)
//填充矩形fillRect(int x, int y, int width, int height)
//设置画笔的颜色
// g.setColor(Color.blue);
// g.fillRect(10, 10, 100, 100);
//填充椭圆fillOval(int x, int y, int width, int height)
// g.setColor(Color.red);
// g.fillOval(10, 10, 100, 100);
//画图片drawImage(Image img, int x, int y, ..)
//1. 获取图片资源, /bg.png 表示在该项目的根目录去获取bg.png 图片资源
//Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
// g.drawImage(image,10,10,300,400,this);
//画字符串drawString(String str, int x, int y)//写字
// 给画笔设置颜色和字体
g.setColor(Color.red);
g.setFont(new Font("隶书", Font.BOLD, 50));
//这里设置的100, 100, 是"北京你好"左下角
g.drawString("北京你好", 100, 100);
//设置画笔的字体setFont(Font font)
// 设置画笔的颜色setColor(Color c)
}
}
P572绘出坦克
1.先画出Tank源类,自己的坦克myhero(继承),MyPanel(绘版,定义我的坦克,构造器初始化坦克,包含画笔),框架(包含绘图,提供构造器定义绘图)
2分析怎么画坦克,主要是位置的确定,在绘图区画出坦克(方法),public void drawTank(int x,int y,Graphics g,int director,int type)
public class Tank1 {
private int x;
private int y;
public Tank1(int x, int y) {
this.x = x;
this.y = y;
}
}//省略getset等方法
public class MyHero extends Tank1{
public MyHero(int x, int y) {
super(x, y);
}
}
public class TankeGame01 extends JFrame {//框架
//定义一个pannel
MyPanel mp=null;
public static void main(String[] args) {
TankeGame01 tankeGame01 = new TankeGame01();
}
public TankeGame01(){
mp=new MyPanel();
this.add(mp);//把面板就是绘图区)
this.setSize(1000,750);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
public class MyPanel extends JPanel {//绘图区
//定义我的坦克
MyHero myHero=null;
public MyPanel(){
myHero=new MyHero(100,100);//初始化自己的坦克
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形,默认黑色
//画出坦克-封装方法
drawTank(myHero.getX(), myHero.getY(), g,0,0);
drawTank(myHero.getX()+60, myHero.getY(), g,0,1);
}
//编写方法,画出坦克
/***
*
* @param x 坦克的左上角的x坐标
* @param y 坦克的左上角的y坐标
* @param g 画笔
* @param director 方法
* @param type 坦克类型
*/
public void drawTank(int x,int y,Graphics g,int director,int type){
switch (type){
case 0://我们的坦克
g.setColor(Color.cyan);//青色
break;
case 1://敌人的坦克
g.setColor(Color.yellow);//
break;
}
//根据坦克的方法,来绘制坦克
switch (director){
case 0://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;
default:
System.out.println("没有处理");
}
}
}
P574Java事件处理机制
1.MyPanle implements KeyListener (重写方法),在JFrame的方法里面this.addKeyListener(mp);
2.现在根据用户按下的键盘,来处理小球的移动(上下左右键盘)
3.为了让小球移动,把左上角的坐标位置设置变量x,y
4.利用箭值和x,y的增减来实现运动
//画出面板,可以画出小球
//KeyListener监听器可以监听键盘的事件
public class BallMove extends JFrame {
MyPanle mp=null;
public static void main(String[] args) {
BallMove ballMove = new BallMove();
}
public BallMove(){
mp=new MyPanle();
this.add(mp);
this.setSize(400,300);
//窗口JFrame 对象可以监听键盘事件, 即可以监听到面板发生的键盘事件
this.addKeyListener(mp);//因为mp已经继承
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class MyPanle extends JPanel implements KeyListener{
//为了让小球移动,把左上角的坐标位置设置变量
int x=10;
int y=10;
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x,y,20,20);
}
@Override//有字符输出时,该方法就会触发
public void keyTyped(KeyEvent e) {
}
@Override//当某个键按下,该方法会触发
public void keyPressed(KeyEvent e) {
//System.out.println((char)e.getKeyCode()+"被按下...");
if(e.getKeyCode()==KeyEvent.VK_DOWN){
y++;//KeyEvent.VK_DOWN 就是向下的箭头对应的code
}else if(e.getKeyCode()==KeyEvent.VK_UP){
y--;
}else if(e.getKeyCode()==KeyEvent.VK_LEFT ){
x--;
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
x++;
}
this.repaint();
}
@Override//当某个键释放(松开),该方法会触发
public void keyReleased(KeyEvent e) {
}
}
P5*处理机制
事情被监听KeyListener,然后事件KeyEvent e
P576让坦克移动
direct(01,2,3)代表不同的方向
用按键表示不同的移动,
P567
public class Tank1 {
private int x;
private int y;
private int direct;//坦克方向0,1,2,3
private int speed=1;//速度
//从上右下左边移动
public void moveup(){//移动方向
y-=speed;
}
public void moveRight(){
x+=speed;
}
public void moveDown(){
y+=speed;
}
public void moveLeft(){
x-=speed;
}
}
public class MyPanel extends JPanel implements KeyListener {//绘图区
//定义我的坦克
MyHero myHero=null;
public MyPanel(){
myHero=new MyHero(100,100);//初始化自己的坦克
myHero.setSpeed(8);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形,默认黑色
//画出坦克-封装方法
drawTank(myHero.getX(), myHero.getY(), g,myHero.getDirect(),1);
}
//编写方法,画出坦克
/***
*
* @param x 坦克的左上角的x坐标
* @param y 坦克的左上角的y坐标
* @param g 画笔
* @param director 方法
* @param type 坦克类型
*/
public void drawTank(int x,int y,Graphics g,int director,int type){
switch (type){
case 0://我们的坦克
g.setColor(Color.cyan);//青色
break;
case 1://敌人的坦克
g.setColor(Color.yellow);//
break;
}
//根据坦克的方向,来绘制不同方向的坦克
switch (director){
case 0://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) {
//
}
//处理wdsa键按下的情况
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_W){
//改变坦克的方向
myHero.setDirect(0);
myHero.moveup();
}else if(e.getKeyCode()==KeyEvent.VK_D){//右移动
myHero.setDirect(1);
myHero.moveRight();
}else if(e.getKeyCode()==KeyEvent.VK_S){//
myHero.setDirect(2);
myHero.moveDown();
}else if(e.getKeyCode()==KeyEvent.VK_A){
myHero.setDirect(3);
myHero.moveLeft();
}
this.repaint();//让面板重绘
}
}
public class TankeGame02 extends JFrame {//框架
//定义一个pannel
MyPanel mp=null;
public static void main(String[] args) {
TankeGame02 tankeGame01 = new TankeGame02();
}
public TankeGame02(){
mp=new MyPanel();
this.add(mp);//把面板就是绘图区)
this.addKeyListener(mp);//让JFrame 监听mp的键盘事件
this.setSize(1000,750);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
总结 Tank1-Myhero(自己的坦克),绘图MyPanle(监视),框架Tankegame 继承JFrame(加入监视)
P578绘制敌人的坦克(集合)
增加的部分
public class EnemyTank extends Tank1{
public EnemyTank(int x, int y) {
super(x, y);
}
}
public class MyPanel extends JPanel implements KeyListener {//绘图区
//定义我的坦克
MyHero myHero=null;
//定义敌人坦克,放入到vector
Vector<EnemyTank> enemyTanks=new Vector<>();
int ennyTanksize=3;
public MyPanel(){
myHero=new MyHero(100,100);//初始化自己的坦克
myHero.setSpeed(8);
//初始化敌人坦克
for (int i = 0; i <ennyTanksize ; i++) {
EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);
enemyTank.setDirect(2);//为了让头向下
enemyTanks.add(enemyTank);
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形,默认黑色
//画出坦克-封装方法
drawTank(myHero.getX(), myHero.getY(), g,myHero.getDirect(),1);
//画出敌人的坦克
for (int i = 0; i <enemyTanks.size() ; i++) {
//取出坦克
EnemyTank enemyTank=enemyTanks.get(i);
drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirect(),0);
}
}
P579程序进行线程