continue只结束本次循环对吗 c语言for循环语句用法( 二 )


continue只结束本次循环对吗 c语言for循环语句用法

文章插图
为了便于理解 , 我们先看一下最终效果图 。需要注意的是 , 网格线与数字标号是后期加上去的 。
continue只结束本次循环对吗 c语言for循环语句用法

文章插图
地图水平方向我们使用10张贴图进行重复 , 宽度为:64×10=640(像素) 垂直方向没有完整标出 , 它是使用8张贴图完成 , 高度为:64×8=512(像素)
据此 , 我们创建的窗口大小为640×512 。窗口的大小也就是地图的大小 , 这两个值现在被保存在width/height变量中 。
int width = 640; // 窗口宽度int height = 512; // 窗口高度首先 , 我们计算地图可容纳Tile的行列数 。
int cols = width / 64; // 地图宽度可容纳的列数int rows = height / 64; // 地图高度可容纳的行数在当前地图范围下 , cols=10 , rows=8 , 这表明地图被分割为80个Tile , 也暗示我们需要将ground.png贴花80次 , 才能铺满整个地面 。按照本节的理念 , 重复的事情用循环 , 这里我们选择for语句 。
for ( int i = 0; i < cols * rows; i++ )接下来看绘图部分 , glmxDrawImage函数需要一个确切的x/y坐标 , 因此我们需要根据当前被绘制Tile索引计算出正确的坐标来 。由于已经知道了地图宽度可容器的列数cols , 计算当前Tile索引对应的行列值就很简单了 。
int row = i / cols; // 当前tile所在的行int col = i % cols; // 当前tile所在的列每一行可以放置cols个Tile , 因此i/cols就得到了当前Tile所在的行索引 。i%cols则可以计算出了正确的列索引 , 有了这两个数据后 , 根据图片大小 , 就可以计算出当前Tile的坐标了 。
int x = col * 64;int y = row * 64;至此 , 整个地面绘制流程如下 。
continue只结束本次循环对吗 c语言for循环语句用法

文章插图
更新飞机单独一个地面也显得有些过于无趣 , 在上一个例子中 , 我们已经加入了可飞行的飞机 , 只是它的方向有那么点不正确 , 这次我们一并修正一下 。首先我们加入一个bool变量 , 表明飞机是否需要“调头” 。
bool flip = false; // 飞机是否需要转向我们的飞机默认行为是从屏幕右边飞向左边 , 这与图示中的方向一致 , 因此这个变量初始化为false , 表明不需要转向 。接下来 , 我们更新边界判断语句 , 当飞机到达左边时 , 让其转向 。
continue只结束本次循环对吗 c语言for循环语句用法

文章插图
不要以为这样就完事了 , 这里只是设置了转向变量而已 。观察图像可以看到 , 真正的转向只需要把飞机水平反转一下就有“调头”的效果了 , 这是使用glmxDrawImageEx()函数实现的 。
glmxDrawImageEx( pic2, xpos, 80, 38, 34, GLMX_FLIP_HORIZONTAL);前三个参数与glmxDrawImage()函数一致 , 38,34是指飞机图像的宽度与宽度 , 最后一个是绘制标志值 , 它是一个枚举类型 , 暂时可以认同这个类型与int一致 , 只是预定义了一组值供你使用罢了 。这里的传递的是GLMXFLIPHORIZONTAL , 如其名:水平翻转 。
为了让我们有更好的理解 , 在源代码中 , 飞机正常飞行时 , 我们仍旧使glmxDrawImage函数 , 如果你理解了程序 , 可以统一使用glmxDrawImageEx函数改写 , 以消除这种使用不一致性 , 让程序代码更漂亮 。
最后 , 看看飞机飞行的效果图 。
continue只结束本次循环对吗 c语言for循环语句用法

文章插图