TankWar小型游戏开发全过程(尚学堂视频免费提供)

 TankWar0.1
版本功能:创建一个窗口
import java.awt.*;


public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(800,600);//设置高度
  setVisible(true);//
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }

}

TankWar0.2
版本功能点
1 添加关闭窗口的事件处理
2 不予许窗口的大小改动
我们要创建一个监听类,有三种方式一个是写一个同级别的类
2 写一个类部类
3 写一个匿名类 我们采用第三种方法
思考点:匿名类:
使用场合:
类短小,不涉及将来的类扩展,不涉及重要的业务逻辑
import java.awt.*;


public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(800,600);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  setVisible(true);//
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }

}
掌握:通过Eclipse重写父类的方法
子类名->soure->override


TankWar0.3
版本功能点
1 画出坦克的实心圆
2 掌握paint方法

import java.awt.*;


public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
 public void paint(Graphics g){//绘图类
  Color c=g.getColor();//获取当前前景色
  g.setColor(Color.RED);//设置颜色为红色
  g.filloval(50,50,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
  g.getColor(c);//还原前景色

 }
 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(800,600);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setBackground(Color.GREEN);
  setVisible(true);//
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }

}
TankWar0.4
版本功能点
1 让坦克运动起来
 实现步骤:
  1.将位置改变为变量
  2 启动线程不断重画
  3 每次重画改变Tank位置
     用线程画的好处
   1 线程重画更均匀
   2 按键重画不能解决子弹飞行的问题

import java.awt.*;


public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
        int x=50,y=50;
 public void paint(Graphics g){//绘图类
  Color c=g.getColor();//获取当前前景色
  g.setColor(Color.RED);//设置颜色为红色
  g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
  g.getColor(c);//还原前景色
  y+=5;
 }
 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(800,600);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setBackground(Color.GREEN);
  setVisible(true);//

  new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }
 public class PaintThread implements Runable{//内部类启动线程机制
  public void run(){
   while(true)
    repaint();
   try{
    Thread.sleep(100);
   }catch(InterruptedException e){
    e.printStackTrace();
   }

  }
 }

}
TankWar0.41
版本功能点
1 使用双缓冲消除闪烁现象
原因:
1 刷新频率太快,paint方法还没有完成
2 逐条显示
解决办法
将所有东西画在虚拟图片上,一次性显示出来
实现步骤:

import java.awt.*;
import java.awt.event.*;

public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600

        int x=50,y=50;

  Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去 

 public void paint(Graphics g){//绘图类
  Color c=g.getColor();//获取当前前景色
  g.setColor(Color.RED);//设置颜色为红色
  g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
  g.getColor(c);//还原前景色
  y+=5;
 }

 public void update(Graphics g){
  if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
   offScreenImage = this.createImage(800,600);
  }
  Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
  Color c = gOffScreen.getColor();
  gOffScreen.setColor(Color.GREEN);
  gOffScreen.fillRect(0,0,800,600);
  gOffScreen.setColor(c);
  paint(gOffScreen);//绘制背面图片
  g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
 }

 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(800,600);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setBackground(Color.GREEN);
  setVisible(true);//

  new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }
 public class PaintThread implements Runable{//内部类启动线程机制
  public void run(){
   while(true)
    repaint();
   try{
    Thread.sleep(100);
   }catch(InterruptedException e){
    e.printStackTrace();
   }

  }
 }

}
TankWar0.5
版本功能点
代码重构:
 将以后可能需要的多处改变的量为常量
定义常量的好处

import java.awt.*;
import java.awt.event.*;

public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
  
  public static final int GAME_WIDTH=800;
  public static final int GAME_HEIGHT=600;
        int x=50,y=50;

  Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去 

 public void paint(Graphics g){//绘图类
  Color c=g.getColor();//获取当前前景色
  g.setColor(Color.RED);//设置颜色为红色
  g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
  g.getColor(c);//还原前景色
  y+=5;
 }

 public void update(Graphics g){
  if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
   offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
  }
  Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
  Color c = gOffScreen.getColor();
  gOffScreen.setColor(Color.GREEN);
  gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
  gOffScreen.setColor(c);
  paint(gOffScreen);//绘制背面图片
  g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
 }

 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setBackground(Color.GREEN);
  setVisible(true);//

  new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }
 public class PaintThread implements Runable{//内部类启动线程机制
  public void run(){
   while(true)
    repaint();
   try{
    Thread.sleep(100);
   }catch(InterruptedException e){
    e.printStackTrace();
   }

  }
 }

}

