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

📄 window.c

📁 Cat Tom 兄弟的力作.代码是纯C写的
💻 C
字号:
/******************************************/
/*                window.c                */
/*                                        */
/*          水晶之约中的窗体系统          */
/*                                        */
/*             编译环境DJGPP              */
/*                                        */
/*        编译需allegro V4.1.13支持       */
/*                                        */
/*           Cat Tom  1.5.2003            */
/******************************************/


#define SHOW_STATUS      0
#define USE_OBJECT       1
#define CHOOSE_ACTOR     2
#define SHOW_HELP        3
#define SHOW_SYSTEM      4
#define ASK_QUIT         5


#define WIN_ON           1
#define WIN_OFF          0

#define NO_CHOICE        -1


struct
{
 Sprlib pic;  //图片文件

 char show;      //显示的页面号
 char state;    //循环状态
}Window;


typedef struct
{
 int xx;
 int yy;

 int height;

 char max_point;
 char point_at;
}CHOICE;


struct
{
 CHOICE choice_box[20];
 int max_num;

 Animate arrow;
 SAMPLE *button;
}Choice_Lib={0};           //选择框资源库

///////////////////////////////////////////////////////////////////////

/*画一个空白窗口*/
void Draw_Window(int x,int y,int width,int height)
{
 int i,j;
 putspr(x,y,0,0,Window.pic);
 putspr(x+width*32-32,y,2,0,Window.pic);
 putspr(x,y+height*32-32,0,2,Window.pic);
 putspr(x+width*32-32,y+height*32-32,2,2,Window.pic);
 for(i=1;i<width-1;i++)
   putspr(x+32*i,y,1,0,Window.pic);
 for(i=1;i<height-1;i++)
   putspr(x,y+32*i,0,1,Window.pic);
 for(i=1;i<height-1;i++)
   putspr(x+32*width-32,y+32*i,2,1,Window.pic);
 for(i=1;i<width-1;i++)
   putspr(x+32*i,y+32*height-32,1,2,Window.pic);
 for(i=1;i<height-1;i++)
   for(j=1;j<width-1;j++)
     putspr(x+32*j,y+32*i,1,1,Window.pic);
}


/*初始化选择框*/
void Init_Choice_Lib(int xx,int yy,int height,char max_point)
{
 Choice_Lib.choice_box[Choice_Lib.max_num].xx=xx;
 Choice_Lib.choice_box[Choice_Lib.max_num].yy=yy;

 Choice_Lib.choice_box[Choice_Lib.max_num].height=height;

 Choice_Lib.choice_box[Choice_Lib.max_num].max_point=max_point;

 Choice_Lib.max_num++;
}


/*选择框的函数*/
int Choice_Box(int i)
{
 showanimate(Choice_Lib.choice_box[i].xx,Choice_Lib.choice_box[i].yy+Choice_Lib.choice_box[i].height*Choice_Lib.choice_box[i].point_at,&Choice_Lib.arrow);

 if(key[KEY_UP])
 {
  PressKey(KEY_UP);
  Choice_Lib.choice_box[i].point_at--;
  if(Choice_Lib.choice_box[i].point_at<0)Choice_Lib.choice_box[i].point_at=0;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);

  return NO_CHOICE;
 }
 else if(key[KEY_DOWN])
 {
  PressKey(KEY_DOWN);
  Choice_Lib.choice_box[i].point_at++;
  if(Choice_Lib.choice_box[i].point_at>Choice_Lib.choice_box[i].max_point-1)
    Choice_Lib.choice_box[i].point_at=Choice_Lib.choice_box[i].max_point-1;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);

  return NO_CHOICE;
 }
 else if(key[KEY_X])
 {
  PressKey(KEY_X);

  play_sample(Choice_Lib.button,255,127,1000,FALSE);

  return Choice_Lib.choice_box[i].point_at;
 }

 return NO_CHOICE;
}

///////////////////////////////////////////////////////////////////////
/*
void init_obj_actor()
{
 int i;

 Init_Actor_Lib(300,300,300,300,700,500,60,10,"兰特","pic/win01.bmp");
 Init_Actor_Lib(200,200,200,200,500,300,20,5,"拉菲","pic/win02.bmp");
 Init_Actor_Lib(300,300,300,300,600,200,20,6,"克莉斯","pic/win03.bmp");


 RPG_Team.money=7500;
 //Add_Actor(0);
 Add_Actor(1);
 Add_Actor(2);



 Init_Object_Lib(250,0,0,0,0,OBJ_UNNEED,"月兔之灵丹","pic/obj1.bmp");
 Init_Object_Lib(100,100,0,0,0,OBJ_UNNEED,"星之甘露","pic/obj2.bmp");
 Init_Object_Lib(0,0,0,0,0,OBJ_NEED,"林心如照片","pic/obj3.bmp");

 Add_Object(0,10);
 Add_Object(1,20);
 Add_Object(2,1);


} */


/*初始化窗体系统*/
void Init_GUI()
{
 Init_Choice_Lib(16,32,32,6);
 Init_Choice_Lib(220,32,32,13);
 Init_Choice_Lib(220,48,150,3);
 Init_Choice_Lib(145,200,32,3);
 Init_Choice_Lib(235,200,32,2);
 Init_Choice_Lib(32,32,32,4);
 Init_Choice_Lib(0,32,48,3);
}

///////////////////////////////////////////////////////////////////////

/*选择主角使用物品页面*/
void ChooseActor()
{
 int i;
 char str[20],choice;

 Draw_Window(32,0,19,15);
 Draw_Window(0,0,6,8);

 for(i=0;i<RPG_Team.max_actor_num;i++)
 {
  QPutImage(300,i*150+32,Actor_Lib.actor[RPG_Team.actor_num[i]].photo);

  shadow_puts(Actor_Lib.actor[RPG_Team.actor_num[i]].name,370,i*150+32,WHITE);

  sprintf(str,"等级:%d",Actor_Lib.actor[RPG_Team.actor_num[i]].grade);
  shadow_puts(str,370,i*150+64,WHITE);

  sprintf(str,"HP:%d/%d",Actor_Lib.actor[RPG_Team.actor_num[i]].hp,Actor_Lib.actor[RPG_Team.actor_num[i]].max_hp);
  shadow_puts(str,370,i*150+96,WHITE);

  sprintf(str,"MP:%d/%d",Actor_Lib.actor[RPG_Team.actor_num[i]].mp,Actor_Lib.actor[RPG_Team.actor_num[i]].max_mp);
  shadow_puts(str,520,i*150+96,WHITE);

  sprintf(str,"攻击:%d",Actor_Lib.actor[RPG_Team.actor_num[i]].attack);
  shadow_puts(str,370,i*150+128,WHITE);

  sprintf(str,"防御:%d",Actor_Lib.actor[RPG_Team.actor_num[i]].defence);
  shadow_puts(str,520,i*150+128,WHITE);
 }

 sprintf(str,"%s /%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].name,RPG_Team.object_hm[Choice_Lib.choice_box[1].point_at]);
 shadow_puts(str,32,32,WHITE);

 sprintf(str,"加生命:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_hp);
 shadow_puts(str,32,64,WHITE);

 sprintf(str,"加魔法:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_mp);
 shadow_puts(str,32,96,WHITE);

 sprintf(str,"加攻击:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_attack);
 shadow_puts(str,32,128,WHITE);

 sprintf(str,"加防御:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_defence);
 shadow_puts(str,32,160,WHITE);

 sprintf(str,"加经验:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_exp);
 shadow_puts(str,32,192,WHITE);

 choice=Choice_Box(2);
 if(choice!=NO_CHOICE&&RPG_Team.actor_num[choice]!=NO_ACTOR)
 {
  Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].hp+=Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_hp;
  if(Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].hp>Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].max_hp)
    Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].hp=Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].max_hp;
  Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].mp+=Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_mp;
  if(Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].mp>Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].max_mp)
    Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].mp=Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].max_mp;
  Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].attack+=Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_attack;
  Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].defence+=Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_defence;
  Actor_Lib.actor[RPG_Team.actor_num[Choice_Lib.choice_box[2].point_at]].exp+=Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_exp;

  RPG_Team.object_hm[Choice_Lib.choice_box[1].point_at]--;
  if(RPG_Team.object_hm[Choice_Lib.choice_box[1].point_at]==0)
  {
   RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]=NO_OBJECT;
   Window.show=USE_OBJECT;
  }
 }

 if(key[KEY_Z])
 {
  PressKey(KEY_Z);
  Window.show=USE_OBJECT;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);
 }
}


