📄 button_ins.c.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 + -