您的位置:首页 > 其它

一个扫雷程序

2012-10-24 10:58 399 查看
#ifndef _GAME_MINE
#define _GAME_MINE
#include "etk_type.h"
#include "etk_rect.h"
#include "etk_display_sdl.h"
#include "etk_platform.h"
#include "etk_window.h"
#include "etk.h"
#include "etk_wnd_manager.h"
#include "etk_util.h"
#include "etk_stack.h"
#include "etk_button.h"
#include "etk_image_jpeg_decoder.h"
#include "etk_image_bmp_decoder.h"
#include "etk_widget.h"
#include "etk_platform.h"

struct mine_t{
	
	char *top;			//for paint
	char *middle;	//for judge
	char *bottom;	//raw data
	
	int rows;
	int cols;
	int bombcount;
	int recount;
	int toolix;
	char status;
}mine_t;

typedef struct mine_t mine_type;

void mine_click_cell(mine_type* mine, unsigned short x, unsigned short y, char isuser);
void mine_click_tool(mine_type* mine, unsigned short ix);
Ret mine_event(EtkWidget* thiz, EtkEvent* event);
void mine_rand_mine(mine_type* mine);
void mine_init_mine(mine_type* mine);
int mine_bombcount(mine_type* mine, int x, int y);
void mine_init_bmp();
void mine_draw_client(EtkWidget* thiz);
Ret mine_paint(EtkWidget* thiz);

Ret etk_mine_on_mouse_event(EtkWidget* thiz, EtkEvent* event);

EtkWidget* etk_game_mine(int x, int y, int rows, int cols, int count);
void etk_game_mine_destory(EtkWidget* minewin);

#endif


#include "mine.h"
#include "etk_pipe.h"

//#define MINE_DEBUG

//window title bar property
#define MINE_WINDOW_TITLE_HEIGHT				20
#define MINE_WINDOW_TITLE_CLOSE_HEIGHT	16
#define MINE_WINDOW_TITLE_CLOSE_WIDTH	16
#define MINE_WINDOW_TITLE_CLOSE_TOP			((MINE_WINDOW_TITLE_HEIGHT - MINE_WINDOW_TITLE_CLOSE_HEIGHT)/2)
#define MINE_WINDOW_TITLE_CLOSE_LEFT		MINE_WINDOW_TITLE_CLOSE_TOP
#define MINE_WINDOW_TITLE_CLOSE_BOTTOM	(MINE_WINDOW_TITLE_CLOSE_TOP + MINE_WINDOW_TITLE_CLOSE_HEIGHT)
#define MINE_WINDOW_TITLE_CLOSE_RIGHT		(MINE_WINDOW_TITLE_CLOSE_LEFT + MINE_WINDOW_TITLE_CLOSE_WIDTH)

//mine cell size
#define MINE_CELL_WIDTH		16
#define MINE_CELL_HEIGHT		16

//about mine scale
#define MINE_ROWS				mine->rows
#define MINE_COLS				mine->cols

//tool bar property
#define MINE_TOOL_HEIGHT_ALL		20
#define MINE_TOOL_CELL_WIDTH		16
#define MINE_TOOL_CELL_HEIGHT	16
#define MINE_TOOL_CELL_COUNT		6
#define MINE_TOOL_HEIGHT				MINE_TOOL_CELL_HEIGHT

//widow size
#define MINE_CLIENT_EDGE				0
#define MINE_WINDOW_WIDTH		((MINE_CELL_WIDTH * MINE_COLS) + MINE_CLIENT_EDGE)
#define MINE_WINDOW_HEIGHT		((MINE_WINDOW_TITLE_HEIGHT + MINE_TOOL_HEIGHT_ALL + (MINE_CELL_HEIGHT * MINE_ROWS))+MINE_CLIENT_EDGE)

