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

📄 menu.cpp

📁 Clear Mine扫雷游戏: 这是一个模拟扫雷游戏的vc编码程序 编码思想: 通过几个数组设定好雷区的位置
💻 CPP
字号:
/***********************************************************
*  menu.c                                                  *
*   GUI menuing system					   *
***********************************************************/

#include "koules.h"
#include "interface.h"
#include "input.h"
#include "sound.h"
#define TEXTW 9
#define TEXTH 16
int		onmenu=-1;

typedef struct
{
	char           *text;
    void            (*func) ();
}
Menu;

typedef struct
{
	int             x;
	int				y;
	int				*number;
	int				max;
	int				min;
    int             line;
    void            (*func) ();
}
Numbers;

int             ssound = 1;
static Numbers  minim[2], maxim[2];
static int      nmenu;
static int      nnumbers;
static Menu     menu[20];
static int      selected = 0;
static double    mx1, my1, mx1p, my1p;
static double    mx2, my2, mx2p, my2p;
static int      mtime;
static char    playertext[] = " 1  PLAYER";
static char    leveltext[] = "LEVEL  000 ";

int YPOSITION(int i)
{
	return (MAPHEIGHT/2+20-5*nmenu+20*i);
}

int XPOSITION(int i)
{
	return (MAPWIDTH/2-TextLen(menu[i].text)/2);
}

int XPOSITION1(int i)
{
	return (MAPWIDTH/2+TextLen(menu[i].text)/2);
}

static int      player, keynum, lastplayer;
static void     main_menu ();
static void     change_menu ();

static void
player_change ()
{
	player = (selected - 2) / 2;
	lastplayer = (selected - 2) / 2;

	if (player == mouseplayer)
		return;
	keynum = 0;
	gamemode = KEYS;
}


static void
control_change ()
{
  int             player;
  player = (selected - 1) / 2;

  if (player == mouseplayer)
    {
      mouseplayer = -1;
    }
  else

    {
      if (!rotation[player])
	{
	  rotation[player] = 1;
	}
      else
	{
	  rotation[player] = 0;

	  if (mouseplayer == -1)
	    mouseplayer = player;

	}
    }
  change_menu ();
}

void
start ()
{
	int             i;
	for (i = 0; i < nrockets; i++)
    {
      object[i].score = 0;
    }
	sound = ssound;
	gamemode = GAME;
	show_playerdata=TRUE;
	show_player=1;
	gameplan_init ();
	init_objects ();
}


static void
playerchange ()
{
	if (nrockets > 5)
		nrockets = 1; 
	playertext[1] = nrockets + '0';
}

static void
levelchange ()
{
	sprintf (leveltext, "LEVEL  %03i ", lastlevel + 1);
}


static void
quit ()
{
	save_rc();
	uninitialize ();
	AfxGetMainWnd()->PostMessage(WM_COMMAND,ID_APP_EXIT,NULL);
}

static void
fit_selector ()
{
	mtime = MENUTIME;
	mx1p = (XPOSITION (selected) - 2 - mx1) / mtime;
	mx2p = (XPOSITION1 (selected) + 2 - mx2) / mtime;
	my1p = (YPOSITION (selected) - 2 - my1) / mtime;
	my2p = (YPOSITION (selected) + TEXTH+2 + 0 - my2) / mtime;
}

static void
to_main_menu ()
{
	save_rc ();
	main_menu ();
}

