⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button_ins.c.svn-base

📁 A Flash Player with ActionScript support. Write in C and C++. It have two part, one is Player and an
💻 SVN-BASE
字号:
#include "base_types.h"#include "define.h"#include "movie_clips_def.h"#include "swf_file_pub.h"#include "button_ins.h"#include "button_def.h"#include "movie_clips_def.h"#include "instance.h"#include "sound_def.h"#include <glib.h>#include <assert.h>#include <stdlib.h>#include <base_types.h>#include <shape_def.h>#if WITH_DMALLOC#include <dmalloc.h>#endifextern player_t   *player_p;void btn_ins_change(GNode* node_p,struct PlaceObject *cmd_p) {    //   btn_ins_t		*data_p 	= (btn_ins_t*)(node_p->data);    //    struct DefineButton	*def_p 		= (struct DefineButton*)(data_p->define_p);    /*    if (def_p->StateHitTestP) {        data_p->current_state = BtnStateHitTest;        data_p->last_state = BtnStateUp;    }    if (def_p->StateUpP) {        data_p->last_state = BtnStateHitTest;        data_p->current_state = BtnStateUp;    }    */};/* * 更新所指定的节点的子节点. * 根据 button 的 P&R 队列更新第一层子节点. * 如果 last_state != current_state 则认为状态改变 * 需重新生成整颗子数 */void btn_ins_update_children(GNode* node_p) {    GNode 		*p, *new_p;    struct PAndRObjects	*cmd_list_p 	= NULL;    btn_ins_t		*data_p 	= (btn_ins_t*)(node_p->data);    struct DefineButton	*def_p 		= (struct DefineButton*)(data_p->define_p);    swf_file_t		*swf_p		= data_p->swf_p;    gboolean		visible		= TRUE;    if (data_p->last_state == data_p->current_state) {        return;    };    while ((p=g_node_first_child(node_p))!=NULL) {        ins_destory(p);    };    switch (data_p->current_state) {    case BtnStateOverDown:        cmd_list_p = (struct PAndRObjects*)(def_p->StateDownP);        break;    case BtnStateOverUp:        cmd_list_p = (struct PAndRObjects*)(def_p->StateOverP);        break;    case BtnStateOutUp:    case BtnStateOutDown:        cmd_list_p = (struct PAndRObjects*)(def_p->StateUpP);        break;    };    if (data_p->sound_p)        free(data_p->sound_p);    if ((data_p->last_state == BtnStateOverDown) && (data_p->current_state == BtnStateOverUp)) {        if (def_p->ButtonSoundChar3) {            data_p->sound_p = g_new0(struct StartSound,1);            data_p->sound_p->SoundId = def_p->ButtonSoundChar3;            data_p->sound_p->SoundInfoP = def_p->ButtonSoundInfo3;        };    };    if ((data_p->current_state == BtnStateOverDown) && (data_p->last_state == BtnStateOverUp)) {        if (def_p->ButtonSoundChar2) {            data_p->sound_p = g_new0(struct StartSound,1);            data_p->sound_p->SoundId = def_p->ButtonSoundChar2;            data_p->sound_p->SoundInfoP = def_p->ButtonSoundInfo2;        };    };    while (cmd_list_p != NULL) {        switch (cmd_list_p->PlaceAndRemoveType) {        case TPlaceObjectOne:        case TPlaceObjectTwo:            new_p = ins_new(swf_p,(struct PlaceObject*)cmd_list_p);            ((instance_t*)(new_p->data))->visible = visible;            g_node_append(node_p,new_p);            ins_new_after(new_p);            break;        case TRemoveObjectOne:        case TRemoveObjectTwo:            assert(0);            break;        };        cmd_list_p = cmd_list_p->NextP;    };    data_p->last_state = data_p->current_state;};struct ActionRecord* btn_on_event(GNode* node_p) {    btn_ins_t		*data_p 	= (btn_ins_t*)(node_p->data);    struct DefineButton	*def_p 		= (struct DefineButton*)(data_p->define_p);    switch(data_p->last_state) {    case BtnStateIdle:        switch(data_p->current_state) {        case BtnStateOverUp:            return def_p->CondIdleToOverUpP;        case BtnStateOverDown:            return def_p->CondIdleToOverDownP;        default:            return NULL;        };    case BtnStateOverDown:        switch(data_p->current_state) {        case BtnStateOverUp:            return def_p->CondOverDownToOverUpP;        case BtnStateOutDown:            return def_p->CondOverDownToOutDownP;        default:            return NULL;        };    case BtnStateOverUp:        switch(data_p->current_state) {        case BtnStateIdle:            return def_p->CondOverUpToIdleP;        case BtnStateOverDown:            return def_p->CondOverUpToOverDownP;        default:            return NULL;        };    case BtnStateOutDown:        switch(data_p->current_state) {        case BtnStateIdle:            return def_p->CondOutDownToIdleP;        case BtnStateOverDown:            return def_p->CondOutDownToOverDownP;        default:            return NULL;        };    };    return NULL;};void btn_ins_fresh_hit_area(GNode* node_p) {    struct PAndRObjects	*cmd_list_p 	= NULL;    btn_ins_t		*data_p 	= (btn_ins_t*)(node_p->data);    struct DefineButton	*def_p 		= (struct DefineButton*)(data_p->define_p);    if (def_p->StateHitTestP) {        struct PlaceObject	*po_p;        struct DefineShape	*shp_def_p;        int			id;        struct Matrix		ab_matrix;        struct RECT		boundary,hit_area;        // 计算 button 的 点击面积        cmd_list_p = (struct PAndRObjects*)def_p->StateHitTestP;        rect_new(&data_p->hit_area);        while (cmd_list_p != NULL) {            switch (cmd_list_p->PlaceAndRemoveType) {            case TPlaceObjectOne:            case TPlaceObjectTwo:                po_p = (struct PlaceObject*)cmd_list_p;                id = po_p->CharacterID;                shp_def_p = (struct DefineShape*)player_p->_level0_p->dict_p->dict[id];                mat_new(&ab_matrix);                ab_matrix = mat_multi(&data_p->ab_matrix, &po_p->Matrix);                switch (shp_def_p->CharacterType) {                case CharShape:                    boundary = mat_multi_rect(&ab_matrix,&shp_def_p->ShapeBounds);                    break;                case CharText:                    //XXX fixme:need imp                    break;                case CharEditText:                    //XXX fixme:need imp                    break;                default:                    printf("unsupport %d \n",shp_def_p->CharacterType);                    assert(0);                };                hit_area = rect_add(&data_p->hit_area,&boundary);                data_p->hit_area = hit_area;                break;            case TRemoveObjectOne:            case TRemoveObjectTwo:                assert(0);                break;            };            cmd_list_p = cmd_list_p->NextP;        };        cmd_list_p = NULL;    };};//void btn_ins_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -