input.c

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

C
148
字号
#include <CsAgb.h>
#include <rb_stdio.h>
#include <graph.h>
#include <rbasic.h>
#include <rb_string.h>
#include <rb_mem.h>
#define mVSV (u16 *) 0x06012C00

const char inp_ENG[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char inp_eng[]="abcdefghijklmnopqrstuvwxyz";
const char inp_num[]="0123456789.E+-*/=^";
const char inp_sbl[]="{}()[]:;\"',.!?<>#$@%&~`|_\\  ";
extern u32 TM_CN;//时钟遍数器
extern void (*sys_deamon)();
extern void wait(u32 count);
void rin_deamon()
{
   r_box(rb_xp*8,rb_yp*10+2,rb_xp*8+8,rb_yp*10+9,0,5);
}

void rb_input(char *str,u8 type)
{
   char *inp[4]={inp_ENG,inp_eng,inp_num,inp_sbl};
   u8 num[4]={26,26,18,28};
   u8 tp=0;
   u8 sel=type?2:0;
   u8 get=0;
   u8 old=0;
   u8 done=1;
   u8 lp,len=str_len(str);
   u8 xp=rb_xp,yp=rb_yp;
   u32 loc=rb_yp>13?1:0;
   int i;
   u16 *vsv;
   lp=len;
   vsv=(u16 *)new_malloc(6*1024);
   CS_BackupScreenMem(&gScreen,0,148-loc*40,239,159-loc*40,mVSV,MODE_3);
   RBprint(str);
   sys_deamon=rin_deamon;
   while (1)
   {
      readkey();
      if (CS_IsKeyDown(KEY_LEFT))
      {
         done=2;
         get=(get+num[sel]-1)%num[sel];
      }
      else if (CS_IsKeyDown(KEY_RIGHT))
      {
         done=2;
         get=(get+1)%num[sel];
      }
      else if (CS_IsKeyHold(KEY_UP) && CS_IsKeyDown(KEY_L))
      {
         done=1;
         sel=(sel+3)%4;
      }
      else if (CS_IsKeyHold(KEY_UP) && CS_IsKeyDown(KEY_R))
      {
         done=1;
         sel=(sel+1)%4;
      }
      else if (CS_IsKeyDown(KEY_UP))
      {
         done=2;
         get=get>5?(get-5):num[sel]-1;
      }
      else if(CS_IsKeyDown(KEY_DOWN))
      {
         done=2;
         get=(get+5)%num[sel];
      }
      else if(CS_IsKeyDown(KEY_L))
      {
         if (lp)
         {
            done=3;
            lp=lp-1;
         }
      }
      else if(CS_IsKeyDown(KEY_R))
      {
         if (lp<len)
         {
            done=3;
            lp=lp+1;
         }
      }
      else if (CS_IsKeyDown(KEY_A)) done=4;
      else if (CS_IsKeyDown(KEY_B)) done=5;
      else if (CS_IsKeyDown(KEY_START)) done=6;
      switch(done)
      {
         case 1://转换字符集
         get=0;
         old=0;
         Q_box(0,148-loc*40,239,159-loc*40,RGB(3,7,15),1);
         for (i=0;i<num[sel];i++)
         paint_eng(1+i*8,149-loc*40,RGB(30,30,30),inp[sel][i]);
         r_box(get*8,149-loc*40,get*8+9,159-loc*40,0,5);
         done=0;
         break;
         case 2://
         r_box(old*8,149-loc*40,old*8+9,159-loc*40,0,5);
         r_box(get*8,149-loc*40,get*8+9,159-loc*40,0,5);
         if (get==old) r_box(get*8,149-loc*40,get*8+9,159-loc*40,0,5);
         done=0;
         old=get;
         case 3://
         sys_deamon=NULL;
         rb_xp=xp;
         rb_yp=yp;
         RBprint(str);
         RBprint("  ");
         sys_deamon=rin_deamon;
         rb_xp=(xp+lp)%30;
         rb_yp=yp+(xp+lp)/30;
         done=0;
         break;
         case 4://加入字符
         for(i=len+1;i>lp;i--) str[i]=str[i-1];
         str[lp]=inp[sel][get];
         lp++;
         len=str_len(str);
         done=3;
         break;
         case 5://删除
         if (lp==0) break;
         for (i=lp-1;i<len;i++) str[i]=str[i+1];
         lp--;
         len=str_len(str);
         done=3;
         break;
         case 6://end
         sys_deamon=NULL;
         rb_xp=xp;
         rb_yp=yp;
         CS_RestoreScreenMem(&gScreen,0,148-loc*40,239,159-loc*40,mVSV,MODE_3);
         new_free(vsv);
         RBprint(str);
         return;
         default:
         break;
      }
   }
}

⌨️ 快捷键说明

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