p5.js-俄罗斯方块小游戏系列教程之核心元素-方块

01 如何描述方块?

在俄罗斯方块游戏的经典模式中,方块的基础类型共有7种,如下图所示。

通过对上图中俄罗斯方块的形状分析,我们可以发现,无论是何种类型的方块,都是在一个4x4大小的网格内进行设计的,每一个格子的状态又可以分为空白与填充两种状态。通过填充相应的格子,就可以绘制出方块的形状。

我们可以使用一维数组的概念来描述这个方块,例:

此时方块可以用[0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0]表示。

由于在设计的过程中还需要用不同的颜色来表示方块的类型,因此我们可以将上述方块描述中的非0数字,代表颜色类型,例如:1为红色,2为黄色,3为绿色,4为青色等等,数字对应哪种颜色不重要,只是用于区分类型。

02 如何在P5JS中绘制出方块

(1)首先根据Hello World教程,编写P5JS基础函数;

Hello World

(2)确定描述方块的方式;

  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. ];

若使用Aleshu DrawIO设计方块,可以通过调色盘获取颜色的RGB值。

(3)如何在P5JS中绘制方块;

  1. function setup(){
  2. createCanvas(500, 500);
  3. }
  4. function draw() {
  5. background(70);
  6. // 设置绘图工具的填充色
  7. fill(200);
  8. // 在(40, 40)这个坐标上绘制一个长为40,宽为40的正方形
  9. rect(40, 40, 40, 40);
  10. }
  11. new p5();

(4)如何在P5JS中绘制网格;

  1. function setup(){
  2. createCanvas(500, 500);
  3. }
  4. function draw() {
  5. background(70);
  6. fill(200);
  7. rect(40, 40, 40, 40);
  8. rect(80, 40, 40, 40);
  9. rect(120, 40, 40, 40);
  10. rect(160, 40, 40, 40);
  11. rect(40, 80, 40, 40);
  12. rect(80, 80, 40, 40);
  13. rect(120, 80, 40, 40);
  14. rect(160, 80, 40, 40);
  15. rect(40, 120, 40, 40);
  16. rect(80, 120, 40, 40);
  17. rect(120, 120, 40, 40);
  18. rect(160, 120, 40, 40);
  19. rect(40, 160, 40, 40);
  20. rect(80, 160, 40, 40);
  21. rect(120, 160, 40, 40);
  22. rect(160, 160, 40, 40);
  23. }
  24. new p5();

上面这段就是传说中的屎山代码,虽然确实能够实现效果,但是毫无算法可言,如果希望能够提升编程思维,就一定要学习算法来进行表达。

迭代01:

 
 
  1. function setup(){
  2. createCanvas(500, 500);
  3. }
  4. function draw() {
  5. background(70);
  6. fill(200);
  7. // 使用嵌套循环可以描述二维数组(即网格)
  8. for(var i = 0;i < 4;i++) {
  9. for(var j = 0;j < 4;j++) {
  10. rect((j*40+40), (i*40+40), 40, 40);
  11. }
  12. }
  13. }
  14. new p5();

迭代02:

  1. function setup(){
  2. createCanvas(500, 500);
  3. }
  4. function draw() {
  5. background(70);
  6. // 学会将一段完整的算法定义为函数,并提取关键参数,以控制函数最终的实现效果
  7. this.drawGrid(8, 8, 40);
  8. }
  9. // row:行数,col:列数,size:网格大小
  10. function drawGrid(row, col, size) {
  11. fill(200);
  12. for(var i = 0;i < row;i++) {
  13. for(var j = 0;j < col;j++) {
  14. rect((j*size+size), (i*size+size), size, size);
  15. }
  16. }
  17. }
  18. new p5();

尝试修改函数实参,可以看到要更改网格效果,就容易很多了,而无需考虑每一个格子的起点在哪个坐标上。

  1. function setup(){
  2. createCanvas(500, 500);
  3. }
  4. function draw() {
  5. background(70);
  6. // 学会将一段完整的算法定义为函数,并提取关键参数,以控制函数最终的实现效果
  7. this.drawGrid(4, 8, 30);
  8. }
  9. // row:行数,col:列数,size:网格大小
  10. function drawGrid(row, col, size) {
  11. fill(200);
  12. for(var i = 0;i < row;i++) {
  13. for(var j = 0;j < col;j++) {
  14. rect((j*size+size), (i*size+size), size, size);
  15. }
  16. }
  17. }
  18. new p5();

(5)解析方块描述。

  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(500, 500);
  17. }
  18. function draw() {
  19. background(70);
  20. // 学会将一段完整的算法定义为函数,并提取关键参数,以控制函数最终的实现效果
  21. this.drawGrid(4, 4, 40);
  22. this.drawCube(cubeList[0], 40);
  23. }
  24. // row:行数,col:列数,size:网格大小
  25. function drawGrid(row, col, size) {
  26. fill(200);
  27. for(var i = 0;i < row;i++) {
  28. for(var j = 0;j < col;j++) {
  29. rect((j*size+size), (i*size+size), size, size);
  30. }
  31. }
  32. }
  33. // shape:方块描述
  34. function drawCube(shape, size) {
  35. for(var i = 0;i < 4;i++) {
  36. for(var j = 0;j < 4;j++) {
  37. // 方块填充的颜色,需要由pallette确定,但是方块描述采用的是一维数组表示,因此需要通过算法,将二维数组中的位置,用算法转为一维数组中的位置。
  38. var cubeIndex = shape[j+i*4];
  39. if(cubeIndex != 0) {
  40. var rgb = pallette[cubeIndex];
  41. fill(rgb[0], rgb[1], rgb[2]);
  42. rect((j*size+size), (i*size+size), size, size);
  43. }
  44. }
  45. }
  46. }
  47. new p5();

方块描述就学习到这里,给大家留一个作业,定义第二个方块类型,并尝试使用P5JS绘制出来

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

one行feng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值