//client a
#define MINE_WINDOW_CLIENT_WIDTH		(MINE_CELL_WIDTH * MINE_COLS)
#define MINE_WINDOW_CLIENT_HEIGHT		(MINE_CELL_HEIGHT * MINE_ROWS)
#define MINE_WINDOW_CLIENT_LEFT			(((MINE_WINDOW_WIDTH - MINE_WINDOW_CLIENT_WIDTH))/2)
#define MINE_WINDOW_CLIENT_TOP			((MINE_WINDOW_HEIGHT - MINE_WINDOW_TITLE_HEIGHT - MINE_TOOL_HEIGHT_ALL - MINE_WINDOW_CLIENT_HEIGHT )/2 + MINE_WINDOW_TITLE_HEIGHT + MINE_TOOL_HEIGHT_ALL)
#define MINE_WINDOW_CLIENT_RIGHT		(MINE_WINDOW_CLIENT_LEFT + MINE_WINDOW_CLIENT_WIDTH)
#define MINE_WINDOW_CLIENT_BOTTOM	(MINE_WINDOW_CLIENT_TOP + MINE_WINDOW_CLIENT_HEIGHT)

//toolbar property
#define MINE_TOOL_WIDTH_ALL	MINE_WINDOW_WIDTH
#define MINE_TOOL_WIDTH			(MINE_TOOL_CELL_WIDTH * MINE_TOOL_CELL_COUNT)
#define MINE_TOOL_TOP				(((MINE_TOOL_HEIGHT_ALL-MINE_TOOL_HEIGHT)/2) + MINE_WINDOW_TITLE_HEIGHT)
#define MINE_TOOL_LEFT				((MINE_TOOL_WIDTH_ALL - MINE_TOOL_WIDTH)/2)
#define MINE_TOOL_RIGHT			(MINE_TOOL_LEFT + MINE_TOOL_WIDTH)
#define MINE_TOOL_BOTTOM		(MINE_TOOL_TOP + MINE_TOOL_HEIGHT)

//position switch
//client
//client to window
#define MINE_CLIENT_X2WIN(_x)				((_x) + MINE_WINDOW_CLIENT_LEFT)
#define MINE_CLIENT_Y2WIN(_y)				((_y) + MINE_WINDOW_CLIENT_TOP)
//window to client
#define MINE_CLIENT_WIN2X(_x)				((_x) - MINE_WINDOW_CLIENT_LEFT)
#define MINE_CLIENT_WIN2Y(_y)				((_y) - MINE_WINDOW_CLIENT_TOP)

//tool bar
//client to window
#define MINE_TOOL_X2WIN(_x)				((_x) + MINE_TOOL_LEFT)
#define MINE_TOOL_Y2WIN(_y)				((_y) + MINE_TOOL_TOP)
//window to client
#define MINE_TOOL_WIN2X(_x)				((_x) - MINE_TOOL_LEFT)
#define MINE_TOOL_WIN2Y(_y)				((_y) - MINE_TOOL_TOP)

//get mine value
#define MINE_GET(_mine, _member, _y, _x)	(((_mine)->##_member##[((_mine)->cols * (_y) + (_x))]))

//game status
#define MINE_STA_RUN		0	//running
#define MINE_STA_DIE		1	//death
#define MINE_STA_SUC		2	//success

//bmp resource
EtkBitmap *mine_bmp_bomb[3] = {NULL, NULL, NULL};
EtkBitmap *mine_bmp_sta[3] = {NULL, NULL, NULL};
EtkBitmap *mine_bmp_num[9];

EtkBitmap *mine_bmp_tool[6];

#define MINE_BMP_TOOL_SMILE		0
#define MINE_BMP_TOOL_CRY			1
#define MINE_BMP_TOOL_SUCCESS	2
#define MINE_BMP_TOOL_FLAG			3
#define MINE_BMP_TOOL_UKN			4
#define MINE_BMP_TOOL_CUR			5

#define MINE_TOOL_IX_FLAG			0
#define MINE_TOOL_IX_UKN			1
#define MINE_TOOL_IX_CUR			2
#define MINE_TOOL_IX_FACE			4

#define MINE_EMPTY			0
#define MINE_BOMB			1