/*显示物品页面*/
void UseObject()
{
 int i;
 char str[20];

 Draw_Window(32,0,19,15);
 Draw_Window(0,0,5,5);
 Draw_Window(0,160,6,7);

 for(i=0;i<13;i++)
 {
  if(RPG_Team.object_num[i]==NO_OBJECT)
  {
   shadow_puts("[没有物品]",300,32*i+31,LIGHTGRAY);
  }
  else if(Object_Lib.object[RPG_Team.object_num[i]].usage==OBJ_NEED)
  {
   shadow_puts(Object_Lib.object[RPG_Team.object_num[i]].name,300,32*i+31,LIGHTGRAY);

   sprintf(str,"/%d",RPG_Team.object_hm[i]);
   shadow_puts(str,500,32*i+31,LIGHTGRAY);
  }
  else
  {
   shadow_puts(Object_Lib.object[RPG_Team.object_num[i]].name,300,32*i+31,WHITE);

   sprintf(str,"/%d",RPG_Team.object_hm[i]);
   shadow_puts(str,500,32*i+31,WHITE);
  }
 }

 if(RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]!=NO_OBJECT)
 {
  QPutImage(32,32,Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].photo);

  sprintf(str,"加生命:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_hp);
  shadow_puts(str,32,192,WHITE);

  sprintf(str,"加魔法:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_mp);
  shadow_puts(str,32,224,WHITE);

  sprintf(str,"加攻击:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_attack);
  shadow_puts(str,32,256,WHITE);

  sprintf(str,"加防御:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_defence);
  shadow_puts(str,32,288,WHITE);

  sprintf(str,"加经验:%d",Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].add_exp);
  shadow_puts(str,32,320,WHITE);
 }

 if(Choice_Box(1)!=NO_CHOICE)
 {
  if(RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]!=NO_OBJECT&&Object_Lib.object[RPG_Team.object_num[Choice_Lib.choice_box[1].point_at]].usage!=OBJ_NEED)
  {
   Window.show=CHOOSE_ACTOR;
  }
 }

 if(key[KEY_Z])
 {
  PressKey(KEY_Z);
  Window.show=SHOW_STATUS;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);
 }

}


/*显示帮助页面*/
void ShowHelp()
{
 Draw_Window(128,128,15,3);

 shadow_puts("D:菜单    X:确认    Z:返回    F1:恢复显示模式",160,168,WHITE);

 if(key[KEY_Z])
 {
  PressKey(KEY_Z);
  Window.show=SHOW_STATUS;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);
 }
}


/*显示系统页面*/
void ShowSystem()
{
 Draw_Window(128,160,5,5);

 shadow_puts("储存",210,200,LIGHTGRAY);
 shadow_puts("读取",210,232,LIGHTGRAY);
 shadow_puts("退出",210,264,WHITE);

 if(Choice_Box(3)==2)
 {
  Window.show=ASK_QUIT;
 }

 if(key[KEY_Z])
 {
  PressKey(KEY_Z);
  Window.show=SHOW_STATUS;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);
 }
}


