text.c

来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 673 行 · 第 1/2 页

C
673
字号
#include <CsAgb.h>
#include <math.h>
#include <rb_stdio.h>
#include <graph.h>
#include <Qgraph.h>
#include <rb_mem.h>
#include <string.h>
#define mVRAM (u16 *) 0x06000000
#define plines 10 //每页显示行数
#define TEXT_DAT 0x06012C00 //用于存放文本数据
extern void show_float(double x,u16 color);
extern void paint_dre(u8 xp,u8 yp,u16 color,u8 ch);
extern void txt_set(u16 *M);//文本浏览设置
extern void txt_get(u16 *M);
extern u8 rb_yp,is_basic_run;
extern u32 _fid,_iid,_line;
extern void new_scroll(u32 lc,u32 len);
const u16 tit_co[]={
28164,27106,27106,27107,27107,27107,28164,28164,28197,28197,29222,29255,
29255,30312,30312,30345};
extern void win_plate(char *tit,char *mes,u16 bg);
extern char _file[40];
extern void title(char *);
extern int menu(char *items,int n);
const char text_menus[4][15]={"1.文本阴影","2.书签设置","3.帮助说明","4.字体设置",};
const char font_menus[3][15]={"1.更改模式","2.选择字体","3.字距设置"};
const char text_helps[]=
"文本操作说明:
===============================
您可以通过方向键控制浏览内容:
LEFT  :向前换行
RIGHT :向后换行
UP    :向上翻页
DOWN  :向下翻页
A     :下一页
START :浏览设置
SELECT:快速转页
B     :退出浏览

组合键功能:
L+LEFT :向上换行(连续)
L+RIGHT:向下换行(连续)
L+UP   :向上翻页(连续)
L+DOWN :向下翻页(连续)
L+R    :帮助说明
L+A    :字体设置
L+B    :启用/取消文本阴影
R+A    :保存书签
R+B    :启用/取消自动滚屏
R+UP   :自动滚屏速度加
R+DOWN :自动滚屏速度减
R+LEFT :调用系统配色方案
R+RIGHT:调用系统配色方案
===============================
浏览设置:
进入浏览设置后,你可以更改字体和背景颜色。
LEFT :颜色分量减
RIGHT:颜色分量增
UP   :选择颜色分量
DOWN :选择颜色分量";
char is_in_text_help=0;
extern void (*sys_deamon)();
extern void show_obj(int xp,int yp);
extern void myobj_new_str(char *str,u8 step);
const u16 text_colors[]={
   RGB(30,30,30),0,
   0,RGB(30,30,30),
   RGB(3,7,15),RGB(30,30,30),
   RGB(30,30,30),RGB(3,7,15),
   RGB(30,30,30),RGB(30,0,0),
   RGB(30,0,0),RGB(30,30,30)
};

extern void list_bmark(u8 bg,u8 act);
extern u8 find_bmark(u32 fid);
extern u8 rb_xp,rb_yp,rb_error;
extern void autop_set(u8 *M,u8 act);
void show_speed(u8 speed)
{
   const char ch[]="0123456789ABCDEF";
   char str[16]="SPEED:";
   char aa[2]="0\0";
   aa[0]=ch[speed];
   strcat(str,aa);
   myobj_new_str(str,1);
   show_obj(30,100);
   rb_error=5;
}
extern u32 TM_CN;

void text_deamon()
{
   rb_yp=(rb_yp+1)%(1+rb_xp);
   if (TM_CN%4==0) auto_bmark();
   if (rb_error) rb_error--;
   if (rb_error==0) hiden_myobj();
}

struct text_line
{
   u32 add;
   struct text_line *next;//下一行
   struct text_line *pre;//上一行
};

