麦步社区-论坛
标题:
小游戏特训开发中遇到的问题
[打印本页]
作者:
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
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()获取不同轴上的加速度
由于加速器比
作者:
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