您的位置 首页 百科

乒乓球游戏(乒乓球游戏2.0)

乒乓球游戏
    点击上方「processing之旅」可快速关注我们    

之前制作的乒乓球游戏,比较简单。在这个版本中,设置了一些随机的障碍物来增加可玩性。有了随机性,才会更有意思。
在这个版本中创建了一些板子作为障碍物。并且让它们可以向下移动。

1.先定义一个存储板子的数组,再定义一些相关的变量。

1var boards = [];            //定义板子的数组
2var boardSpeed = 2;         //定义和设置板子向下移动的速度
3var boardInterval = 5000;   //定义和设置前后两个板子之间间隔的时间
4var lastAddTime = 0;        //定义记录上次增加板子时间的变量,并且设置初值为0
5var minGapWidth = 200;      //定义板子间隙最小值的变量
6var maxGapWidth = 300;      //定义板子间隙最大值的变量
7var boardHeight = 30;       //定义板子高度的变量
8var boardColor;             //定义板子颜色的变量2.然后定义一个增加板子的方法,隔一段时间就增加一个新的板子,板子的宽度和板子的间隙都使随机的。然后把这些板子的参数都存储在板子的数组中。
1function boardAdder() {           //定义添加板子的方法
2  if (millis()-lastAddTime > boardInterval) {                          //如果当前时间与上次添加板子的时间,相差一个间隔,就增加一个新的板子
3    var randWidth = round(random(minGapWidth, maxGapWidth));           //定义板子空隙的宽度的变量,设置为一个随机数,范围是从最小值到最大值
4    var randX = round(random(0, width-randWidth));                     //定义左边板子的宽度的变量,设置为一个随机数,范围是从0到画布的宽度减去间隙的宽度
5             // [左边板子的横坐标, 左边板子的纵坐标, 板子间隙的宽度, 板子间隙的高度, 通过板子的得分情况]
6    var randBoard = [randX/2, -boardHeight/2, randWidth, boardHeight, 0];  //定义一个记录这个新的板子参数的数组,并设置数组的值
7    boards.push(randBoard);                                            //将这个新的板子的参数添加到板子数组中,板子数组中存储着所有没有被删除的板子
8    lastAddTime = millis();                                            //设置上次添加板子的时间为当前的时间
9  }
10}
3.接下来就可以根据这些参数来绘制板子了,定义一个绘制板子的方法
1function boardDrawer(index) {    //定义绘制板子的方法          
2  var board = boards[index];     //定义一个数组,并将板子数组中的一个板子取出来,把它的参数赋值给该数组
3
4  var boardLeftX = board[0];          //定义左边板子的横坐标,并把板子的横坐标赋值给它
5  var boardLeftY = board[1];          //定义左边板子的纵坐标,并把板子的纵坐标赋值给它
6  var gapBoardWidth = board[2];       //定义板子间隙的宽度,并给板子间隙的宽度赋值给它
7  var gapBoardHeight = board[3];
8  var boardLeftWidth = 2*boardLeftX;      //定义左边板子的宽度,并给它赋值
9  var boardRightX = width-(width-(boardLeftWidth+gapBoardWidth))/2; //定义右边板子的横坐标,并给它赋值
10  var boardRightY = boardLeftY;                                     //定义右边板子的纵坐标,并给它赋值
11  var boardRightWidth =width-(boardLeftWidth+gapBoardWidth) ;       //定义右边板子的宽度,并给它赋值
12
13 // rectMode(CORNER);            //设置矩形的模式为居中模式,前两个参数为中心的坐标,后两个参数是矩形的长宽
14  rectMode(CENTER);              //设置矩形的模式为居中模式,前两个参数为矩形中心的坐标,后两个参数是矩形的长宽
15  fill(boardColor);              //填充板子的颜色
16  rect(boardLeftX, boardLeftY, boardLeftWidth, boardHeight, 0, 15, 15, 0);   //绘制左边的板子,并设置它的右上角和右下角为圆角,圆角的半径为15
17  rect(boardRightX, boardRightY,boardRightWidth, boardHeight, 15, 0, 0, 15); //绘制右边的板子,并设置它的左上角和左下角为圆角,圆角的半径为15
18}
4.想要这些板子向下移动,我们需要定义一个板子移动的方法,并且在板子向下移动到画布的下边缘时,要将这个板子删除,还要定义一个删除板子的方法。
1function boardMover(index) {     //定义板子移动的方法
2  var board = boards[index];     //定义一个数组,并将板子数组中的一个板子取出来,把它的参数赋值给该数组
3  board[1]+= boardSpeed;         //使这个数组的第二个元素,即板子的纵坐标,加上板子的速度,这样就可以使板子向下移动
4}
5function boardRemover(index) {           //定义板子删除的方法
6  var board = boards[index];             //定义一个数组,并将板子数组中的一个板子取出来,把它的参数赋值给该数组
7  if (board[1]> height+boardHeight/2) {  //如果板子向下移动是,它的纵坐标超过了画布的高度,即画布的最下边
8    boards.splice(index,1);              //使用删除数组元素的方法,将这个板子从板子数组中删除
9  }
10}
5.下面就要让球在碰到板子时,板子可以使球反弹。我们定义一个反弹球的方法。在球碰到板子的下面时,使球向下反弹;在球碰到板子的上面时,使球向上反弹。并且在球通过板子的间隙时,可以得分,每通过一个间隙得10分。
1function watchBoardCollision(index) {    //定义板子碰撞的方法
2  var board = boards[index];             //定义一个数组,并将板子数组中的一个板子取出来,把它的参数赋值给该数组
3
4  var boardLeftX = board[0];             //定义左边板子的横坐标,并把板子的横坐标赋值给它
5  var boardLeftY= board[1];              //定义左边板子的纵坐标,并把板子的纵坐标赋值给它
6  var gapBoardWidth = board[2];          //定义板子间隙的宽度,并给板子的宽度赋值给它
7  var gapBoardHeight = board[3];
8  var boardScored = board[4];            //定义通过板子的得分情况,得分为1,未得分为0
9  var boardLeftWidth = 2*boardLeftX;     //定义左边板子的宽度,并给它赋值  
10  var boardRightX = width-(width-(boardLeftWidth+gapBoardWidth))/2; //定义右边板子的横坐标,并给它赋值
11  var boardRightY = boardLeftY;                                     //定义右边板子的纵坐标,并给它赋值
12  var boardRightWidth =width-(boardLeftWidth+gapBoardWidth) ;       //定义右边板子的宽度,并给它赋值
13  var gapBoardY = boardLeftY;                                       //定义板子间隙的纵坐标,并给它赋值
14  var boardMoveDistance = boardSpeed;                               //定义板子在两个帧之间移动的距离
15
16   //左边板子向下反弹球    
17    if (
18      (ballY>boardLeftY)&&                                      //如果球在板子的下方
19      (ballX-(ballSize/2)<boardLeftX+boardLeftWidth/2) &&       //并且球没有超出板子的右边缘
20      (ballX+(ballSize/2)>boardLeftX-boardLeftWidth/2)          //并且球没有超出板子的左边缘
21      ){
22        if(dist(ballX, ballY, ballX, boardLeftY)<=(ballSize/2+boardMoveDistance+boardHeight/2)){  //继续判断,如果球与板子相接触
23
24           makeBounceTop(boardLeftY+boardHeight/2);             //调用上边反弹方法并将板子下表面的纵坐标传回去,使球向下反弹
25           ballY+=boardMoveDistance;                            //设置球的位置,使球增加一段向下的移动距离
26           ballSpeedVert+= boardSpeed;                          //设置球的垂直速度,使球在垂直速度上增加板子的移动速度
27       }
28    }
29   //右边板子向下反弹球
30  if ( 
31     (ballY> boardRightY)&&                                     //如果球在板子的下方
32      (ballX-(ballSize/2)<boardRightX+boardRightWidth/2) &&     //并且球没有超出板子的右边缘
33      (ballX+(ballSize/2)>boardRightX-boardRightWidth/2)        //并且球没有超出板子的左边缘
34      ){
35        if(dist(ballX, ballY, ballX, boardRightY)<=(ballSize/2+boardMoveDistance+boardHeight/2)){  //继续判断,如果球与板子相接触
36
37           makeBounceTop(boardRightY+boardHeight/2);           //调用上边反弹方法并将板子下表面的纵坐标传回去,使球向下反弹  
38           ballY+=boardMoveDistance;                           //设置球的位置,使球增加一段向下的移动距离
39           ballSpeedVert+= boardSpeed;                         //设置球的垂直速度,使球在垂直速度上增加板子的移动速度
40        }
41   }
42  //左边板子向上反弹球
43   if (
44      (ballY<boardLeftY)&&                                     //如果球在板子的上方
45      (ballX-(ballSize/2)<boardLeftX+boardLeftWidth/2) &&      //并且球没有超出板子的右边缘
46      (ballX+(ballSize/2)>boardLeftX-boardLeftWidth/2)         //并且球没有超出板子的左边缘
47      ){
48        if(dist(ballX, ballY, ballX, boardLeftY)<=(ballSize/2-boardMoveDistance+boardHeight/2)){  //继续判断,如果球与板子相接触
49
50           makeBounceBottom(boardRightY-boardHeight/2);        //调用下边反弹方法并将板子上表面的纵坐标传回去,使球向上反弹
51           ballY-=boardMoveDistance;                           //设置球的位置,使球减少一段向下的移动距离
52       }
53   }
54  //右边板子向上反弹球
55
56  if (
57    (ballY< boardRightY)&&                                    //如果球在板子的上方
58      (ballX-(ballSize/2)<boardRightX+boardRightWidth/2) &&   //并且球没有超出板子的右边缘
59      (ballX+(ballSize/2)>boardRightX-boardRightWidth/2)      //并且球没有超出板子的左边缘
60      ){
61        if(dist(ballX, ballY, ballX, boardRightY)<=(ballSize/2-boardMoveDistance+boardHeight/2)){  //继续判断,如果球与板子相接触
62
63           makeBounceBottom(boardRightY-boardHeight/2);       //调用下边反弹方法并将板子上表面的纵坐标传回去,使球向上反弹
64           ballY-=boardMoveDistance;                          //设置球的位置,使球减少一段向下的移动距离
65       }
66   }
67
68if (ballY < gapBoardY-(boardHeight/2) && boardScored==0) {  //如果球通过了板子,并且是第一次通过,则得分                                         
69    board[4]=1;                                             //设置通过板子得分的情况为1,表示已经通过了,这样再一次通过将不再得分
70    score+=10;                                              //通过一个板子,加10分
71   }   
72}
6. 最后定义一个控制板子的方法,来控制每个板子的删除,移动,绘制和碰撞。
1function boardHandler() {                     //定义控制板子的方法
2  for (var i = 0; i < boards.length; i++) {   //使用for循环,将数组的里每个板子都进行控制
3    boardRemover(i);                          //调用移动板子的方法,将板子从数组中删除
4    boardMover(i);                            //调用清除板子的方法,使板子可以向下移动
5    boardDrawer(i);                           //调用绘制板子的方法,将板子在画布中显示出来
6    watchBoardCollision(i);                   //调用板子碰撞的方法,来控制球的运动与得分
7  }
8}
7.将生成板子的方法和控制板子的方法,放到游戏界面中。这样游戏开始时,板子就会出现。
1 function gameplayScreen() {    //游戏界面
2   …
3   boardAdder();                //调用增加板子的方法,来增加板子
4   boardHandler();              //调用控制板子的方法,来控制板子
5 } 
8.在游戏重新开始的方法中,增加两行代码,使记录增加板子的时间归零,也使板子的数组清空。
1 function restart() {     //游戏重新开始的方法
2   …
3   lastAddTime = 0;       //重置增加上一个板子的时间
4   boards = [];           //初始化板子的数组,将原来存储的数据清空
5 } 
运行的结果如下:
游戏开始
重新开始

点击阅读原文就可以玩了

全部的代码可以在下面的链接查看到
https://editor.p5js.org/jack3279/sketches/wBLJQSaLC
参考内容:
Ultimate Guide to the Processing Language Part II: Building a Simple Game
OGUZ GELAL,https://www.toptal.com/game/ultimate-guide-to-processing-simple-game
推荐阅读
超详细教程,做一个乒乓球游戏(上)
超详细教程,做一个乒乓球游戏(下)

End

版权声明:文章内容欢迎转发,但请注明出处,并且不得对原始内容做任何修改,请尊重我们的劳动成果。
点击“阅读原文”,就可以开始玩了。

乒乓球游戏相关文章