#define MINE_BMP_STA					9
#define MINE_BMP_STA_CT			3
#define MINE_BMP_STA_BLANK		9
#define MINE_BMP_STA_FLAG		10
#define MINE_BMP_STA_UNK			11

#define MINE_BMP_BOMB				12
#define MINE_BMP_BOMB_CT		2
#define MINE_BMP_BOMB_NAT		12
#define MINE_BMP_BOMB_FOC		13

//when select cell
void mine_click_cell(mine_type* mine, unsigned short x, unsigned short y, char isuser)
{
	int i,j;
	if(mine->status != MINE_STA_RUN || x >= mine->cols || y >= mine->rows)return;
	if(	MINE_GET(mine, top, y, x) != MINE_BMP_STA_BLANK && 
		MINE_GET(mine, top, y, x) != MINE_BMP_STA_FLAG &&
		MINE_GET(mine, top, y, x) != MINE_BMP_STA_UNK)return;

	if(isuser)
	{
		if(mine->toolix == MINE_TOOL_IX_FLAG)
		{
			if(MINE_GET(mine, top, y, x) == MINE_BMP_STA_BLANK)
				MINE_GET(mine, top, y, x) = MINE_BMP_STA_FLAG;
			else
				MINE_GET(mine, top, y, x) = MINE_BMP_STA_BLANK;
			return;
		}
		else	if(mine->toolix == MINE_TOOL_IX_UKN)
		{
			if(MINE_GET(mine, top, y, x) == MINE_BMP_STA_BLANK)
				MINE_GET(mine, top, y, x) = MINE_BMP_STA_UNK;
			else
				MINE_GET(mine, top, y, x) = MINE_BMP_STA_BLANK;
			return;
		}
	}

	if(	MINE_GET(mine, top, y, x) != MINE_BMP_STA_BLANK && MINE_GET(mine, top, y, x) != MINE_BMP_STA_UNK)return;

	if(MINE_GET(mine, bottom, y, x) == MINE_EMPTY)	//is bomb
	{
		MINE_GET(mine, top, y, x) = MINE_GET(mine, middle, y, x);
		if(MINE_GET(mine, middle, y, x) == 0)
		{
			if(x > 0)mine_click_cell(mine, x-1, y, 0);	//left
			if(y > 0)mine_click_cell(mine, x, y-1, 0);	//top
			if(x < (MINE_COLS-1))mine_click_cell(mine, x+1, y, 0);	//right
			if(y < (MINE_ROWS-1))mine_click_cell(mine, x, y+1, 0);	//right
		}
		--mine->recount;
		if(mine->recount == 0)	//success
		{
			mine->status = MINE_STA_SUC;
			if(mine->bombcount < (mine->cols * mine->rows - 1))
				++mine->bombcount;
		}
	}
	else
	{
		if(isuser)	//fail
		{
			for(j = 0; j < MINE_ROWS; ++j){
				for(i = 0; i < MINE_COLS; ++i){
					if(MINE_GET(mine, bottom, j, i) == MINE_BOMB){
						MINE_GET(mine, top, j, i) = MINE_BMP_BOMB_NAT;
					}
				}
			}
			MINE_GET(mine, top, y, x) = MINE_BMP_BOMB_FOC;
			mine->status = MINE_STA_DIE;
		}
		else	//nothing to do
		{
			return;
		}
	}
}