TankWar0.6
版本功能点:为坦克加上键盘监听
 有两个方法,一个就是extends KeyAdapter 另外一个  implements KeyLister接口

import java.awt.*;
import java.awt.event.*;

public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
  
  public static final int GAME_WIDTH=800;
  public static final int GAME_HEIGHT=600;
        int x=50,y=50;

  Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去 

 public void paint(Graphics g){//绘图类
  Color c=g.getColor();//获取当前前景色
  g.setColor(Color.RED);//设置颜色为红色
  g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
  g.getColor(c);//还原前景色
  
 }

 public void update(Graphics g){
  if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
   offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
  }
  Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
  Color c = gOffScreen.getColor();
  gOffScreen.setColor(Color.GREEN);
  gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
  gOffScreen.setColor(c);
  paint(gOffScreen);//绘制背面图片
  g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
 }

 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setBackground(Color.GREEN);
  setVisible(true);//

  this.addKeyListener(new KeyMonitor);

  new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }
 public class PaintThread implements Runable{//内部类启动线程机制
  public void run(){
   while(true)
    repaint();
   try{
    Thread.sleep(100);
   }catch(InterruptedException e){
    e.printStackTrace();
   }

  }
 }
 public class KeyMonitor extends KeyAdapter{//键盘监听类
  public void KeyPressed(KeyEvent e){//键盘事件
   int key=e.getKeyCode();//获取键盘的虚拟键
    switch(key){//对虚拟键分析是否
    case KeyEvent.VK_LEFT:
     x-=5;
     break;
     case KeyEvent.VK_UP:
     y-=5;
     break;
     case KeyEvent.VK_RIGHT:
     x+=5;
     break;
     case KeyEvent.VK_DOWN:
     y+=5;
     break;
    }
   
  
  }
 }

}

TankWar0.7
版本功能点:面向对象的真正应用,Tank类的书写
 public class Tank{

  int x,y;

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

  //让坦克自己画自己
  public void draw((Graphics g){
   Color c=g.getColor();//获取当前前景色
   g.setColor(Color.RED);//设置颜色为红色
   g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
   g.getColor(c);//还原前景色
  
  }

  //让坦克自己动起来
  public void keyPressed(KeyEvent e){
   
    int key=e.getKeyCode();//获取键盘的虚拟键
    switch(key){//对虚拟键分析是否
    case KeyEvent.VK_LEFT:
     x-=5;
     break;
     case KeyEvent.VK_UP:
     y-=5;
     break;
     case KeyEvent.VK_RIGHT:
     x+=5;
     break;
     case KeyEvent.VK_DOWN:
     y+=5;
     break;
    }
   
  }
 }

 


import java.awt.*;
import java.awt.event.*;

public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
  
  public static final int GAME_WIDTH=800;
  public static final int GAME_HEIGHT=600;
  
  Tank mytank = new Tank(50,30);

  Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去 

 public void paint(Graphics g){//绘图类
  //让坦克自己画自己
  mytank.draw(g);
  
 }

 public void update(Graphics g){
  if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
   offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
  }
  Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
  Color c = gOffScreen.getColor();
  gOffScreen.setColor(Color.GREEN);
  gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
  gOffScreen.setColor(c);
  paint(gOffScreen);//绘制背面图片
  g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
 }

 public void lauchFrame(){
  this.setLocation(400,300);//设置位置
  this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
  this.setTitle("TankWar");//设置标题
  this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setBackground(Color.GREEN);
  setVisible(true);//

  this.addKeyListener(new KeyMonitor);

  new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
 }  
 
 public static void main(String[] args) {
  TankClient tc=new TankClient();
  tc.lauchFrame();

 }
 public class PaintThread implements Runable{//内部类启动线程机制
  public void run(){
   while(true)
    repaint();
   try{
    Thread.sleep(100);
   }catch(InterruptedException e){
    e.printStackTrace();
   }

  }
 }
 public class KeyMonitor extends KeyAdapter{//键盘监听类
  public void KeyPressed(KeyEvent e){//键盘事件
   //让坦克自己动起来
   mytank.keyPressed(e);
  
  }
 }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值