📄 movieclip_class.c
字号:
case PROPERTY_TARGET:
case PROPERTY_DROPTARGET:
case PROPERTY_URL:
case PROPERTY_XMOUSE:
case PROPERTY_YMOUSE:
case PROPERTY_FOCUSRECT:
/* read-only */
dd_warn("Setting a read-only property: %i", num);
break;
default:
dd_warn("Unknown getProperty type: %i", num);
break;
}
}
ddActionMovieClip*
dd_newActionMovieClip(ddPlayer* player, ddDrawClip* clip)
{
ddActionMovieClip* actionclip = dd_malloc(sizeof(ddActionMovieClip));
ddActionObject_init((ddActionObject*)actionclip);
ddActionObject_setClass((ddActionObject*)actionclip, ddActionMovieClipClass);
if ( clip == NULL )
dd_warn("dd_newActionMovieClip: clip == NULL");
actionclip->movieClip = clip;
actionclip->name = NULL;
if ( player->playclip != NULL )
actionclip->rootClip = player->playclip->actionClip;
else
actionclip->rootClip = actionclip;
/* XXX - ifdef DEBUG here? */
if ( ddActionMovieClipClass == NULL )
dd_error("dd_newActionMovieClip called before dd_initMovieClipObject!");
return actionclip;
}
void
ddActionMovieClip_releaseMovieClip(ddActionMovieClip* clip)
{
clip->movieClip = NULL;
}
ddDrawClip*
ddActionMovieClip_getDrawClip(ddActionMovieClip* clip)
{
return clip->movieClip;
}
ddActionMovieClip*
ddActionMovieClip_duplicate(ddPlayer* player, ddActionMovieClip* clip)
{
ddDrawClip* newclip;
if ( clip->movieClip == NULL )
return NULL;
newclip = ddDrawClip_duplicate(player, clip->movieClip);
return newclip->actionClip;
}
void
ddActionMovieClip_setName(ddActionMovieClip* clip, char* name)
{
clip->name = name;
}
char*
ddActionMovieClip_getName(ddActionMovieClip* clip)
{
return clip->name;
}
void
ddActionMovieClip_addChild(ddActionMovieClip* parent, ddActionMovieClip* child)
{
child->rootClip = parent->rootClip;
dd_log("%8p (\"%s\") adding child %8p (\"%s\")", parent, parent->name, child, child->name);
ddActionHash_addValue(((ddActionObject*)parent)->properties, strdup(child->name),
dd_newActionValue_object((ddActionObject*)child));
}
void
ddActionMovieClip_removeChild(ddActionMovieClip* parent, ddActionMovieClip* child)
{
ddActionHash_removeValue(((ddActionObject*)parent)->properties, child->name);
}
void
ddActionMovieClip_addTextField(ddActionMovieClip* clip, ddDrawTextField* field)
{
ddActionValue val;
val.type = VALUE_TEXTFIELD;
val.data.textFieldValue = field;
ddActionHash_addValue(((ddActionObject*)clip)->properties,
strdup(field->textfield->varname), val);
if ( clip->movieClip != NULL )
ddDrawTextField_setParentClip(field, clip->movieClip);
}
void
ddActionMovieClip_removeTextField(ddActionMovieClip* clip, ddDrawTextField* field)
{
ddActionHash_removeValue(((ddActionObject*)clip)->properties,
field->textfield->varname);
}
void
ddActionMovieClip_gotoFrameLabel(ddActionContext* context,
ddActionMovieClip* clip, char* label, boolean play)
{
char* p = strchr(label, ':');
if ( p != NULL )
{
ddActionObject* object = context->object;
ddActionValue val;
*p = '\0';
context->object = (ddActionObject*)clip;
val = getSlashPath(context, label);
clip = (ddActionMovieClip*)ddActionValue_getObjectValue(val); // XXX
ddActionValue_release(val);
context->object = object;
if ( clip == NULL )
return; // XXX
label = p + 1;
}
if ( clip->movieClip == NULL )
return;
ddDrawClip_gotoFrameLabel(context->player, clip->movieClip, label);
if ( play )
ddDrawClip_play(context->player, clip->movieClip);
else
ddDrawClip_stop(context->player, clip->movieClip);
}
ddActionValue
ddActionMovieClip_gotoAndPlay(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
ddActionValue val = ddActionStack_pop(&context->stack);
int frame = ddActionValue_getIntValue(val);
ddActionValue_release(val);
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip != NULL )
{
ddDrawClip_gotoFrame(context->player, clip->movieClip, frame - 1);
ddDrawClip_play(context->player, clip->movieClip);
}
return ddNullValue;
}
ddActionValue
ddActionMovieClip_gotoAndStop(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
ddActionValue val = ddActionStack_pop(&context->stack);
int frame = ddActionValue_getIntValue(val);
ddActionValue_release(val);
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip != NULL )
{
ddDrawClip_gotoFrame(context->player, clip->movieClip, frame - 1);
ddDrawClip_stop(context->player, clip->movieClip);
}
return ddNullValue;
}
ddActionValue
ddActionMovieClip_nextFrame(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip != NULL )
ddDrawClip_nextFrame(context->player, clip->movieClip);
return ddNullValue;
}
ddActionValue
ddActionMovieClip_prevFrame(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip != NULL )
ddDrawClip_prevFrame(context->player, clip->movieClip);
return ddNullValue;
}
ddActionValue
ddActionMovieClip_play(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip != NULL )
ddDrawClip_play(context->player, clip->movieClip);
return ddNullValue;
}
ddActionValue
ddActionMovieClip_stop(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip != NULL )
ddDrawClip_stop(context->player, clip->movieClip);
return ddNullValue;
}
static ddActionValue
ddActionMovieClip_getBounds(ddActionObject* object, ddActionContext* context, int nargs)
{
// XXX - one arg: parent coordinate space (clip)
ddActionMovieClip* clip = (ddActionMovieClip*)object;
ddActionObject* bounds;
ddRect rect;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip == NULL )
return ddNullValue;
rect = clip->movieClip->parent.bounds;
if ( !RECT_VALID(rect) )
return ddNullValue;
bounds = dd_newActionObject();
ddActionHash_addValue(bounds->properties, strdup("xMin"),
dd_newActionValue_double(DOUBLE_F(rect.left)));
ddActionHash_addValue(bounds->properties, strdup("xMax"),
dd_newActionValue_double(DOUBLE_F(rect.right)));
ddActionHash_addValue(bounds->properties, strdup("yMin"),
dd_newActionValue_double(DOUBLE_F(rect.top)));
ddActionHash_addValue(bounds->properties, strdup("yMax"),
dd_newActionValue_double(DOUBLE_F(rect.bottom)));
return dd_newActionValue_object(bounds);
}
static ddActionValue
ddActionMovieClip_getBytesLoaded(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip == NULL )
return ddNullValue;
return dd_newActionValue_int(ddDrawClip_getBytesLoaded(clip->movieClip));
}
static ddActionValue
ddActionMovieClip_getBytesTotal(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( !ddActionObject_isKindOfClass(object, ddActionMovieClipClass) )
return ddUndefValue;
if ( clip->movieClip == NULL )
return ddNullValue;
return dd_newActionValue_int(ddDrawClip_getBytesTotal(clip->movieClip));
}
static ddActionValue
ddActionMovieClip_attachMovie(ddActionObject* object, ddActionContext* context, int nargs)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
ddActionValue idval;
ddActionValue nameval;
ddActionValue depthval;
ddActionValue initval = ddNullValue;
ddCharacter* c;
ddDrawable* d;
ddActionFunction* ctor;
if ( nargs < 3 )
{
while ( nargs-- > 0 )
ddActionValue_release(ddActionStack_pop(&context->stack));
return ddNullValue;
}
idval = ddActionStack_pop(&context->stack);
nameval = ddActionStack_pop(&context->stack);
depthval = ddActionStack_pop(&context->stack);
if ( nargs > 3 )
initval = ddActionStack_pop(&context->stack);
while ( nargs-- > 4 )
ddActionValue_release(ddActionStack_pop(&context->stack));
if ( clip->movieClip != NULL &&
ddMovieClip_findLibrarySymbol(clip->rootClip->movieClip->clip,
ddActionValue_getStringValue(context, idval), &c, &ctor) )
{
d = ddDrawClip_addDisplayItem(context->player, clip->movieClip, c,
ddActionValue_getIntValue(depthval),
ddActionValue_getStringValue(context, nameval), -1);
if ( ctor != NULL )
{
ddActionMovieClip* newclip = ((ddDrawClip*)d)->actionClip;
ddActionObject* clipobj = (ddActionObject*)newclip;
ddActionObject* initobject = ddActionValue_getObjectValue(initval);
ddActionContext* tmpcontext;
ddActionValue val;
ddActionObject_setPrototype(clipobj, ctor->prototype);
if ( initobject != NULL )
ddActionObject_copyProperties(clipobj, initobject);
// invoke ctor on newclip w/ no args
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -