int BulletCreate(char *id_str, FVector2 *pos, FVector2 *vct, float r, u_int target, sParam *param, int level, float powofs) { char id_param[ID_MAXLEN]; sParam *objParam = ObjGetSetupParam(id_str); ASSERT(objParam); int maxlevel = ParamGetReal(objParam, "maxlevel"); if(level > maxlevel) level = maxlevel; for(int i = 1; ; i += 1) { sprintf(id_param, "%d.shot_pos%d", level, i); if(!ParamIsExists(objParam, id_param)) break; FVector3 *p = ParamGetFVec3(objParam, id_param); FVector2 v; v.x = p->x; v.y = p->y; MathRotateXY(&v, r); AddV2d(&v, &v, pos); StkMakeFrame(); StkPushP(param); // 0 StkPushP(&v); // 1 StkPushP(vct); // 2 StkPushF(NormalAngle(r + ANG2RAD(p->z))); // 3 StkPushF(powofs); // 4 ObjCreate(id_str, OBJ_SHOT, objProc, level, target); StkDelFrame(); } sprintf(id_param, "%d.interval", level); return ParamGetReal(objParam, id_param); }
void SpriteSetup(Sprite *spr, char *name, sParam *param) { char id_str[ID_MAXLEN]; FVector2 *value; sprintf(id_str, "%s.uv", name); value = ParamGetFVec2(param, id_str); ASSERT(value); spr->uv = *value; sprintf(id_str, "%s.size", name); value = ParamGetFVec2(param, id_str); ASSERT(value); spr->size = *value; sprintf(id_str, "%s.pos", name); value = ParamGetFVec2(param, id_str); ASSERT(value); spr->pos = *value; spr->center = FVec2Zero; sprintf(id_str, "%s.center", name); if(ParamIsExists(param, id_str)) { spr->center = *ParamGetFVec2(param, id_str); } spr->scale = FVec2One; spr->col = RGBAWhite; spr->blend = GRP_BLEND_NORMAL; spr->rot = 0.0f; spr->prio = PRIO_COCKPIT; sprintf(id_str, "%s.disp", name); spr->disp = ParamIsExists(param, id_str) ? ParamGetReal(param, id_str) : TRUE; }
static int spriteProc(sTaskBody *body, int msg, int lParam, int rParam) { int res = 0; SpriteVar *var = (SpriteVar *)TaskGetVar(body, sizeof(SpriteVar), MEM_APP); switch(msg) { case MSG_CREATE: { char *name = (char *)StkRefFrameP(0); var->obj = (Sprite *)StkRefFrameP(1); sParam *param = (sParam *)StkRefFrameP(2); int delay = StkRefFrameI(3); char id_str[ID_MAXLEN]; sprintf(id_str, "%s.delay", name); delay += ParamGetReal(param, id_str) * FRAME_RATE; if(delay > 0) TaskSleep(body, delay); sprintf(id_str, "%s.frame", name); var->frame = ParamGetReal(param, id_str) * FRAME_RATE; sprintf(id_str, "%s.slow", name); var->slow = ParamGetReal(param, id_str); sprintf(id_str, "%s.start", name); if(ParamIsExists(param, id_str)) { var->pos_start = *ParamGetFVec2(param, id_str); } else { var->pos_start = var->obj->pos; } sprintf(id_str, "%s.end", name); if(ParamIsExists(param, id_str)) { var->pos_end = *ParamGetFVec2(param, id_str); } else { var->pos_end = var->obj->pos; } var->obj->pos = var->pos_start; sprintf(id_str, "%s.s_sc", name); if(ParamIsExists(param, id_str)) { var->scale_start = *ParamGetFVec2(param, id_str); } else { var->scale_start = var->obj->scale; } sprintf(id_str, "%s.e_sc", name); if(ParamIsExists(param, id_str)) { var->scale_end = *ParamGetFVec2(param, id_str); } else { var->scale_end = var->obj->scale; } var->obj->scale = var->scale_start; } break; case MSG_KILL: { } break; case MSG_STEP: { var->count += 1; float d = (float)var->count / (float)var->frame; if(var->slow) d = d * d; else d = (2.0f - d) * d; var->obj->pos.x = var->pos_start.x + (var->pos_end.x - var->pos_start.x) * d; var->obj->pos.y = var->pos_start.y + (var->pos_end.y - var->pos_start.y) * d; var->obj->scale.x = var->scale_start.x + (var->scale_end.x - var->scale_start.x) * d; var->obj->scale.y = var->scale_start.y + (var->scale_end.y - var->scale_start.y) * d; res = (var->count == var->frame); } break; case MSG_GAME_TITLE_SKIP_EFFECT: { TaskAwake(body); var->count = var->frame - 1; } break; } return res; }