麦步社区-论坛

标题: 小游戏特训开发中遇到的问题 [打印本页]

作者: jason    时间: 2015-11-12 14:52
标题: 小游戏特训开发中遇到的问题
本帖最后由 jason 于 2015-11-23 15:55 编辑

目前在做一个小游戏——特训,国内也被叫做是男人就坚持20秒
游戏使用bitmap layer来来显示图片。

1. 创建之后的bitmap layer位置可以改变吗?

在文档上看到这个API maibu_layer_get_bitmap_frame()可以获取bitmap layer的GRect
不清楚是否有与这个API配合使用的API?


解决方案:
mark大大回应可以使用app_window_replace_layer()

在第一次将layer加入window的时候,会返回一个layerid
  1. g_plane_layer_id = app_window_add_layer(pwindow, layer);
复制代码

我们只需要创建新的layer,然后通过app_window_get_layer_by_id()拿到旧的layer,在replace即可。
  1. //Move the plane to new position
  2.     P_Layer old_layer = app_window_get_layer_by_id(pwindow, g_plane_layer_id);

  3.     P_Layer layer = planeCreateLayer(PLANEX, PLANEY);
  4.     if (layer != NULL) {
  5.         app_window_replace_layer(pwindow, old_layer, layer);
  6.     }
复制代码


2. 获取随机数

麦步OS中很多c标准库函数都不可用。
所以自己实现了一个简单的伪随机数,虽然分布不是那么均匀,不过对于游戏来说也够用了。

  1. uint8_t math_random(uint8_t seed)
  2. {
  3.     uint8_t num;
  4.     struct date_time t;

  5.     app_service_get_datetime(&t);

  6.     num = (uint8_t)((t.wday * t.hour * t.sec + t.min + seed * t.sec) & 0xff);

  7.     return num;
  8. }
复制代码



3. 计算子弹不同方向上的速度

使用其他方法近似计算得到了一个值,虽然不准确,但是对于游戏来说应该也足够了
  1. <blockquote>int16_t bullet_vx(int8_t x1, int8_t y1, int8_t x2, int8_t y2)
复制代码


4. 碰撞计算

这里将飞机与子弹都简化为一个圆,所以只要计算两者圆心的距离,判断是否小于两圆半径之积即可
  1. uint16_t math_distance(int8_t x1, int8_t y1, int8_t x2, int8_t y2)
  2. {
  3.     int16_t h = x1 - x2;
  4.     int16_t v = y1 - y2;
  5.     return(h*h + v*v);
  6. }
复制代码


5. 同屏子弹数较少

由于每个window最多的layer只能支持20个,而每颗子弹都使用了一个bitmap layer来显示,所以同屏的显示的子弹应该会比较少,从而游戏难度也大大降低。


6. 游戏控制
游戏控制使用加速器控制飞机飞行
使用maibu_get_accel_data()获取不同轴上的加速度
由于加速器比
作者: mark    时间: 2015-11-12 15:26
暂时不能修改指定图层的位置,但是如果你修改图层位置,可以重新创建一个内容一样的图层,但是框架位置和之前不同就可以了,然后使用replace接口替换就行了。
作者: jason    时间: 2015-11-12 15:44
mark 发表于 2015-11-12 15:26
暂时不能修改指定图层的位置,但是如果你修改图层位置,可以重新创建一个内容一样的图层,但是框架位置和之 ...

明白了,感谢mark大大!
作者: mark    时间: 2015-11-18 10:29
不客气,暂时能使用的三角函数只有sin和cos。




欢迎光临 麦步社区-论坛 (http://203.195.186.190/) Powered by Discuz! X3.2