零基础学JAVA--Day37(坦克大战1.0)

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天~

相关推荐
OranTech2 小时前
第28节课-夕夕超市收银系统(下)-笔记
java
IDOlaoluo2 小时前
jakarta-tomcat-connectors-jk2-src.tar.gz 安装教程(详细步骤及附安装包)
java·tomcat
SheepHappy2 小时前
MyBatis-Plus 源码阅读(三)条件构造器原理深度剖析
java·源码阅读
zhaomy20252 小时前
从ThreadLocal到ScopedValue:Java上下文管理的架构演进与实战指南
java·后端
用户84913717547162 小时前
从源码看设计:Java 集合框架的安全性与性能权衡 (基于 JDK 1.8)
java·面试
华仔啊2 小时前
10分钟搞定!SpringBoot+Vue3 整合 SSE 实现实时消息推送
java·vue.js·后端
u***u6852 小时前
PHP在电商中的WooCommerce
开发语言·php
冠希陈、2 小时前
PHP 过滤敏感词(含类库)
开发语言·php·内容敏感词
l***77522 小时前
总结:Spring Boot 之spring.factories
java·spring boot·spring