//when select tool
void mine_click_tool(mine_type* mine, unsigned short ix){
	switch(ix){
	case MINE_TOOL_IX_FACE:{
		mine_rand_mine(mine);
		mine->status = MINE_STA_RUN;
		mine->toolix = MINE_TOOL_IX_CUR;
		break;
						   }
	case MINE_TOOL_IX_CUR:
	case MINE_TOOL_IX_FLAG:
	case MINE_TOOL_IX_UKN:{
		mine->toolix = ix;
						  }
	}

}
Ret etk_mine_on_mouse_event(EtkWidget* thiz, EtkEvent* event){
	EtkWindowClass *priv=(EtkWindowClass*)thiz->subclass;
	mine_type* mine = NULL;
	mine = (mine_type*)priv->data[0];
	if(event->type == ETK_EVENT_MOUSE_DOWN){
		EtkWindowClass* priv=(EtkWindowClass*)thiz->subclass;
		e32 x = event->u.mouse.x - thiz->rect.x;
		e32 y = event->u.mouse.y - thiz->rect.y;
		if(	x >= MINE_WINDOW_CLIENT_LEFT && x < MINE_WINDOW_CLIENT_RIGHT &&y >= MINE_WINDOW_CLIENT_TOP && y < MINE_WINDOW_CLIENT_BOTTOM){
			mine_click_cell(mine,MINE_CLIENT_WIN2X(x) / MINE_CELL_WIDTH,MINE_CLIENT_WIN2Y(y) / MINE_CELL_WIDTH, 1);
		}
		else if(x >= MINE_TOOL_LEFT && x < MINE_TOOL_RIGHT && y >= MINE_TOOL_TOP && y < MINE_TOOL_BOTTOM){
			mine_click_tool(mine,  MINE_TOOL_WIN2X(x) / MINE_TOOL_CELL_WIDTH);
		}
		mine_paint(thiz);

	}else if(event->type==ETK_EVENT_MOUSE_UP){
		EtkRect r;
		r.width=1;
		r.height=1;
		r.x=event->u.mouse.x-thiz->rect.x;
		r.y=event->u.mouse.y-thiz->rect.y;
		r=etk_rect_intersect(priv->close_rect,r);
		if(r.width>0){
			EtkEvent e;
			//printf("--etk_window_on_mouse_event\n");
			etk_event_init(&e, ETK_EVENT_WND_DESTROY);
			e.widget = thiz;
			etk_wnd_manager_dispatch_event(etk_default_wnd_manager(),&e);

		}
	}
	 
}

//event
Ret mine_event(EtkWidget* thiz, EtkEvent* event){
	int x, y;
	EtkWindowClass *priv=(EtkWindowClass*)thiz->subclass;
	Ret ret;
	EtkEvent e;
	EtkRect r;
	mine_type* mine = NULL;
	mine = (mine_type*)priv->data[0];

	if(event==NULL)
		return;
	switch(event->type){
	case ETK_EVENT_UPDATE:
		etk_widget_paint_all(thiz);
		//etk_window_update(thiz,&event->u.rect);
		break;
	case ETK_EVENT_MOVE_RESIZE:
		//dbg_printf("ETK_EVENT_MOVE_RESIZE\n");
		if(etk_widget_is_visible(thiz)){
			etk_wnd_manager_update(etk_default_wnd_manager());
		}
		break;
	case ETK_EVENT_SHOW:
		//dbg_printf("ETK_EVENT_SHOW\n");
		etk_widget_paint(thiz);
		etk_event_init(&e, ETK_EVENT_SHOW);
		e.widget = thiz;
		etk_wnd_manager_dispatch_event(etk_default_wnd_manager(),&e);
		break;
	case ETK_EVENT_HIDE:

		etk_event_init(&e, ETK_EVENT_HIDE);
		e.widget = thiz;
		etk_wnd_manager_dispatch_event(etk_default_wnd_manager(), &e);
		break;
	case ETK_EVENT_MOUSE_DOWN:
	case ETK_EVENT_MOUSE_UP:
	case ETK_EVENT_MOUSE_MOVE:
	case ETK_EVENT_MOUSE_LONG_PRESS: 
		ret = etk_mine_on_mouse_event(thiz,event);
		break;
	case ETK_EVENT_KEY_DOWN:
	case ETK_EVENT_KEY_UP:
	case ETK_EVENT_KEY_LONG_PRESS:{
		ret = etk_window_on_key_event(thiz,event);
		break;
								  }
	default:
		break;
	}

	return RET_OK;
}

