p5.js-俄罗斯方块小游戏系列教程之游戏界面设计

目录

一、标题区

二、玩法区

三、得分区

四、预览区

五、游戏画面区


上一篇教程,我们学习了如何使用P5JS绘制方块,如果大家有认真完成作业,那P5JS的基本用法,你应该已经掌握了,请注意,本系列课程具有连续性特点,应尽可能掌握前一节课程内容后,再学习本章节。

上图为俄罗斯方块游戏的界面布局图,我们将通过学习P5JS的text()函数以及和文字格式相关的函数来完善游戏界面。

一、标题区

  1. function setup() {
  2. createCanvas(550, 550);
  3. }
  4. function draw() {
  5. background(49);
  6. // 标题区文本,以居中方式显示
  7. // 第一个参数为水平对齐,可选参数:LEFT / CENTER / RIGHT
  8. // 第二个参数为垂直对齐,可选参数:TOP / BOTTOM / CENTER / BASELINE
  9. textAlign(CENTER, CENTER);
  10. // 无描边
  11. noStroke();
  12. // 指定字体大小
  13. textSize(24);
  14. // 指定字体颜色
  15. fill(200);
  16. // 文本及定位信息
  17. text("消失的方块", 460, 50);
  18. textSize(12);
  19. fill(96);
  20. text("P5学院", 460, 50 + 32);
  21. }
  22. new p5();

二、玩法区

  1. function setup() {
  2. createCanvas(550, 550);
  3. }
  4. function draw() {
  5. background(49);
  6. //将静态信息定义成函数,尽可能让draw()函数结构清晰。
  7. // 绘制标题区
  8. this.drawTitle();
  9. // 绘制玩法区
  10. this.drawDesc();
  11. }
  12. function drawTitle() {
  13. // 标题区文本,以居中方式显示
  14. // 第一个参数为水平对齐,可选参数:LEFT / CENTER / RIGHT
  15. // 第二个参数为垂直对齐,可选参数:TOP / BOTTOM / CENTER / BASELINE
  16. textAlign(CENTER, CENTER);
  17. // 无描边
  18. noStroke();
  19. // 指定字体大小
  20. textSize(24);
  21. // 指定字体颜色
  22. fill(200);
  23. // 文本及定位信息
  24. text("消失的方块", 460, 50);
  25. textSize(12);
  26. fill(96);
  27. text("P5学院", 460, 50 + 32);
  28. }
  29. function drawDesc() {
  30. // 对齐方式:左对齐
  31. textAlign(LEFT);
  32. noStroke();
  33. textSize(12);
  34. fill(96);
  35. text("w / W" ,420, 400); text("- 旋转" , 465, 400);
  36. text("a / A" ,420, 430); text("- 左移" , 465, 430);
  37. text("d / D" ,420, 460); text("- 右移", 465, 460);
  38. text("s / S" ,420, 490); text("- 下降" , 465, 490);
  39. }
  40. new p5();

三、得分区

  1. function setup() {
  2. createCanvas(550, 550);
  3. }
  4. function draw() {
  5. background(49);
  6. //将静态信息定义成函数,尽可能让draw()函数结构清晰。
  7. // 绘制标题区
  8. this.drawTitle();
  9. // 绘制玩法区
  10. this.drawDesc();
  11. // 绘制得分区
  12. this.drawScore(1, 0, 0);
  13. }
  14. function drawTitle() {
  15. // 标题区文本,以居中方式显示
  16. // 第一个参数为水平对齐,可选参数:LEFT / CENTER / RIGHT
  17. // 第二个参数为垂直对齐,可选参数:TOP / BOTTOM / CENTER / BASELINE
  18. textAlign(CENTER, CENTER);
  19. // 无描边
  20. noStroke();
  21. // 指定字体大小
  22. textSize(24);
  23. // 指定字体颜色
  24. fill(200);
  25. // 文本及定位信息
  26. text("消失的方块", 460, 50);
  27. textSize(12);
  28. fill(96);
  29. text("P5学院", 460, 50 + 32);
  30. }
  31. function drawDesc() {
  32. // 对齐方式:左对齐
  33. textAlign(LEFT);
  34. noStroke();
  35. textSize(12);
  36. fill(96);
  37. text("w / W" ,420, 400); text("- 旋转" , 465, 400);
  38. text("a / A" ,420, 430); text("- 左移" , 465, 430);
  39. text("d / D" ,420, 460); text("- 右移", 465, 460);
  40. text("s / S" ,420, 490); text("- 下降" , 465, 490);
  41. }
  42. function drawScore(level, lines, scores) {
  43. textAlign(CENTER, CENTER);
  44. noStroke();
  45. textSize(18);
  46. fill(200);
  47. text( "LEVEL "+level, 460, 140);
  48. textSize(12);
  49. fill(96);
  50. text("LINES "+lines+"/10", 460, 140 + 32);
  51. text("SCORES "+scores, 460, 140 + 32 + 18);
  52. }
  53. new p5();

四、预览区

  1. // cubeList用于描述所有方块类型,数组元素描述单个方块
  2. var cubeList = [
  3. [
  4. 0,0,0,0,
  5. 0,1,0,0,
  6. 0,1,1,1,
  7. 0,0,0,0
  8. ]
  9. ];
  10. // pallette用于描述方块中每一个数字代表的颜色
  11. var pallette = [
  12. [255, 255, 255], // 0 代表空
  13. [153, 0, 77], // 1
  14. ];
  15. function setup() {
  16. createCanvas(550, 550);
  17. }
  18. function draw() {
  19. background(49);
  20. //将静态信息定义成函数,尽可能让draw()函数结构清晰。
  21. // 绘制标题区
  22. this.drawTitle();
  23. // 绘制玩法区
  24. this.drawDesc();
  25. // 绘制得分区
  26. this.drawScore(1, 0, 0);
  27. // 绘制预览区(下一个生成的方块) - 由于当前还没有设计算法,所以我们先给一个指定的形状
  28. this.drawPreview(cubeList[0]);
  29. }
  30. function drawTitle() {
  31. // 标题区文本,以居中方式显示
  32. // 第一个参数为水平对齐,可选参数:LEFT / CENTER / RIGHT
  33. // 第二个参数为垂直对齐,可选参数:TOP / BOTTOM / CENTER / BASELINE
  34. textAlign(CENTER, CENTER);
  35. // 无描边
  36. noStroke();
  37. // 指定字体大小
  38. textSize(24);
  39. // 指定字体颜色
  40. fill(200);
  41. // 文本及定位信息
  42. text("消失的方块", 460, 50);
  43. textSize(12);
  44. fill(96);
  45. text("P5学院", 460, 50 + 32);
  46. }
  47. function drawDesc() {
  48. // 对齐方式:左对齐
  49. textAlign(LEFT);
  50. noStroke();
  51. textSize(12);
  52. fill(96);
  53. text("w / W" ,420, 400); text("- 旋转" , 465, 400);
  54. text("a / A" ,420, 430); text("- 左移" , 465, 430);
  55. text("d / D" ,420, 460); text("- 右移", 465, 460);
  56. text("s / S" ,420, 490); text("- 下降" , 465, 490);
  57. }
  58. function drawScore(level, lines, scores) {
  59. textAlign(CENTER, CENTER);
  60. noStroke();
  61. textSize(18);
  62. fill(200);
  63. text( "LEVEL "+level, 460, 140);
  64. textSize(12);
  65. fill(96);
  66. text("LINES "+lines+"/10", 460, 140 + 32);
  67. text("SCORES "+scores, 460, 140 + 32 + 18);
  68. }
  69. function drawPreview(shape) {
  70. // 这部分如果看不懂的话,可以去前一个教程学习
  71. drawGrid(4, 4, 18);
  72. drawCube(shape, 18);
  73. }
  74. // row:行数,col:列数,size:网格大小
  75. function drawGrid(row, col, size) {
  76. stroke(145);
  77. fill(49);
  78. for(var i = 0;i < row;i++) {
  79. for(var j = 0;j < col;j++) {
  80. rect((j*size+425), (i*size+250), size, size);
  81. }
  82. }
  83. }
  84. // shape:方块描述
  85. function drawCube(shape, size) {
  86. stroke(145);
  87. for(var i = 0;i < 4;i++) {
  88. for(var j = 0;j < 4;j++) {
  89. // 方块填充的颜色,需要由pallette确定,但是方块描述采用的是一维数组表示,因此需要通过算法,将二维数组中的位置,用算法转为一维数组中的位置。
  90. var cubeIndex = shape[j+i*4];
  91. if(cubeIndex != 0) {
  92. var rgb = pallette[cubeIndex];
  93. fill(rgb[0], rgb[1], rgb[2]);
  94. rect((j*size+425), (i*size+250), size, size);
  95. }
  96. }
  97. }
  98. }
  99. new p5();