void text(char *text,u16 color,u16 bg,u32 *sav);//文本显示
void text_help()
{
   u32 *sav=(u32 *)new_malloc(1024);
   is_in_text_help=1;
   text(text_helps,RGB(30,30,30),RGB(15,15,15),sav);
   is_in_text_help=0;
   new_free(sav);
}
void show_txt_num(u8 xp,u8 yp,u16 color,u16 page)
{
   char str[5];
   int i;
   for (i=0;i<3;i++)
   {
      str[2-i]=page%10+48;
      page=page/10;
   }
   str[3]='\0';
   cwrite(xp,yp,color,str);
}
void text_set_show(u8 *co,u8 *bg,u8 op,u8 loc)
{
   u8 *p;
   int i;
   r_box(23,41,197,54,RGB(bg[0],bg[1],bg[2]),1);
   if (op)
   {
      cwrite(25,43,RGB(co[0],co[1],co[2]),"您现在正在更改字体颜色");
      p=co;
   }
   else
   {
      cwrite(25,43,RGB(co[0],co[1],co[2]),"您现在正在更改背景颜色");
      p=bg;
   }
   r_box(51,61,171,72,RGB(7,14,21),1);
   r_box(51,76,171,87,RGB(7,14,21),1);
   r_box(51,91,171,102,RGB(7,14,21),1);
   r_box(51,61,51+p[0]*4,72,RGB(p[0],0,0),1);
   r_box(51,76,51+p[1]*4,87,RGB(0,p[1],0),1);
   r_box(51,91,51+p[2]*4,102,RGB(0,0,p[2]),1);
   for (i=0;i<3;i++)
   {
      r_box(30,60+i*15,43,73+i*15,RGB(30,30,30),0);
      if (i==loc) r_box(31,61+i*15,42,72+i*15,RGB(30,30,0),1);
      else r_box(31,61+i*15,42,72+i*15,RGB(7,14,21),1);
   }
}
void color_3d(u16 color,u8 *co)
{
   u16 ms0=0x7C00;
   u16 ms1=0x3E0;
   u16 ms2=0x1F;
   co[2]=(color&ms0)>>10;
   co[1]=(color&ms1)>>5;
   co[0]=color&ms2;
}
void text_set(u16 *color)
{
   u8 co[3]={30,30,30};
   u8 bg[3]={0,9,16};
   u8 i;
   u8 op=1;
   u8 *p=co;
   u8 done=1;
   u8 loc=0;
   color_3d(color[0],co);
   color_3d(color[1],bg);
   r_box(21,21,201,141,0,0);
   r_box(20,20,200,140,RGB(30,30,30),0);
   r_box(21,21,199,36,RGB(3,7,15),1);
   //for (i=0;i<179;i++)
   //r_line(i+21,21,i+21,36,RGB(3+i*0.1125,7+i*96/1000,15+i*625/10000),1);
   cwrite(22,24,RGB(30,30,30),"文本浏览设置");
   r_box(21,37,199,139,RGB(7,14,21),1);
   cwrite(22,125,RGB(30,30,30),"SELECT健:切换 START健:重置");
   cwrite(22,110,RGB(30,30,30),"A     健:应用 B    健:退出");
   r_box(22,40,198,55,RGB(30,30,30),0);
   r_box(23,41,197,54,RGB(bg[0],bg[1],bg[2]),1);
   cwrite(25,42,RGB(co[0],co[1],co[2]),"现在正在更改字体颜色");
   r_box(50,60,172,73,RGB(30,30,30),0);
   r_box(50,75,172,88,RGB(30,30,30),0);
   r_box(50,90,172,103,RGB(30,30,30),0);
   while (1)
   {
      readkey();
      if(CS_IsKeyDown(KEY_LEFT) || CS_IsKeyHold(KEY_L))
      {
         if (p[loc]>0) p[loc]--;
         else p[loc]=30;
         done=1;
      }
      else if(CS_IsKeyDown(KEY_RIGHT) || CS_IsKeyHold(KEY_L))
      {
         if (p[loc]<30) p[loc]++;
         else p[loc]=0;
         done=1;
      }
      else if(CS_IsKeyDown(KEY_UP))
      {
         if(loc>0) loc--;
         else loc=2;
         done=1;
      }
      else if(CS_IsKeyDown(KEY_DOWN))
      {
         if(loc<2) loc++;
         else loc=0;
         done=1;
      }
      else if(CS_IsKeyDown(KEY_SELECT))
      {
         op=!op;
         done=1;
         if (op) p=co;
         else p=bg;
      }
      else if(CS_IsKeyDown(KEY_A))
      {
         color[0]=RGB(co[0],co[1],co[2]);
         color[1]=RGB(bg[0],bg[1],bg[2]);
         txt_set(color);
         return;
      }
      else if(CS_IsKeyDown(KEY_B)) return;
      else if(CS_IsKeyDown(KEY_START))
      {
         color_3d(RGB(30,30,30),co);
         color_3d(RGB(0,9,16),bg);
         done=1;
      }
      if (done)
      {
         text_set_show(co,bg,op,loc);
         done=0;
      }
   }
}