static void
change_menu ()
{
	static char     s[2][5][40], *s1;
	int             i;
    {
		menu[0].text = "BACK TO MAIN MENU";
		menu[0].func = to_main_menu;
    }
	nnumbers = 0;
	for (i = 0; i < nrockets; i++)
    {
		if (i == mouseplayer)
			s1 = "MOUSE";
		else if (rotation[i])
			s1 = "ROTATION KEYBOARD";
		else
			s1 = "KEYBOARD";
		sprintf (s[0][i], "PLAYER %i:%s", i + 1, s1);

		if (i == mouseplayer)
			sprintf (s[1][i], "NO CONFIG FOR MOUSE");
		else
			sprintf (s[1][i], "CHANGE KEYS");
		menu[i * 2 + 1].text = s[0][i];
		menu[i * 2 + 2].text = s[1][i];
		menu[i * 2 + 1].func = control_change;
		menu[i * 2 + 2].func = player_change;
	}
	nmenu = nrockets * 2 + 1;
	if (selected >= nmenu)
	    selected = 0;
	fit_selector ();
}

static void
deathmatch ()
{
	gameplan = DEATHMATCH;
	main_menu ();
}

static void
cooperative ()
{
	gameplan = COOPERATIVE;
	main_menu ();
}

static void
setsound ()
{
	if (sndinit)
		ssound = !ssound;
	main_menu ();
}

static void
veryhard ()
{
	difficulty = 0;
	main_menu ();
}

static void
hard ()
{
	difficulty = 1;
	main_menu ();
}

static void
medium ()
{
	difficulty = 2;
	main_menu ();
}

static void
easy ()
{
	difficulty = 3;
	main_menu ();
}

static void
veryeasy ()
{
	difficulty = 4;
	main_menu ();
}

static void
change_mode ()
{
	nnumbers = 0;
	menu[0].text = "DEATH MATCH(DOOM)";
	menu[0].func = deathmatch;
	menu[1].text = "COOPERATIVE";
	menu[1].func = cooperative;
	nmenu = 2;
	selected = 1;
	fit_selector ();
}

static void
change_obtiznost ()
{
	menu[0].text = "NIGHTMARE";
	menu[0].func = veryhard;
	menu[1].text = "HARD";
	menu[1].func = hard;
	menu[2].text = "MEDIUM";
	menu[2].func = medium;
	menu[3].text = "EASY";
	menu[3].func = easy;
	menu[4].text = "VERY EASY";
	menu[4].func = veryeasy;
	nnumbers = 0;
	nmenu = 5;
	selected = 2;
	fit_selector ();
}

static void
main_menu ()
{
	nnumbers = 2;
	nmenu = 8;

	menu[0].text = "START GAME";
	menu[1].text = playertext;
	menu[2].text = leveltext;
	menu[3].text = "CONTROL";
	menu[4].text = "GAME MODE";
	menu[5].text = "DIFFICULTY";
	menu[6].text = ssound ? "SOUND ON" : (sndinit ? "SOUND OFF" : "SOUND OFF-NOT INITIALIZED");
	menu[7].text = "QUIT";

	menu[0].func = start;
	menu[1].func = playerchange;
	menu[2].func = playerchange;
	menu[3].func = change_menu;
	menu[4].func = change_mode;
	menu[5].func = change_obtiznost;
	menu[6].func = setsound;
	menu[7].func = quit;
	minim[0].func = playerchange;	
	maxim[0].func = playerchange;
	maxim[1].func = levelchange;
	minim[1].func = levelchange;

	minim[0].x = XPOSITION (1);
	minim[0].y = YPOSITION (1);
	maxim[0].x = XPOSITION (1) + TEXTW * 2;
	maxim[0].y = YPOSITION (1);
	minim[1].x = XPOSITION (2) + 6 * TEXTW;
	minim[1].y = YPOSITION (2);
	maxim[1].x = XPOSITION (2) + 10 * TEXTW;
	maxim[1].y = YPOSITION (2);
	minim[0].max = 5;
	minim[0].min = 1;
	maxim[0].max = 5;
	maxim[0].min = 1;
	minim[0].line = 1;
	minim[0].number = &nrockets;
	maxim[0].line = 1;
	maxim[0].number = &nrockets;
	minim[1].line = 2;
	minim[1].number = &lastlevel;
	minim[1].max = maxlevel;
	minim[1].min = 0;
	maxim[1].line = 2;
	maxim[1].number = &lastlevel;
	maxim[1].max = maxlevel;
	maxim[1].min = 0;
	
	playerchange ();
	levelchange ();

	selected = 0;
	fit_selector ();
}
/***************************************************************************/
/***************************************************************************/
void
init_menu ()
{
	mx1 = 10;
	mx2 = MAPWIDTH - 10;
	my2 = 10;
	my2 = MAPHEIGHT - 10;
	ssound = sound;
	playertext[1] = nrockets + '0';
	main_menu ();
}

