到目前为止,Piece对象也创建好了,所以“物资”齐全,该准备登上游戏的舞台———MainFrame中了,要想让物快在舞台上表演,得有”演员“在”舞台"上啊.所以,在MainFrame中提供了表示当前正在运动的Piece对象的引用currentPiece和下一个方块的引用nextPiece

private Piece currentPiece;
 private Piece nextPiece;

注意了当前大方块的运动是在GamePanel中运行的,(需要提出的是,游戏界面包括两个部分,一是方块的堆积界面GamePanel,一是工具界面。整个游戏界面用GameFrame来类实现),在MainFrame中提供了gamePanel(private GamePanel gamePanel;)

在继承JPanel中的GamePanel类中提供了实现了paint方法,把当前的大方块画到界面上。但是怎么在游戏界面MainFrame里得到当前运动的大方块呢?方法就是在GamePanel里提供一个MainFrame的引用mainFrame,(MainFrame mainFrame;),

并提供一个构造器来初始化mainFrame。

public GamePanel(MainFrame mainFrame) {
 this.mainFrame = mainFrame;
 }

为MainFrame类提供了一个获得当前下降大方块的方法

public Piece getCurrentPiece(){
  return this.currentPiece;
 }

public void paint(Graphics g) {
 //画背景
 g.drawImage(this.background,0, 0,
   this.getWidth(),this.getHeight(),null);
 
 //画当前运动的方块
 /**
  * 由于方块是在游戏界面gamepanel里动的,所以在这里定义了话piece的方法
  */
 Piece currentPiece = this.mainFrame.getCurrentPiece();
 ImageUtil.paintPiece(g, currentPiece);
 
}

在这里我们将GamePanel看做是一个二维数组,每一个Square都是二维数组的一个元素,然后再paint中将这些小方块画到GamePanel中。当大方块进行下降的时候,GamePanel中就根据这个二维数组进行重画。注意二维数组中的Square元素是只含有位置而不含有图片的Square对象,为此需要在Square类里提供一个构造器

/*
  * 初始化方块的位置和图片。用来作为gamePanel存放有图片的square二维数组的元素
  */
  public Square(int beginX, int beginY) {
         this.image = image;
         this.beginX = beginX;
         this.beginY = beginY;
     }

当一个Piece对象完成下降时,我们需要将这个Piece里面有的带有图片的Square记录到MainFrame中。没完成一个下降就把Square加入二维数组中。下面是初始化界面的二维数组

/**
  * 游戏的界面看做是个二维数组组成的平面
  * 当一个piece对象完成下降是,需要将这个piece里面所有的square对象添加到mainframe中
  * 也就是gamePanel中。在mainframe类里提供一个二维数组来存放一个square对象
  * 每个完成下降的piece都将自己所有的square对象存放到一个二维数组中
  * 注意只是初始化这个二维数组,绘制二维数组在gamePanel里绘制
  */
 private void initSquares() {
  
  int xSize = this.gamePanel.getWidth()/Piece.SQUARE_BORDER;
  int ySize = this.gamePanel.getHeight()/Piece.SQUARE_BORDER;
  
  this.squares = new Square[xSize][ySize];
  for(int i = 0; i < this.squares.length; i++) {
   for (int j = 0; j < this.squares[i].length; j++) {
    this.squares[i][j] = new Square(Piece.SQUARE_BORDER * i,
      Piece.SQUARE_BORDER * j);
   }
  }
 }

此方法在ManFrame里调用,以便在运行程序时就可以将二维数组初始化,然后再GamePanel里画出来。在这里MainFrame类里又提供了

private Square[][] squares;和

//得到游戏gamepanel的二维数组
 public Square[][] getSquares() {
  // TODO Auto-generated method stub
  return this.square

}

这样在GamePanel类里就可以画好在GamePanel界面了(在paint里画)代码如下

