| 
 
UID38麦力67 注册时间2015-8-20最后登录2016-10-24 
 
 
精华0阅读权限100在线时间18 小时 
 | 
 
| 本帖最后由 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
 
 复制代码g_plane_layer_id = app_window_add_layer(pwindow, layer);
我们只需要创建新的layer,然后通过app_window_get_layer_by_id()拿到旧的layer,在replace即可。
 
 复制代码//Move the plane to new position
    P_Layer old_layer = app_window_get_layer_by_id(pwindow, g_plane_layer_id);
    P_Layer layer = planeCreateLayer(PLANEX, PLANEY);
    if (layer != NULL) {
        app_window_replace_layer(pwindow, old_layer, layer);
    }
 2. 获取随机数
 
 麦步OS中很多c标准库函数都不可用。
 所以自己实现了一个简单的伪随机数,虽然分布不是那么均匀,不过对于游戏来说也够用了。
 
 
 复制代码uint8_t math_random(uint8_t seed)
{
    uint8_t num;
    struct date_time t;
    app_service_get_datetime(&t);
    num = (uint8_t)((t.wday * t.hour * t.sec + t.min + seed * t.sec) & 0xff);
    return num;
}
 
 3. 计算子弹不同方向上的速度
 
 使用其他方法近似计算得到了一个值,虽然不准确,但是对于游戏来说应该也足够了
 
 复制代码<blockquote>int16_t bullet_vx(int8_t x1, int8_t y1, int8_t x2, int8_t y2)
 4. 碰撞计算
 
 这里将飞机与子弹都简化为一个圆,所以只要计算两者圆心的距离,判断是否小于两圆半径之积即可
 
 复制代码uint16_t math_distance(int8_t x1, int8_t y1, int8_t x2, int8_t y2)
{
    int16_t h = x1 - x2;
    int16_t v = y1 - y2;
    return(h*h + v*v);
}
 5. 同屏子弹数较少
 
 由于每个window最多的layer只能支持20个,而每颗子弹都使用了一个bitmap layer来显示,所以同屏的显示的子弹应该会比较少,从而游戏难度也大大降低。
 
 
 6. 游戏控制
 游戏控制使用加速器控制飞机飞行
 使用maibu_get_accel_data()获取不同轴上的加速度
 由于加速器比
 | 
 评分
查看全部评分
 |