//create a random mine
void mine_rand_mine(mine_type* mine){
	int i, j,x,y;
	//time_t tm = 0;
	//srand(time(&tm));

	mine->recount = (MINE_ROWS * MINE_COLS) - mine->bombcount;
	for(j = 0; j < MINE_ROWS; ++j){
		for(i = 0; i < MINE_COLS; ++i){
			MINE_GET(mine, bottom, j, i) = MINE_EMPTY;
			MINE_GET(mine, top, j, i) = MINE_BMP_STA_BLANK;
		}
	}

	for(i = 0; i < mine->bombcount; ++i){
		do{
			x = rand() % MINE_COLS;
			y = rand() % MINE_ROWS;
		}while(MINE_GET(mine, bottom, y, x) != MINE_EMPTY);
		MINE_GET(mine, bottom, y, x) = MINE_BOMB;
	}	
	//display middle
	for(j = 0; j < MINE_ROWS; ++j){
		for(i = 0; i < MINE_COLS; ++i){
			MINE_GET(mine, middle, j, i) = mine_bombcount(mine, i, j);
		}
	}

	mine->toolix = MINE_TOOL_IX_CUR;
}

//initialize mine
void mine_init_mine(mine_type* mine){
	int size;
	size = MINE_ROWS * MINE_COLS * sizeof(char);

	mine->top = (char*)ETK_MALLOC(size);
	mine->middle = (char*)ETK_MALLOC(size);
	mine->bottom = (char*)ETK_MALLOC(size);

	if(mine->bombcount > (MINE_ROWS * MINE_COLS)){
		mine->bombcount = (MINE_ROWS * MINE_COLS);
	}
	mine_rand_mine(mine);
}

int mine_bombcount(mine_type* mine, int x, int y){
	int ct = 0;
	if(x > 0 && MINE_GET(mine, bottom, y, x-1) == MINE_BOMB)++ct;	//left
	if(y > 0 && MINE_GET(mine, bottom, y-1, x) == MINE_BOMB)++ct;	//top
	if(x < (MINE_COLS-1) && MINE_GET(mine, bottom, y, x+1) == MINE_BOMB)++ct;	//right
	if(y < (MINE_ROWS-1) && MINE_GET(mine, bottom, y+1, x) == MINE_BOMB)++ct;	//right

	if(x > 0 && y > 0 && MINE_GET(mine, bottom, y-1, x-1) == MINE_BOMB)++ct;	//left top
	if(x > 0 && y < (MINE_ROWS-1) && MINE_GET(mine, bottom, y+1, x-1) == MINE_BOMB)++ct;	//left bottom
	if(y > 0 && x < (MINE_COLS-1)  && MINE_GET(mine, bottom, y-1, x+1) == MINE_BOMB)++ct;	//right top
	if(x < (MINE_COLS-1) && y < (MINE_ROWS-1) && MINE_GET(mine, bottom, y+1, x+1) == MINE_BOMB)++ct;	//right bottom

	return ct;
}

void mine_init_bmp(){
	if(mine_bmp_num[0] != NULL){
		return;
	}

	//number 0  to 8
	mine_bmp_num[0] = load_bmp("./mine/num_0.bmp");
	mine_bmp_num[1] = load_bmp("./mine/num_1.bmp");
	mine_bmp_num[2] = load_bmp("./mine/num_2.bmp");
	mine_bmp_num[3] = load_bmp("./mine/num_3.bmp");
	mine_bmp_num[4] = load_bmp("./mine/num_4.bmp");
	mine_bmp_num[5] = load_bmp("./mine/num_5.bmp");
	mine_bmp_num[6] = load_bmp("./mine/num_6.bmp");
	mine_bmp_num[7] = load_bmp("./mine/num_7.bmp");
	mine_bmp_num[8] = load_bmp("./mine/num_8.bmp");		//8

	//state
	mine_bmp_sta[0] = load_bmp("./mine/sta_blank.bmp");//9
	mine_bmp_sta[1] = load_bmp("./mine/sta_flag.bmp");		//10
	mine_bmp_sta[2] = load_bmp("./mine/sta_unknown.bmp");		//11

	//bomb
	mine_bmp_bomb[0] = load_bmp("./mine/bomb_nat.bmp");		//12
	mine_bmp_bomb[1] = load_bmp("./mine/bomb_focused.bmp");	//13

	//tool
	//face
	mine_bmp_tool[MINE_BMP_TOOL_SMILE] = load_bmp("./mine/tool_smile.bmp");
	mine_bmp_tool[MINE_BMP_TOOL_CRY] = load_bmp("./mine/tool_cry.bmp");
	mine_bmp_tool[MINE_BMP_TOOL_SUCCESS] = load_bmp("./mine/tool_success.bmp");
	mine_bmp_tool[MINE_BMP_TOOL_FLAG] = load_bmp("./mine/tool_flag.bmp");
	mine_bmp_tool[MINE_BMP_TOOL_UKN] = load_bmp("./mine/tool_unknown.bmp");
	mine_bmp_tool[MINE_BMP_TOOL_CUR] = load_bmp("./mine/tool_cursor.bmp");
}

