目录
1.控制小球移动
1.先定义一个Mypanel,继承JPanel,画图行就在面板上画。
Mypanel可以理解为一个画板
Graphics可以理解为一个画笔,提供了很多绘图的方法
.第二步
//定义一个面板
private MyPanel mp=null;
**3.第三步
public drawCircle(){
//初始化面板
mp=new MyPanel();
//把面板放人窗口
this.add(mp);
//设置窗口大小
this.setSize(400,300);
this.setVisible(true);
}**
1.绘制小球
//演示通过键盘控制小球上下左右的移动,Java的事件控制
public class BallMove extends JFrame{
private MyPanel mp=null;
public static void main(String[] args) {
new BallMove();
}
public BallMove(){
mp=new MyPanel();
this.add(mp);
this.setSize(500,400);
this.addKeyListener(mp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//可以显示
}
}
//面板,画出小球
//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
int x=10;
int y=10;
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x,y,30,30);
}
//当点击窗口小叉,程序完全退出。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2.键盘监听器
//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
int x=10;
int y=10;
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x,y,30,30);
}
//有字符输出,该方法触发
@Override
public void keyTyped(KeyEvent e) {
}
//当某个键按下,该方法触发
@Override
public void keyPressed(KeyEvent e) {
//System.out.println((char)e.getKeyChar()+"被按下");
//根据用户按下的不同键,来处理小球上下左右的移动。
if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
y+=6;
}else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
y-=6;
}else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向右移动对应的的code{
x+=7;
}else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向左移动对应的的code{
x-=7;
}
//让面板重绘
this.repaint();
}
//当某个键释放,该方法触发
@Override
public void keyReleased(KeyEvent e) {
}
通过键盘控制小球上下左右的移动,Java的事件控制
package com.event_;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* @version 1.0
* @auther Demo龙
*/
//演示通过键盘控制小球上下左右的移动,Java的事件控制
public class BallMove extends JFrame{
private MyPanel mp=null;
public static void main(String[] args) {
new BallMove();
}
public BallMove(){
mp=new MyPanel();
this.add(mp);
this.setSize(500,400);
this.addKeyListener(mp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//可以显示
}
}
//面板,画出小球
//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
int x=10;
int y=10;
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x,y,30,30);
}
//有字符输出,该方法触发
@Override
public void keyTyped(KeyEvent e) {
}
//当某个键按下,该方法触发
@Override
public void keyPressed(KeyEvent e) {
//System.out.println((char)e.getKeyChar()+"被按下");
//根据用户按下的不同键,来处理小球上下左右的移动。
if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
y+=6;
}else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
y-=6;
}else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向上移动对应的的code{
x+=7;
}else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向上移动对应的的code{
x-=7;
}
//让面板重绘
this.repaint();
}
//当某个键释放,该方法触发
@Override
public void keyReleased(KeyEvent e) {
}
}
2.控制坦克移动
1.绘制坦克
package com.tankgame01;
import javax.swing.*;
import java.awt.*;
/**
* @version 1.0
* @auther Demo龙
*/
//坦克大战的绘图区域
public class MyPanel extends JPanel {
//定义我的坦克
Hero hero=null;
public MyPanel() {
hero =new Hero(100,100);//初始化自己的坦克
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形默认黑色
//画出坦克封装方法。
drawtank(hero.getX(),hero.getY(),g,0,0);
}
/**
* @param x 坦克的左上角x坐标
* @param y 坦克的左上角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.magenta);
break;
case 1://敌人的坦克
g.setColor(Color.yellow);
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;
default:
System.out.println("暂时没有处理");
}
}
}
2.键盘监听器
1.控制键盘上下左右改变坦克方向并移动坦克
//根据坦克方向,绘制对应形状的坦克
//分别用0上1右2下3左
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("暂时没有处理");
}
//根据用户按下的不同键,来处理坦克上下左右的移动。
if(e.getKeyCode()==KeyEvent.VK_S){//KeyEvent.VK_S就是向下移动对应的的code
//改变坦克的方向
hero.setDirect(2);
hero.down();
//修改坦克的坐标
}else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
hero.setDirect(0);
hero.up();
}else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向右移动对应的的code{
hero.setDirect(1);
hero.right();
}else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向左移动对应的的code{
hero.setDirect(3);
hero.left();
}
this.repaint();
}
2.控制坦克移动
1.坦克父类对象
package com.tankgame02;
/**
* @version 1.0
* @auther Demo龙
*/
public class Tank {
private int x;//坦克横坐标
private int y;//坦克纵坐标
private int direct;//坦克方向
private int speed;//坦克速度
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
//向上下左右移动
public void up(){
y-=speed;
}
public void down(){
y+=speed;
}
public void right(){
x+=speed;
}
public void left(){
x-=speed;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
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;
}
}
2.坦克子类对象
package com.tankgame02;
/**
* @version 1.0
* @auther Demo龙
*/
//主角坦克
public class Hero extends Tank {
public Hero(int x, int y) {//构造器
super(x, y);
}
}
3.坦克绘制主函数
package com.tankgame02;
import javax.swing.*;
/**
* @version 1.0
* @auther Demo龙
*/
public class tankgame02 extends JFrame {
//定义MyPanel
MyPanel mp=null;
public static void main(String[] args) {
new tankgame02();
}
public tankgame02() {
mp=new MyPanel();
this.add(mp);
this.setSize(1000,750);
this.addKeyListener(mp);
//当点击窗口小叉,程序完全退出。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//可以显示
}
}
4.坦克画板
package com.tankgame02;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* @version 1.0
* @auther Demo龙
*/
//坦克大战的绘图区域
//为了监听键盘事件,实现
public class MyPanel extends JPanel implements KeyListener {
//定义我的坦克
Hero hero=null;
public MyPanel() {
hero =new Hero(100,100);//初始化自己的坦克
hero.setSpeed(6);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0,0,1000,750);//填充矩形默认黑色
//画出坦克封装方法。
drawtank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
}
/**
* @param x 坦克的左上角x坐标
* @param y 坦克的左上角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.magenta);
break;
case 1://敌人的坦克
g.setColor(Color.yellow);
break;
}
//根据坦克方向,绘制对应形状的坦克
//分别用0上1右2下3左
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_S){//KeyEvent.VK_S就是向下移动对应的的code
//改变坦克的方向
hero.setDirect(2);
hero.down();
//修改坦克的坐标
}else if(e.getKeyCode()==KeyEvent.VK_W){//KeyEvent.VK_W就是向上移动对应的的code{
hero.setDirect(0);
hero.up();
}else if(e.getKeyCode()==KeyEvent.VK_D){//KeyEvent.VK_D就是向右移动对应的的code{
hero.setDirect(1);
hero.right();
}else if(e.getKeyCode()==KeyEvent.VK_A){//KeyEvent.VK_A就是向左移动对应的的code{
hero.setDirect(3);
hero.left();
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}