/*询问是否退出的页面*/
void AskQuit()
{
 Draw_Window(192,128,8,5);

 shadow_puts("真的要退出吗,记着存盘哦",224,160,RED);
 shadow_puts("再待一会!",300,200,WHITE);
 shadow_puts("要学习了!",300,232,WHITE);

 switch(Choice_Box(4))
 {
  case 0:Window.show=SHOW_STATUS;break;
  case 1:Window.state=WIN_OFF;GameFlag=GAMEQUIT;break;
  default:;
 }

 if(key[KEY_Z])
 {
  PressKey(KEY_Z);
  Window.show=SHOW_STATUS;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);
 }
}


/*显示状态页面*/
void ShowStatus()
{
 char str[30];
 int i;

 Draw_Window(32,0,19,15);
 Draw_Window(0,0,5,8);
 Draw_Window(0,320,5,5);

 for(i=0;i<RPG_Team.max_actor_num;i++)
 {
  QPutImage(200,i*150+32,Actor_Lib.actor[RPG_Team.actor_num[i]].photo);

  shadow_puts(Actor_Lib.actor[RPG_Team.actor_num[i]].name,270,i*150+32,WHITE);

  sprintf(str,"等级:%d",Actor_Lib.actor[RPG_Team.actor_num[i]].grade);
  shadow_puts(str,300,i*150+64,WHITE);

  sprintf(str,"HP:%d/%d",Actor_Lib.actor[RPG_Team.actor_num[i]].hp,Actor_Lib.actor[RPG_Team.actor_num[i]].max_hp);
  shadow_puts(str,300,i*150+96,WHITE);

  sprintf(str,"MP:%d/%d",Actor_Lib.actor[RPG_Team.actor_num[i]].mp,Actor_Lib.actor[RPG_Team.actor_num[i]].max_mp);
  shadow_puts(str,450,i*150+96,WHITE);

  sprintf(str,"攻击:%d",Actor_Lib.actor[RPG_Team.actor_num[i]].attack);
  shadow_puts(str,300,i*150+128,WHITE);

  sprintf(str,"防御:%d",Actor_Lib.actor[RPG_Team.actor_num[i]].defence);
  shadow_puts(str,450,i*150+128,WHITE);
 }

 sprintf(str,"金钱:%d",RPG_Team.money);
 shadow_puts(str,32,392,WHITE);

 shadow_puts("物品",82,32,WHITE);
 shadow_puts("装备",82,64,LIGHTGRAY);
 shadow_puts("魔法",82,98,LIGHTGRAY);
 shadow_puts("帮助",82,130,WHITE);
 shadow_puts("系统",82,162,WHITE);
 shadow_puts("返回",82,194,WHITE);

 if(key[KEY_Z])
 {
  PressKey(KEY_Z);
  Window.state=WIN_OFF;

  play_sample(Choice_Lib.button,255,127,1000,FALSE);
 }

 switch(Choice_Box(0))
 {
  case 0:Window.show=USE_OBJECT;break;
  case 3:Window.show=SHOW_HELP;break;
  case 4:Window.show=SHOW_SYSTEM;break;
  case 5:Window.state=WIN_OFF;break;
 }
}


///////////////////////////////////////////////////////////////////////

/*窗体系统的总循环*/
void Win_Loop()
{
 Window.state=WIN_ON;

 while(Window.state==WIN_ON)
 {
  switch(Window.show)
  {
   case SHOW_STATUS: clrscreen(BLUE);ShowStatus();break;
   case USE_OBJECT: clrscreen(BLUE);UseObject();break;
   case CHOOSE_ACTOR: clrscreen(BLUE);ChooseActor();break;
   case SHOW_HELP:ShowHelp();break;
   case SHOW_SYSTEM:ShowSystem();break;
   case ASK_QUIT:clrscreen(BLUE);AskQuit();break;
   default:;
  }

  /*按F1重新图形初试化,任何时候都有效*/
  if(key[KEY_F1]){set_color_depth(16);set_gfx_mode(GFX_AUTODETECT,640,480,0,0);}

  /*延时显示缓冲区内容*/
  while(Timercounter<1);
  Timercounter=0;
  vpost();
 }
}


⌨️ 快捷键说明

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