#define MLine(dc,x,y,x1,y1) MoveToEx(dc,x,y,NULL),LineTo(dc,x1,y1)
void
draw_menu (CONST int draw)
{
	int             i;
	
	sound = 0;
	if (draw)
    {
		levelchange ();
		DrawRectangle ((int) mx1, (int) my1, (int) mx2, (int) my2, ball (2));
		DrawRectangle ((int) mx1 + 1, (int) my1 + 1, (int) mx2 + 1, (int) my2 + 1, ball (20));
		
		{
			HDC dc;
			HPEN pen=CreatePen(PS_SOLID,1,PTORGB(ball (2)));
			draw_surf->GetDC(&dc);
			SelectObject(dc,pen);
			
			for (i = 0; i < nnumbers; i++)
			{	
			//we should do it faster
			int sy=minim[i].y + TEXTH/2 -1;
			MLine (dc,minim[i].x, sy, minim[i].x + 6, sy );
			MLine (dc,minim[i].x + 3, sy - 3, minim[i].x	, sy);
			MLine (dc,minim[i].x + 4, sy - 3, minim[i].x + 1, sy);
			MLine (dc,minim[i].x + 3, sy + 3, minim[i].x	, sy);
			MLine (dc,minim[i].x + 4, sy + 3, minim[i].x + 1, sy);
			
			sy=maxim[i].y + TEXTH/2 -1;
			MLine (dc,maxim[i].x + 2, sy, maxim[i].x + 8, sy);
			MLine (dc,maxim[i].x + 5, sy - 3, maxim[i].x + 8,sy);
			MLine (dc,maxim[i].x + 4, sy - 3, maxim[i].x + 7,sy);
			MLine (dc,maxim[i].x + 5, sy + 3, maxim[i].x + 8,sy);
			MLine (dc,maxim[i].x + 4, sy + 3, maxim[i].x + 7,sy);
			}
			draw_surf->ReleaseDC(dc);
			DeleteObject(pen);
			
		}
		for (i = 0; i < nmenu; i++)
		{
			if(i==onmenu)
			{
				DrawRedMaskedText ((int) XPOSITION (i) + 2, (int) YPOSITION (i) + 2, menu[i].text);
				DrawRedMaskedText ((int) XPOSITION (i) + 1, (int) YPOSITION (i) + 1, menu[i].text);
			}
			else
			{
				DrawWhiteMaskedText ((int) XPOSITION (i) + 1, (int) YPOSITION (i) + 1, menu[i].text);
				DrawWhiteMaskedText ((int) XPOSITION (i), (int) YPOSITION (i), menu[i].text);
			}
		}
	}
	if (mtime)
    {
		mtime--;
		my1 += my1p;
		mx1 += mx1p;
		my2 += my2p;
		mx2 += mx2p;
    }
	PutBitmap((GAMEWIDTH-320)/2,GAMEHEIGHT/4-80/2,320,80,koules_bitmap);
}

static int      inctime, changed, waittime;
static void
increase (int i)
{
	changed = 1;
	if (waittime)
    {
		waittime--;
		return;
    }
	waittime = inctime;
	if (inctime > 1)
		inctime--;
	else
		(*maxim[i].number) += 2;
	(*maxim[i].number)++;
	if (*maxim[i].number > maxim[i].max)
		*maxim[i].number = maxim[i].min;
	maxim[i].func ();
	save_rc ();
}