五、游戏画面区

  1. // cubeList用于描述所有方块类型,数组元素描述单个方块
  2. var cubeList = [
  3. [
  4. 0,0,0,0,
  5. 0,1,0,0,
  6. 0,1,1,1,
  7. 0,0,0,0
  8. ]
  9. ];
  10. // pallette用于描述方块中每一个数字代表的颜色
  11. var pallette = [
  12. [255, 255, 255], // 0 代表空
  13. [153, 0, 77], // 1
  14. ];
  15. function setup() {
  16. createCanvas(550, 550);
  17. }
  18. function draw() {
  19. background(49);
  20. //将静态信息定义成函数,尽可能让draw()函数结构清晰。
  21. // 绘制标题区
  22. this.drawTitle();
  23. // 绘制玩法区
  24. this.drawDesc();
  25. // 绘制得分区
  26. this.drawScore(1, 0, 0);
  27. // 绘制预览区(下一个生成的方块) - 由于当前还没有设计算法,所以我们先给一个指定的形状
  28. this.drawPreview(cubeList[0]);
  29. // 绘制游戏画面区 - 由于当前还没有设计方块在画面中的更新与现实函数,所以我们先画背景图
  30. this.drawGame();
  31. }
  32. function drawGame() {
  33. stroke(100);
  34. fill(60);
  35. for(var i = 0;i < 36;i++) {
  36. for(var j = 0;j < 16;j++) {
  37. rect((j*14+100), (i*14+20), 14, 14);
  38. }
  39. }
  40. }
  41. function drawTitle() {
  42. // 标题区文本,以居中方式显示
  43. // 第一个参数为水平对齐,可选参数:LEFT / CENTER / RIGHT
  44. // 第二个参数为垂直对齐,可选参数:TOP / BOTTOM / CENTER / BASELINE
  45. textAlign(CENTER, CENTER);
  46. // 无描边
  47. noStroke();
  48. // 指定字体大小
  49. textSize(24);
  50. // 指定字体颜色
  51. fill(200);
  52. // 文本及定位信息
  53. text("消失的方块", 460, 50);
  54. textSize(12);
  55. fill(96);
  56. text("P5学院", 460, 50 + 32);
  57. }
  58. function drawDesc() {
  59. // 对齐方式:左对齐
  60. textAlign(LEFT);
  61. noStroke();
  62. textSize(12);
  63. fill(96);
  64. text("w / W" ,420, 400); text("- 旋转" , 465, 400);
  65. text("a / A" ,420, 430); text("- 左移" , 465, 430);
  66. text("d / D" ,420, 460); text("- 右移", 465, 460);
  67. text("s / S" ,420, 490); text("- 下降" , 465, 490);
  68. }
  69. function drawScore(level, lines, scores) {
  70. textAlign(CENTER, CENTER);
  71. noStroke();
  72. textSize(18);
  73. fill(200);
  74. text( "LEVEL "+level, 460, 140);
  75. textSize(12);
  76. fill(96);
  77. text("LINES "+lines+"/10", 460, 140 + 32);
  78. text("SCORES "+scores, 460, 140 + 32 + 18);
  79. }
  80. function drawPreview(shape) {
  81. // 这部分如果看不懂的话,可以去前一个教程学习
  82. drawGrid(4, 4, 18);
  83. drawCube(shape, 18);
  84. }
  85. // row:行数,col:列数,size:网格大小
  86. function drawGrid(row, col, size) {
  87. stroke(145);
  88. fill(49);
  89. for(var i = 0;i < row;i++) {
  90. for(var j = 0;j < col;j++) {
  91. rect((j*size+425), (i*size+250), size, size);
  92. }
  93. }
  94. }
  95. // shape:方块描述
  96. function drawCube(shape, size) {
  97. stroke(145);
  98. for(var i = 0;i < 4;i++) {
  99. for(var j = 0;j < 4;j++) {
  100. // 方块填充的颜色,需要由pallette确定,但是方块描述采用的是一维数组表示,因此需要通过算法,将二维数组中的位置,用算法转为一维数组中的位置。
  101. var cubeIndex = shape[j+i*4];
  102. if(cubeIndex != 0) {
  103. var rgb = pallette[cubeIndex];
  104. fill(rgb[0], rgb[1], rgb[2]);
  105. rect((j*size+425), (i*size+250), size, size);
  106. }
  107. }
  108. }
  109. }
  110. new p5();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

one行feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值