public void paint(Graphics g) {
 //画背景
 g.drawImage(this.background,0, 0,
   this.getWidth(),this.getHeight(),null);
 
 //画当前运动的方块
 /**
  * 由于方块是在游戏界面gamepanel里动的,所以在这里定义了话piece的方法
  */
 Piece currentPiece = this.mainFrame.getCurrentPiece();
 ImageUtil.paintPiece(g, currentPiece);
 
 //
 Square[][] squares = this.mainFrame.getSquares();
 
 if(squares == null) return ;
 //绘制用来存放二维数组的代码,
 for(int i=0;i<squares.length;i++) {
  for(int j=0;j<squares[i].length;j++) {
   Square s = squares[i][j];
   if( s!=null) {
    g.drawImage(s.getImage(), s.getBeginX(), s.getBeginY(),this);
   /*
    * g.drawImage(null, s.getBeginX(), s.getBeginY(),this);
    * 二维数组代码是用来存放带有图片的square的,可以发现把s.getImage()改成null
    * 也可以,因为本身画二维数组的square就没有图片
    */
    
  }
 }
 
 }
到此位置就完成了GamePanel的设计其完整的类如下

public class GamePanel extends JPanel {
   MainFrame mainFrame;
  
   /**
    * 得到背景图卡
    */
  private Image background =
   ImageUtil.getImage("images/background.jpg");

public GamePanel(MainFrame mainFrame) {
 this.mainFrame = mainFrame;
 }

public void paint(Graphics g) {
 //画背景
 g.drawImage(this.background,0, 0,
   this.getWidth(),this.getHeight(),null);
 
 //画当前运动的方块
 /**
  * 由于方块是在游戏界面gamepanel里动的,所以在这里定义了话piece的方法
  */
 Piece currentPiece = this.mainFrame.getCurrentPiece();
 ImageUtil.paintPiece(g, currentPiece);
 
 //
 Square[][] squares = this.mainFrame.getSquares();
 
 if(squares == null) return ;
 //绘制用来存放二维数组的代码,
 for(int i=0;i<squares.length;i++) {
  for(int j=0;j<squares[i].length;j++) {
   Square s = squares[i][j];
   if( s!=null) {
    g.drawImage(s.getImage(), s.getBeginX(), s.getBeginY(),this);
   /*
    * g.drawImage(null, s.getBeginX(), s.getBeginY(),this);
    * 二维数组代码是用来存放带有图片的square的,可以发现把s.getImage()改成null
    * 也可以,因为本身画二维数组的square就没有图片
    */
    
  }
 }
 
 }
}
}

制作单机俄罗斯游戏心得(三)相关推荐

  1. cocos2dx 制作单机麻将(三)

    cocos2dx 制作单机麻将(三) 麻将逻辑4.得到手牌数据 我们已经保存了一个一维数组, 类似于一个表格,统计出所有牌对应的数量, 但我们怎样得到当前手中是什么牌呢 //扑克转换 BYTE Swi ...

  2. 计算机ppt制作培训心得体会,制作ppt学习心得体会.doc

    制作ppt学习心得体会 现在多采用多媒体教学,在这样特殊的教学模式下,很多时候,我们老师都碍于自己的课件做得不好,而出钱请别人为我们制作.下面是pincai整理的制作ppt学习心得体会,欢迎大家阅读! ...

  3. 计算机ppt培训心得体会,制作ppt学习心得体会

    <制作ppt学习心得体会.doc>由会员分享,可免费在线阅读全文,更多与<制作ppt学习心得体会>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1 ...

  4. java单机麻将_cocos2dx 制作单机麻将(五)

    cocos2dx 制作单机麻将(五) 麻将逻辑6 最基础的4人麻将逻辑(轮流循环出牌, 之前学的都能用上  跑起来了!!!) 最基础的麻将逻辑 依据自己须要 设置麻将人数GAME_PLAYER 基本流 ...

  5. 计算机ppt培训心得体会,课件制作的培训心得体会

    课件制作的培训心得体会 导语:在利用刻衣制作笔袋的过程中,让我感触颇深,也让我体会到许多动手的乐趣,将自己的想法付诸于实践.以下是小编为大家整理分享的课件制作的培训心得体会,欢迎阅读参考. 课件制作的 ...

  6. cocos2dx 制作单机麻将(五)

    cocos2dx 制作单机麻将(五) 麻将逻辑6 最基础的4人麻将逻辑(轮流循环出牌, 之前学的都能用上  跑起来了!!!) 最基础的麻将逻辑 根据自己需要 设置麻将人数GAME_PLAYER 基本流 ...

  7. cocos2dx 制作单机麻将(二)

    cocos2dx 制作单机麻将(二) 打乱麻将顺序2 前面解说了怎样打乱初始给定的麻将牌堆, 另一种是打乱随意给定的麻将牌堆 //混乱扑克2 void RandAppointCardData(BYTE ...

  8. linux下打包deb文件,制作deb包的三种方法

    制作deb包的三种方法 发布时间:2008-06-10 16:05:39来源:红联作者:Mhynan 我所知道的制作deb包有三种方法,一种是将现有的文件打包,安装该包就像将打包的文件释放到某个目录: ...

  9. BT源代码学习心得(三):种子文件的编码方式 -- 转贴自wolfenstein (NeverSayNever)

    BT源代码学习心得(三):种子文件的编码方式 author: wolfenstein BT的作者使用了一种比较简单易懂的编码方式来对设计种子文件.这种编码方式能够很简单得对python中的各种数据类型 ...

  10. 我的世界制作服务器地图,我的世界1.7地图制作必看心得 教你怎么做地图

    来源:游戏园日期:2019-06-26 04:04:14 我的世界1.7地图制作必看心得 教你怎么做地图.下面的就是有关1.7版本的地图制作心得了,下面的内容可以说是地图制作者的福利攻略哦!那喜欢自己 ...

最新文章

  1. 建立循环单链表(头插法)
  2. Windows自带Android模拟器启动失败
  3. 端口如何支持非localhost访问_Spring Boot 教程:CORS 支持
  4. python课程将主要介绍哪些内容-Python窗口的基本介绍
  5. c++11 多线程传参和生产者消费者实现
  6. PE文件格式(加密与解密3)(一)
  7. java的URLEncoder.encode() 疑问与解惑
  8. 17.vue移动端项目二
  9. lombok构造方法_最佳实践Lombok
  10. 移动端click事件延迟300ms到底是怎么回事,该如何解决?
  11. 【目标定位】基于matlab UWB卡尔曼滤波追踪无线时钟同步误差【含Matlab源码 1626期】
  12. 处理非window设置为window的Owner
  13. 《深入浅出MFC》读书笔记
  14. 【爱思考】CISP考试基本介绍
  15. 织梦dedecms蓝色大学院校学校网站模板(自适应手机移动端)
  16. 搬砖之余干什么?推荐这几个优质公众号
  17. choco 使用详解
  18. php is_subclass_of,PHP is_subclass_of() 函数用法及示例
  19. 店盈通电商:拼多多发货地址不一样有关系吗?
  20. 查询你的手机或者邮箱注册过那些网站

热门文章

  1. php中is upload,PHP中,文件上传
  2. canvas需要gpu_提高HTML5 canvas性能的几种方法(转)
  3. 基于深度学习的单目图像深度估计
  4. 实操教程|称霸Kaggle的十大深度学习技巧
  5. 基于先验LiDAR点云地图的单目VIO定位
  6. [pl-slam] 几个重要的参数属性
  7. Android IntentService的使用和源代码分析
  8. 20155202 《Java程序设计》实验二(面向对象程序设计)实验报告
  9. JS实现图片无缝滚动特效;附addEventListener()方法、offsetLeft和offsetWidth属性。
  10. android夸项目调用