?? fanpai.cpp
字號:
#pragma warning(disable:4091)
#define STRY_POSITION 250
#define STRX_POSITION 360
#define UP_KEY 0x01
#define DOWN_KEY 0x02
#define ENTER_KEY 0x0d
#ifdef __cplusplus
extern "C"{
#endif
#include"efi.h"
#include"efilib.h"
//#include <time.h>
//#include <malloc.h>
#include "GraphicsPrint.h"
//#include"Hii\Hii.h"
#include"ConsoleControl\ConsoleControl.h"
EFI_UGA_DRAW_PROTOCOL *UgaDraw;
EFI_STATUS
ShowPng(
IN char *FileName, IN int Sx, IN int Sy, IN int Dx, IN int Dy );
void
GetPngWidth(
char *FileName,
int *Width,
int *Height);
#ifdef __cplusplus
}
#endif
bool FlagExit=0;
#include"fanpai.h"
//全局的
FanPaiUi *FanPai;
KeyBoard *HandleKey;
EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;
void
MainFanPai();
void *operator new (UINTN Size){
EFI_STATUS Status;
void * Pointer;
Status=BS->AllocatePool(EfiBootServicesData,Size,&Pointer);
if(EFI_ERROR(Status))
return 0;
return Pointer;
}
void operator delete(void * Pointer)
{
if(BS)
BS->FreePool(Pointer);
}
VOID
SwitchGraphicsMode(UINTN Mode);
//EFI_GUID HiiProtocolGuid=EFI_HII_PROTOCOL_GUID;
//EFI_HII_PROTOCOL *Hii;
void
AdjustXy(
IN UINTN Width, //a picture width
IN UINTN Height,//a picture Height
OUT UINTN *StartX,
OUT UINTN *StartY
);
EFI_STATUS
FanPaiEntry(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
UINTN StartX,StartY;
int Width,Height;
//int SrandNo;
//int i;
InitializeLib(ImageHandle,SystemTable);
InitializeLibC(ImageHandle,SystemTable);
InitiaFanPaiInterface();
//AdjustXy(100,100,&StartX,&StartY);
FanPai=new FanPaiUi;
HandleKey=new KeyBoard;
//FanPaiUi FanPai;
//time(0);
//#ifdef __JackeXu_Debug__
// Print(L"Jackesssddd");
//#endif
//隨機(jī)函數(shù)
//srand(6);
//randomize();
//產(chǎn)生0--10
//srand(time((time_t *)NULL));
//for(i=0;i<10;i++)
//{
//SrandNo=rand()%10;
//randomize();
//Print(L"%d ",SrandNo);
//}
SwitchGraphicsMode(1);
Status=UgaDraw->Blt(UgaDraw,&mEfiColors[2],EfiUgaVideoFill,0,0,0,0,800,600,0);
if(EFI_ERROR(Status)){
Print(L"%r",Status);
}
//GetPngWidth("Title01.png",&Width,&Height);
//printf("%d %d ",Width,Height);
for(;;){
FanPai->ShowUiPicture("Title01.png",0,0,800/2-640/2,600/2-480/2);
FanPai->ShowUiString();
//MainFanPai();
while(1){
HandleKey->WaitForPressKey();
HandleKey->ReadKey();
Status=HandleKey->SwitchKey();
if(Status==0x100)
break;
else if(Status==0x101){
FanPai->Exit();
return EFI_SUCCESS;
}
//if(FlagExit==1)
//goto
FanPai->MoveUiMenu();
}
}
//HandleKey->ReadKey();
//printf("jackexu\n");
//BS->Stall(10000);
//ShowPng("Title01.png",0,0,StartX,StartY);
//ShowPng("background.png",0,0,100,100);
//FanPai 是指向?qū)ο蟮闹羔?
delete FanPai;
delete HandleKey;
return EFI_SUCCESS;
}
//find protocol and set center point
/*void
AdjustXy(
IN UINTN Width, //a picture width
IN UINTN Height,//a picture Height
OUT UINTN *StartX,
OUT UINTN *StartY
)
{
Status=UgaDraw->GetMode(UgaDraw,&SizeOfX,&SizeOfY,&ColorDepth,&RefreshRate);
if(EFI_ERROR(Status))
return ;
//printf("%d %d %d %d \n",SizeOfX,SizeOfY,ColorDepth,RefreshRate);
*StartX=(SizeOfX-Width)/2;
*StartY=(SizeOfY-Height)/2;
}
*/
//define class
FanPaiUi::FanPaiUi()
{
printf("\ndsddsdsdd\n");
MenuIndex=0;
PreLightMenu=0;
}
FanPaiUi::~FanPaiUi()
{
//printf("jacke\n");
printf("\n finish over\n");
}
void FanPaiUi::ShowUiPicture(char *FileName,int Sx,int Sy,int Dx,int Dy)
{
printf("test showpictureui");
ShowPng(FileName,Sx,Sy,Dx,Dy);
}
int NoIndex[16]={-1};
//int No1Index[16]={-1};
int RandPanel[16];
int CardIndex[16];
int CardPosition[16];
void FanPaiUi::NewGame()
{
//UgaDraw-Blt
int i,j,RanData;
FanPai->ShowUiPicture("background.png",0,0,800/2-640/2,600/2-480/2);
//產(chǎn)生隨機(jī)數(shù)的種子
srand(time(0));
for(i=0;i<8;i++){
//產(chǎn)生8個0----18的數(shù)字
RanData=rand()%18;
//把這8個數(shù)字保存起來
NoIndex[i]=RanData;
for(j=0;j<i;j++){
if(RanData==NoIndex[j]){
//重新產(chǎn)生隨機(jī)數(shù)
RanData=rand()%18;
NoIndex[i]=RanData;
//讓j=0,重新比較
j=-1;
}
}
CardIndex[2*i]=RanData;
CardIndex[i+8]=RanData;
//GraphicsPrintAt(UgaDraw,10+i*100,10,0,0,L"NoIndex %d,%d ",2*i,CardIndex[2*i]);
//GraphicsPrintAt(UgaDraw,10+i*100,30,0,0,L"NoIndex %d,%d ",2*i+1,CardIndex[2*i+1]);
}
for(i=0;i<16;i++){
RanData=rand()%16;
NoIndex[i]=RanData;
//for(;;){
for(j=0;j<i;j++){
if(RanData==NoIndex[j]){
RanData=rand()%16;
NoIndex[i]=RanData;
j=-1;
}
}
//NoIndex[i]=RanData;
CardPosition[i]=NoIndex[i];
}
for(i=0;i<16;i++){
GraphicsPrintAt(UgaDraw,10+i*20,10,0,0,L"%d ",CardIndex[i]);
}
for(i=0;i<16;i++)
GraphicsPrintAt(UgaDraw,10+i*20,50,0,0,L"%d ",CardPosition[i]);
for(i=0;i<16;i++)
RandPanel[CardPosition[i]]=CardIndex[i];
for(i=0;i<16;i++)
GraphicsPrintAt(UgaDraw,10+i*20,100,0,0,L"%d ",RandPanel[i]);
}
void FanPaiUi::Help(){
UgaDraw->Blt(UgaDraw,&mEfiColors[6],EfiUgaVideoFill,0,0,250,100,250,250,0);
///printf("Help Information that you can write by yourself");
}
void FanPaiUi::Exit(){
SwitchGraphicsMode(0);
//FlagExit=1;
}
void FanPaiUi::Difficuty(){
}
void FanPaiUi::ShowUiString()
{
//if(MenuIndex)
int i;
for(i=0;i<NumMenu;i++)
{
if(i==PreLightMenu)
GraphicsPrintAt(UgaDraw,STRX_POSITION ,STRY_POSITION+i*19,&mEfiColors[15],&mEfiColors[4],MenuStr[i]);
else
GraphicsPrintAt(UgaDraw,STRX_POSITION,STRY_POSITION+i*19,&mEfiColors[15],&mEfiColors[7],MenuStr[i]);
}
}
void FanPaiUi::MoveUiMenu()
{
if(HandleKey->Key.UnicodeChar!=0xd){
GraphicsPrintAt(UgaDraw,STRX_POSITION,STRY_POSITION+PreLightMenu*19,&mEfiColors[15],&mEfiColors[7],MenuStr[PreLightMenu]);
GraphicsPrintAt(UgaDraw,STRX_POSITION ,STRY_POSITION+MenuIndex*19,&mEfiColors[15],&mEfiColors[4],MenuStr[MenuIndex]);
}
}
void FanPaiUi::ShowHiddenCard()
{
}
//
KeyBoard::KeyBoard()
{
Key.ScanCode=0;
Key.UnicodeChar=0;
}
KeyBoard::~KeyBoard()
{
}
void KeyBoard::ReadKey()
{
ST->ConIn->ReadKeyStroke(ST->ConIn,&Key);
Print(L"%x",Key.ScanCode);
}
void KeyBoard::WaitForPressKey()
{
Key.ScanCode=0;
WaitForSingleEvent(ST->ConIn->WaitForKey,0);
}
int KeyBoard::SwitchKey(){
if(Key.ScanCode==UP_KEY){
FanPai->PreLightMenu=FanPai->MenuIndex;
FanPai->MenuIndex--;
if(FanPai->MenuIndex<0)
FanPai->MenuIndex=NumMenu-1;
//SwitchGraphicsMode(0);
Print(L"\n \n x%d x%d ",FanPai->PreLightMenu,FanPai->MenuIndex);
}
else if(Key.ScanCode==DOWN_KEY){
FanPai->PreLightMenu=FanPai->MenuIndex;
FanPai->MenuIndex++;
if(FanPai->MenuIndex>NumMenu-1)
FanPai->MenuIndex=0;
}
else if(Key.ScanCode==0x17)
//MainFanPai();
return 0x100;
else if(Key.UnicodeChar==ENTER_KEY)
{
switch(FanPai->MenuIndex){
case 0:
FanPai->NewGame(); break;
case 1:
FanPai->Difficuty();break;
case 2:
FanPai->Help();break;
case 3:
// SwitchGraphicsMode(0);
return 0x101;
//break;
}
}
}
VOID
SwitchGraphicsMode(UINTN Mode)
{
if(Mode){
ConsoleControl->SetMode(ConsoleControl,EfiConsoleControlScreenGraphics);
}
else
ConsoleControl->SetMode(ConsoleControl,EfiConsoleControlScreenText);
}
EFI_STATUS
InitiaFanPaiInterface()
{
EFI_STATUS Status;
UINTN NoHandle;
EFI_HANDLE *HandleBuffer;
EFI_HANDLE UgaHandle;
UINTN Index;
//UINTN SizeOfX,SizeOfY,ColorDepth,RefreshRate;
EFI_GUID gConsoleControlProtocolGuid=EFI_CONSOLE_CONTROL_PROTOCOL_GUID;
Status=BS->LocateHandleBuffer(ByProtocol,&UgaDrawProtocol,NULL,&NoHandle,&HandleBuffer);
if(EFI_ERROR(Status))
return Status;
for(Index=0;Index<NoHandle;Index++){
Status=BS->HandleProtocol(HandleBuffer[Index],&DevicePathProtocol,(VOID **)&UgaDraw);
if(!EFI_ERROR(Status)){
UgaHandle=HandleBuffer[Index];
break;
}
}
BS->FreePool(HandleBuffer);
Status=BS->HandleProtocol(UgaHandle,&UgaDrawProtocol,(VOID **)&UgaDraw);
if(EFI_ERROR(Status))
return Status;
//Status=BS->LocateProtocol(&HiiProtocolGuid,NULL,(VOID **)&Hii);
//if(EFI_ERROR(Status))
//return Status;
Status=BS->LocateProtocol(&gConsoleControlProtocolGuid,NULL,(VOID **)&ConsoleControl);
if(EFI_ERROR(Status))
return Status;
return EFI_SUCCESS;
}
/*void
MainFanPai()
{
FanPai->ShowUiPicture("Title01.png",0,0,800/2-640/2,600/2-480/2);
FanPai->ShowUiString();
while(1){
HandleKey->WaitForPressKey();
HandleKey->ReadKey();
HandleKey->SwitchKey();
if(FlagExit==1)
break;
FanPai->MoveUiMenu();
}
}*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -