- UID
- 38
- 麦力
- 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()获取不同轴上的加速度
由于加速器比 |
评分
-
查看全部评分
|