//draw game clinet
void mine_draw_client(EtkWidget* thiz){
	int i, j;
	char c;
	EtkBitmap *bmp = NULL;
	EtkRect srec, drec;
	EtkCanvas *can = NULL;
	mine_type *mine = NULL;
	EtkWindowClass *priv=(EtkWindowClass *)thiz->subclass;
	mine = (mine_type*)priv->data[0];
	if(mine_bmp_num[0] == NULL){	//did't initialize bitmap
		mine_init_bmp();
		if(mine_bmp_num[0] == NULL){
			return;
		}
	}
	srec.x = 0;
	srec.y = 0;
	drec.height = srec.height = MINE_CELL_HEIGHT;
	drec.width = srec.width = MINE_CELL_WIDTH;

	can = thiz->canvas;

	for(j = 0; j < MINE_ROWS; ++j){
		for(i = 0; i < MINE_COLS; ++i){
			drec.x = MINE_CLIENT_X2WIN(i * MINE_CELL_WIDTH);
			drec.y = MINE_CLIENT_Y2WIN(j * MINE_CELL_HEIGHT);
			c = MINE_GET(mine, top, j, i) ;
			if(c>= 0 && c <= MINE_BMP_BOMB_FOC)
			{
				if( c >=0 && c <= 8)
					bmp = mine_bmp_num[c];
				else if(c >=9 && c <= 11){
					bmp = mine_bmp_sta[c-9];
				}
				else{
					bmp = mine_bmp_bomb[c-12];
				}
				etk_canvas_draw_bitmap(can, bmp, &srec, &drec, 0);
			}
			else
			{
				//printf("Error!\n");
			}
		}
	}

	//toolbar
	//face
	drec.height = srec.height = MINE_TOOL_CELL_HEIGHT;
	drec.width = srec.width = MINE_TOOL_CELL_WIDTH;
	drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_FACE * MINE_TOOL_CELL_WIDTH);
	drec.y = MINE_TOOL_Y2WIN(0);
	if(mine->status == MINE_STA_RUN)
	{
		etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_SMILE], &srec, &drec, 0);
	}
	else if(mine->status == MINE_STA_DIE)
	{
		etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_CRY], &srec, &drec, 0);
	}
	else if(mine->status == MINE_STA_SUC)
	{
		etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_SUCCESS], &srec, &drec, 0);
	}
	//flag
	drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_FLAG * MINE_TOOL_CELL_WIDTH);
	etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_FLAG], &srec, &drec, 0);
	//unknow
	drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_UKN * MINE_TOOL_CELL_WIDTH);
	etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_UKN], &srec, &drec, 0);
	//cursor
	drec.x = MINE_TOOL_X2WIN(MINE_TOOL_IX_CUR * MINE_TOOL_CELL_WIDTH);
	etk_canvas_draw_bitmap(can, mine_bmp_tool[MINE_BMP_TOOL_CUR], &srec, &drec, 0);
	//can->draw_rect(can, MINE_TOOL_LEFT, MINE_TOOL_TOP, MINE_TOOL_WIDTH,  MINE_TOOL_HEIGHT, 0xff0000);

	//draw select box
	can->draw_rect(can, MINE_TOOL_X2WIN(mine->toolix*MINE_TOOL_CELL_WIDTH), MINE_TOOL_Y2WIN(0), MINE_TOOL_CELL_WIDTH-1,  MINE_TOOL_CELL_HEIGHT-1, 0xff0000);
}