u32 quik_page(u32 lines,u32 nowline)//快速换页
{
   u8 done=1;
   u8 loc=0;
   u32 pages,now;
   u16 i;
   pages=lines/plines;
   if (pages*plines<lines) pages++;
   now=nowline/plines;
   //u8 i;
   r_box(21,21,201,141,0,0);
   r_box(20,20,200,140,RGB(30,30,30),0);
   r_box(21,21,199,36,RGB(3,7,15),1);
   //for (i=0;i<179;i++)
   //r_line(i+21,21,i+21,36,RGB(3+i*0.1125,7+i*96/1000,15+i*625/10000),1);
   cwrite(22,23,RGB(30,30,30),"快速翻页");
   r_box(21,37,199,139,RGB(7,14,21),1);
   r_line(20,36,200,36,RGB(30,30,30),1);
   cwrite(22,40,RGB(30,30,30),"转到第");
   show_txt_num(60,40,RGB(30,30,0),now+1);
   cwrite(84,40,RGB(30,30,30),"/");
   show_txt_num(93,40,RGB(30,30,30),pages);
   r_box(22,60,198,71,RGB(30,30,30),0);
   Q_box(23,61,197,70,0);
   Q_box(23,61,23.0+174.0*(now+1)/pages,70,RGB(30,30,0));
   cwrite(22,75,RGB(30,30,30),"R   键:末页");
   cwrite(22,88,RGB(30,30,30),"L   键:首页");
   cwrite(22,101,RGB(30,30,30),"A   键:确定");
   cwrite(22,114,RGB(30,30,30),"B   键:取消");
   cwrite(22,127,RGB(30,30,30),"方向键:转页");
   while (1)
   {
      for (i=0;i<8000;i++) CS_ReadKey();
      if (CS_IsKeyHold(KEY_B)) return nowline;
      else if (CS_IsKeyHold(KEY_A)) return now*plines;
      else if (CS_IsKeyHold(KEY_L)) return 0;
      else if (CS_IsKeyHold(KEY_R)) return lines?lines-1:0;
      else if(CS_IsAnyKeyHold(KEY_UP))
      {
         if (now)
         {
            now--;
            done=1;
         }
      }
      else if (CS_IsAnyKeyHold(KEY_DOWN))
      {
         if (now+1<pages)
         {
            done=1;
            now++;
         }
      }
      else if(CS_IsAnyKeyHold(KEY_LEFT))
      {
         if (now>9) now=now-10;
         else now=0;
         done=1;
      }
      else if(CS_IsAnyKeyHold(KEY_RIGHT))
      {
         if (now+11<pages) now=now+10;
         else if (pages) now=pages-1;
         done=1;
      }
      if (done)
      {
         Q_box(60,40,84,49,RGB(7,14,21));
         show_txt_num(60,40,RGB(30,30,0),now+1);
         Q_box(23,61,197,70,15855);
         Q_box(23,61,23.0+174.0*(1+now)/pages,70,30720);
         done=0;
      }
   }
}

u32 text_pre_do(char *text,u32 *sav)//文本预处理
{
   u32 lines=1;
   u32 tp=0;//文本指针
   u8 xp=2;
   u8 lend=0;
   sav[0]=0;
   while (text[tp]!='\0')
   {
      if (text[tp]>127)//汉字
      {
         if (xp>212+6)
         {
            sav[lines]=tp;
            lines++;
            xp=14;

⌨️ 快捷键说明

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