static void
decrease (int i)
{
	changed = 1;
	if (waittime)
    {
		waittime--;
		return;
    }
	waittime = inctime;
	if (inctime > 1)
		inctime--;
	else
		(*maxim[i].number) -= 2;
	(*minim[i].number)--;
	if (*minim[i].number < minim[i].min)
		*minim[i].number = minim[i].max;
	minim[i].func ();
	save_rc ();
}

void
menu_keys ()
{
	static int      enter;
	int             ent = 0;

	static int      button;
	int             but = 0;

	if (maxim[1].max != maxlevel)
	    main_menu ();
	changed = 0;
	if (IsPressingLeft ())
    {
		int             i;
		for (i = 0; i < nnumbers; i++)
			if (maxim[i].line == selected)
				decrease (i);
    }
	if (IsPressingRight ())
    {
		int             i;
		for (i = 0; i < nnumbers; i++)
			if (maxim[i].line == selected)
				increase (i);
	}

	but = MouseButtons ();
	if (but)
    {
		int             i;
		for (i = 0; i < nnumbers; i++)
		{
			if (MouseX () > maxim[i].x &&
				MouseX () < maxim[i].x + TEXTW &&
				MouseY () > maxim[i].y &&
				MouseY () < maxim[i].y + TEXTH)
				increase (i);
			if (MouseX () > minim[i].x &&
				MouseX () < minim[i].x + TEXTW &&
				MouseY () > minim[i].y &&
				MouseY () < minim[i].y + TEXTH)
				decrease (i);
		}
    }
	CPoint pt(MouseX(),MouseY());
	onmenu=-1;
	for(int i=0;i<nmenu;i++)
	{
		CRect rc((int) XPOSITION (i),
			(int) YPOSITION (i), (int) XPOSITION1 (i),
			(int) YPOSITION (i) + TEXTH);
		if(rc.PtInRect(pt))
		{
			onmenu=i;
			break;
		}
	}
	if (onmenu!=-1)
	{
		selected = onmenu;
		fit_selector ();
	}
	if (!but && button)
    {
		if (onmenu!=-1)
		{
			menu[selected].func ();
			button = 0;
			return;
		}
    }
	button = but;

	if (IsPressedEsc ())
    {
		if (nnumbers == 2)
			quit ();
		to_main_menu ();
	}
	if (IsPressingUp () && !mtime && selected > 0)
	    selected--, fit_selector ();
	if (IsPressingDown () && !mtime && selected < nmenu - 1)
	    selected++, fit_selector ();
	if (IsPressingEnter () && !mtime)
		ent = 1;
	if (!ent && enter)
    {
		menu[selected].func ();
    }
	enter = ent;
	if (!changed)
		inctime = 7, waittime = 0;
}

void
keys_keys ()
{
	static int      lscan_code;
	int             scan_code;
	scan_code = GetKey ();
	if (!scan_code && lscan_code)
    {
		keys[player][keynum] = lscan_code;
		keynum++;
		if (keynum > (rotation[player] ? 2 : 3))
		{
			player++;
			keynum = 0;
			if (player > lastplayer)
			{
				change_menu ();
				gamemode = MENU;
			}
		}
    }
	lscan_code = scan_code;
}


void
draw_keys (int draw)
{
	char            s[20];
	static char    *key[4] =
	{"UP", "DOWN", "LEFT", "RIGHT"};
	static char    *rkey[3] =
	{"ACCELERATION", "ROTATE LEFT", "ROTATE RIGHT"};
	if (!draw)
		return;
	nmenu = 2;
	sprintf (s, "PLAYER:%i", player + 1);
	DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - TEXTW * strlen (s)), (int) YPOSITION (0), s);
	if (rotation[player])
		sprintf (s, "KEY:%s", rkey[keynum]);
	else
		sprintf (s, "KEY:%s", key[keynum]);
		DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - TEXTW * strlen (s)), (int) YPOSITION (1), s);
}

⌨️ 快捷键说明

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