//redraw snake munch
Ret mine_paint(EtkWidget* thiz){	
	EtkRect rectitle;
	EtkColor coltitle;
	EtkBitmap *bmptitle=NULL;
	EtkWindowClass *priv=(EtkWindowClass*)thiz->subclass;

	if((thiz->type&ETK_WIDGET_WINDOW)){
		const char *text = NULL;
		rectitle.x = 0;
		rectitle.y = 0;
		rectitle.height = MINE_WINDOW_TITLE_HEIGHT;
		rectitle.width = thiz->rect.width;
		etk_color_init(&coltitle,0xffffff-0x8f8fcf,ETK_PIXEL_BGR24);
		bmptitle = etk_bitmap_create(rectitle.width, rectitle.height, 32, coltitle);	//code should be change to save mem

		//Draw close box
		etk_bitmap_draw_rect(bmptitle,
			MINE_WINDOW_TITLE_CLOSE_LEFT,
			MINE_WINDOW_TITLE_CLOSE_TOP,
			MINE_WINDOW_TITLE_CLOSE_WIDTH,
			MINE_WINDOW_TITLE_CLOSE_HEIGHT,
			0xcccccc);
		etk_bitmap_draw_line(bmptitle,	
			MINE_WINDOW_TITLE_CLOSE_LEFT,
			MINE_WINDOW_TITLE_CLOSE_TOP, 
			MINE_WINDOW_TITLE_CLOSE_RIGHT,
			MINE_WINDOW_TITLE_CLOSE_BOTTOM);
		etk_bitmap_draw_line(bmptitle,	
			MINE_WINDOW_TITLE_CLOSE_RIGHT,
			MINE_WINDOW_TITLE_CLOSE_TOP, 
			MINE_WINDOW_TITLE_CLOSE_LEFT,
			MINE_WINDOW_TITLE_CLOSE_BOTTOM);
		//title bar area
		etk_canvas_draw_bitmap(thiz->canvas, bmptitle, &rectitle, &rectitle, 0x00);

		etk_bitmap_destroy(bmptitle);
	}

	//client area
	mine_draw_client(thiz);

	//thiz->display->update(thiz->display,thiz->canvas->bitmap, &thiz->rect, thiz->rect.x-thiz->rect.x,thiz->rect.y-thiz->rect.y);
	//etk_default_wnd_manager_update_widget(etk_default_wnd_manager(),thiz);
	return RET_OK;
}

EtkWidget* etk_game_mine(int x, int y, int rows, int cols, int count){
	EtkWidget* thiz;
	EtkWindowClass *priv;
	mine_type* mine;
	mine = (mine_type*)ETK_MALLOC(sizeof(mine_type));
	mine->rows = rows;
	mine->cols = cols;
	mine->bombcount = count;
	mine->status = MINE_STA_RUN;
	mine_init_mine(mine);
	thiz=etk_window_create(x, y, MINE_WINDOW_WIDTH, MINE_WINDOW_HEIGHT,ETK_WIDGET_WINDOW);
	priv=(EtkWindowClass*)thiz->subclass;
	priv->has_head=0;
	priv->data[0] = mine;
	thiz->event = mine_event;
	thiz->paint = mine_paint;
	return thiz;
}

//destory mine
void etk_game_mine_destory(EtkWidget* minewin){
	if(minewin!=NULL){
		mine_type * mine;
		EtkWindowClass *priv=(EtkWindowClass*)minewin->subclass;
		mine = (mine_type*)priv->data[0];
		ETK_FREE(mine->bottom);
		ETK_FREE(mine->middle);
		ETK_FREE(mine->top);
		ETK_FREE(priv->data[0]);
	}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: