void SpectralEffect::InitInGame()
{
	test.LoadFiles("Data.zip", d3dd);

	while (test.GetProgress() != 100)
	{
		Sleep (100);
	}
	
	string temp[1];
	temp[0] = "YellowBall.png";
	testpipe.SetPipeType(d3dd, 100, 100, 280, 5, 1, temp, 1, "Pipe.png");
	testcannons.InitCannonType(&testpipe, 30, 20, 100, 15, "Cannon.png");
	int time = 0, speed = 1;
	SetFPS(30);
	while (gameRunning)
	{
		StartFrame();
		BeginRender();
		testcannons.Render();
		testpipe.Render();
		EndRender();
		if (time > 500)
		{
			speed ++;
			testpipe.SetSpeed(speed);
			time = 0;
		}
		time ++;
		EndFrame();
	}

	gameRunning = true;
}
Ejemplo n.º 2
0
void CSkeleton::GameInit()
{
	startUp = true;
	gameState->inMenu = false;
	debugMode = false;
	SetFPS(60);
	SetBkMode(graphics,TRANSPARENT);
	loop = 0;
}
Ejemplo n.º 3
0
NaoCamera::NaoCamera(int _id, std::string _name, cv::Size _resolution, float _fps)
{
	id = _id;
	name = _name;
	fps_rate = NULL;

	if(id >= 0)
	{
		cap = new cv::VideoCapture(id);
	}
	else
	{
		cap = new cv::VideoCapture(name);
	}
	SetResolution(_resolution);
	SetFPS(_fps);

}
Ejemplo n.º 4
0
int main ( int argc, char** argv )
{

    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "Unable to init SDL: %s\n", SDL_GetError() );
        return 1;
    }

     atexit(SDL_Quit);

     screen = SDL_SetVideoMode(SCREENW, SCREENH, 32,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( !screen )
    {
        printf("Unable to set 800x600 video: %s\n", SDL_GetError());
        return 1;
    }
	SDL_WM_SetCaption("Szit the Game", NULL);
	if( TTF_Init() == -1 )
    {
		printf("Unable to initialize font");
        return 1;
    }

    font=TTF_OpenFont("tahoma.ttf", 28);
    if(font){printf("Success");}

    // centre the bitmap on screen

	CGameManager manager;

    bool done = false;
    CBlock blockT(0, -1, 0, 0, 0, 1, 0, 0, -1, 100, 100, 100); //t
    blockT.TryTurn();
    blockT.Turn();
    blockT.TryTurn();
    blockT.Turn();

    CBlock blockZ(0, -1,-1,0,-1,0,0,1,0, 198,255,126); //z
    CBlock blockS(0, -1,0,0,0,0,-1,1,-1, 126,196,255); //s
    CBlock blockO(1, 0,0,1,0,0,1,1,1, 100, 100, 0); //o
    CBlock blockI(0, 0,-1,0,0,0,1,0,2, 255,159,126); //i
    CBlock blockJ(0, -1,1,0,1,0,0,0,-1, 139,77,156); //j
    CBlock blockL(0, 0,-1,0,0,0,1,1,1, 255,229,126); //l

    CBlock GameBlock(0, -1, 0, 0, 0, 1, 0, 0, -1, 179,206,221); //creating t
    CBlock NextBlock(0, -1, 0, 0, 0, 1, 0, 0, -1, 179,206,221); //t
    //CBlock GameBlock(0, -1,0,0,0,0,-1,1,-1); //s
    //CBlock GameBlock(0, 0,-1,0,0,0,1,0,2); //i


	CButton start(300, 350, 200, 50, 100, 100, 100, 150, 150, 150, 1, "Start");
	CButton help(300, 425, 200, 50, 100, 100, 100, 150, 150, 150, 0, "Help");
	CButton exit(300, 500, 200, 50, 100, 100, 100, 150, 150, 150, 0, "Exit");
	CButton easy(100, 350, 200, 50, 200, 200, 200, 255, 255, 255, 0, "Easy");
	CButton medium(300, 350, 200, 50, 200, 200, 200, 255, 255, 255, 1, "Medium");
	CButton hard(500, 350, 200, 50, 200, 200, 200, 255, 255, 255, 0, "Hard");
	manager.Refresh(&GameBlock, &NextBlock);
	manager.Refresh(&GameBlock, &NextBlock);


	srand(time(NULL));
			switch(rand()%7){
					case 0: GameBlock.Set(0, -1, 0, 0, 0, 1, 0, 0, -1,179,206,221);break; //t
					case 1: GameBlock.Set(0, -1,-1,0,-1,0,0,1,0, 198,255,126);break; //z
					case 2: GameBlock.Set(0, -1,0,0,0,0,-1,1,-1, 126,196,255);break; //s
					case 3: GameBlock.Set(1, 0,0,1,0,0,1,1,1, 100, 100, 0);break; //o
					case 4: GameBlock.Set(0, 0,-1,0,0,0,1,0,2, 255,159,126);break; //i
					case 5: GameBlock.Set(0, -1,1,0,1,0,0,0,-1, 139,77,156);break; //j
					case 6: GameBlock.Set(0, 0,-1,0,0,0,1,1,1, 255,229,126);break; //l
			}

	srand(time(NULL)+SDL_GetTicks());
			switch(rand()%7){
					case 0: NextBlock.Set(0, -1, 0, 0, 0, 1, 0, 0, -1,179,206,221);break; //t
					case 1: NextBlock.Set(0, -1,-1,0,-1,0,0,1,0, 198,255,126);break; //z
					case 2: NextBlock.Set(0, -1,0,0,0,0,-1,1,-1, 126,196,255);break; //s
					case 3: NextBlock.Set(1, 0,0,1,0,0,1,1,1, 100, 100, 0);break; //o
					case 4: NextBlock.Set(0, 0,-1,0,0,0,1,0,2, 255,159,126);break; //i
					case 5: NextBlock.Set(0, -1,1,0,1,0,0,0,-1, 139,77,156);break; //j
					case 6: NextBlock.Set(0, 0,-1,0,0,0,1,1,1, 255,229,126);break; //l
			}

    // program main loop
    while (!done)
    {
        // message processing loop
        SDL_Event event;
        ++frame;
		SetFPS();
		LastFrame=SDL_GetTicks();

		if(gamestatus==1){manager.Refresh(&GameBlock, &NextBlock);
		}

        while (SDL_PollEvent(&event))
        {
            // check for messages
            switch (event.type)
            {
                // exit if the window is closed
            case SDL_QUIT:
                done = true;
                break;

                // check for keypresses
            case SDL_KEYDOWN:
                {
                    // exit if ESCAPE is pressed
                    if (event.key.keysym.sym == SDLK_ESCAPE)
                        {done = true;}

					if(!gamestatus)
					{
						if(event.key.keysym.sym == SDLK_DOWN){
							if(start.Active()){start.ChangeActivity(); help.ChangeActivity();}else
							if(help.Active()){help.ChangeActivity(); exit.ChangeActivity();}else
							if(exit.Active()){exit.ChangeActivity(); start.ChangeActivity();}
							}
						else if(event.key.keysym.sym == SDLK_UP){
							if(start.Active()){start.ChangeActivity(); exit.ChangeActivity();}else
							if(help.Active()){help.ChangeActivity(); start.ChangeActivity();}else
							if(exit.Active()){exit.ChangeActivity(); help.ChangeActivity();}
						}
						if(event.key.keysym.sym == SDLK_RETURN){
							if(start.Active()){gamestatus=3;}
							else if(help.Active()){gamestatus=5;}
							else if(exit.Active()){done=1;}
						}
					}else
					if(gamestatus==1){
						if(event.key.keysym.sym == SDLK_DOWN){
								manager.MoveBlockDown(&GameBlock, 1);
						}
						if(event.key.keysym.sym == SDLK_SPACE){
								manager.TurnGameBlock(&GameBlock);
						}
						if(event.key.keysym.sym == SDLK_LEFT){
								manager.MoveBlockLeft(&GameBlock);
						}
						if(event.key.keysym.sym == SDLK_RIGHT){
								manager.MoveBlockRight(&GameBlock);
						}
						if(event.key.keysym.sym == SDLK_w){
								manager.SpeedUp();
						}
						if(event.key.keysym.sym ==SDLK_p){
							gamestatus=2;
						}
					}else
					if(gamestatus==2){
						if(event.key.keysym.sym ==SDLK_p){
							gamestatus=1;
						}
					}else
					if(gamestatus==3){
						if(event.key.keysym.sym == SDLK_RETURN){
							if(easy.Active()){manager.SetLevel(1);}else
							if(medium.Active()){manager.SetLevel(2);}else
							if(hard.Active()){manager.SetLevel(3);}
							gamestatus=1;
						}else
						if(event.key.keysym.sym == SDLK_RIGHT){
							if(easy.Active()){easy.ChangeActivity(); medium.ChangeActivity();}else
							if(medium.Active()){medium.ChangeActivity(); hard.ChangeActivity();}else
							if(hard.Active()){hard.ChangeActivity(); easy.ChangeActivity();}
						}else
						if(event.key.keysym.sym == SDLK_LEFT){
							if(easy.Active()){easy.ChangeActivity(); hard.ChangeActivity();}else
							if(medium.Active()){medium.ChangeActivity(); easy.ChangeActivity();}else
							if(hard.Active()){hard.ChangeActivity(); medium.ChangeActivity();}
						}
					}else
					if(gamestatus==4){
							if(event.key.keysym.sym){
									SDL_Delay(1000);
									gamestatus=0;
									manager.ClearGame();
							}
					}else
					if(gamestatus==5){
							if(event.key.keysym.sym){
									gamestatus=0;
							}
					}
                    break;
                }
            } // end switch
         }// end of message processing

        // DRAWING STARTS HERE


        // clear screen
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        // draw bitmap




		if(gamestatus==0){
			int a=SDL_GetTicks();

			RBC_DrawRect(0, 0, screen->w, screen->h, 0, 0, 50);

			RBC_DrawRect((0+frame/2)%screen->w, 0, screen->w/5, screen->h, 105,210,231);
			if(((0+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((0+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 105,210,231);}

			RBC_DrawRect((screen->w/5+frame/2)%screen->w, 0, screen->w/5, screen->h, 167,219,216);
			if(((screen->w/5+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 167,219,216);}

			RBC_DrawRect((screen->w/5*2+frame/2)%screen->w, 0, screen->w/5, screen->h, 224,228,204);
			if(((screen->w/5*2+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*2+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 224,228,204);}

			RBC_DrawRect((screen->w/5*3+frame/2)%screen->w, 0, screen->w/5, screen->h, 243,134,48);
			if(((screen->w/5*3+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*3+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 243,134,48);}

			RBC_DrawRect((screen->w/5*4+frame/2)%screen->w, 0, screen->w/5, screen->h, 250,105,0);
			if(((screen->w/5*4+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*4+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 250,105,0);}


			blockS.Draw(-100, 90+sin(a/100)*50);
			blockZ.Draw(50, 90+sin(a/100+10)*50);
			blockI.Draw(200, 90+sin(a/100+20)*50);
			blockT.Draw(350, 90+sin(a/100+30)*50);

			start.Draw();
			help.Draw();
			exit.Draw();

		}else
		if(gamestatus==1){
			switch(manager.ReturnSpeed()){
					case 2:RBC_DrawRect(0, 0, screen->w, screen->h, 105,210,231);break;
					case 4:RBC_DrawRect(0, 0, screen->w, screen->h, 167,219,216);break;
					case 6:RBC_DrawRect(0, 0, screen->w, screen->h, 224,228,204);break;
					case 8:RBC_DrawRect(0, 0, screen->w, screen->h, 243,134,48);break;
					case 10:RBC_DrawRect(0, 0, screen->w, screen->h, 250,105,0);break;
					case 12:RBC_DrawRect(0, 0, screen->w, screen->h, 250,70,0);break;
					case 14:RBC_DrawRect(0, 0, screen->w, screen->h, 250,35,0);break;
					case 16:RBC_DrawRect(0, 0, screen->w, screen->h, 250,10,0);break;
					case 18:RBC_DrawRect(0, 0, screen->w, screen->h, 250,0,0);break;

			}
			RBC_DrawRect(245, 0, 310, 600, 0,0,0);
			RBC_DrawRect(250, 0, 300, 600, 85,98,112);
			RBC_DrawRect(570, 70, 210, 210, 0,0,0);
			RBC_DrawRect(575, 75, 200, 200, 200, 200, 200);
			GameBlock.Draw(manager.GetGameBlockX()*30, manager.GetGameBlockY()*30);
			NextBlock.Draw(375, 150);
			manager.DrawTable();
			RBC_Write(575, 300, "Speed:", screen);
			RBC_Write(675, 300, manager.ReturnSpeed(), screen);
			RBC_Write(575, 330, "Lines:", screen);
			RBC_Write(675, 330, manager.ReturnDone(), screen);
			RBC_Write(575, 360, "Score:", screen);
			RBC_Write(675, 360, manager.ReturnScore(), screen);

		}else
		if(gamestatus==2){
			switch(manager.ReturnSpeed()){
					case 2:RBC_DrawRect(0, 0, screen->w, screen->h, 105,210,231);break;
					case 4:RBC_DrawRect(0, 0, screen->w, screen->h, 167,219,216);break;
					case 6:RBC_DrawRect(0, 0, screen->w, screen->h, 224,228,204);break;
					case 8:RBC_DrawRect(0, 0, screen->w, screen->h, 243,134,48);break;
					case 10:RBC_DrawRect(0, 0, screen->w, screen->h, 250,105,0);break;
					case 12:RBC_DrawRect(0, 0, screen->w, screen->h, 250,70,0);break;
					case 14:RBC_DrawRect(0, 0, screen->w, screen->h, 250,35,0);break;
					case 16:RBC_DrawRect(0, 0, screen->w, screen->h, 250,10,0);break;
					case 18:RBC_DrawRect(0, 0, screen->w, screen->h, 250,0,0);break;

			}
			RBC_DrawRect(245, 0, 310, 600, 0,0,0);
			RBC_DrawRect(250, 0, 300, 600, 85,98,112);
			RBC_Write(360, 250, "Pause", screen);
		}else
		if(gamestatus==3){
			RBC_DrawRect((0+frame/2)%screen->w, 0, screen->w/5, screen->h, 105,210,231);
			if(((0+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((0+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 105,210,231);}

			RBC_DrawRect((screen->w/5+frame/2)%screen->w, 0, screen->w/5, screen->h, 167,219,216);
			if(((screen->w/5+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 167,219,216);}

			RBC_DrawRect((screen->w/5*2+frame/2)%screen->w, 0, screen->w/5, screen->h, 224,228,204);
			if(((screen->w/5*2+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*2+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 224,228,204);}

			RBC_DrawRect((screen->w/5*3+frame/2)%screen->w, 0, screen->w/5, screen->h, 243,134,48);
			if(((screen->w/5*3+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*3+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 243,134,48);}

			RBC_DrawRect((screen->w/5*4+frame/2)%screen->w, 0, screen->w/5, screen->h, 250,105,0);
			if(((screen->w/5*4+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*4+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 250,105,0);}


					easy.Draw();
					medium.Draw();
					hard.Draw();
		}else
		if(gamestatus==4){
			switch(manager.ReturnSpeed()){
					case 2:RBC_DrawRect(0, 0, screen->w, screen->h, 105,210,231);break;
					case 4:RBC_DrawRect(0, 0, screen->w, screen->h, 167,219,216);break;
					case 6:RBC_DrawRect(0, 0, screen->w, screen->h, 224,228,204);break;
					case 8:RBC_DrawRect(0, 0, screen->w, screen->h, 243,134,48);break;
					case 10:RBC_DrawRect(0, 0, screen->w, screen->h, 250,105,0);break;
					case 12:RBC_DrawRect(0, 0, screen->w, screen->h, 250,70,0);break;
					case 14:RBC_DrawRect(0, 0, screen->w, screen->h, 250,35,0);break;
					case 16:RBC_DrawRect(0, 0, screen->w, screen->h, 250,10,0);break;
					case 18:RBC_DrawRect(0, 0, screen->w, screen->h, 250,0,0);break;

			}
			RBC_DrawRect(245, 0, 310, 600, 0,0,0);
			RBC_DrawRect(250, 0, 300, 600, 85,98,112);
			RBC_DrawRect(570, 70, 210, 210, 0,0,0);
			RBC_DrawRect(575, 75, 200, 200, 200, 200, 200);
			GameBlock.Draw(manager.GetGameBlockX()*30, manager.GetGameBlockY()*30);
			NextBlock.Draw(375, 150);
			manager.DrawTable();
			RBC_Write(575, 300, "Speed:", screen);
			RBC_Write(675, 300, manager.ReturnSpeed(), screen);
			RBC_Write(575, 330, "Lines:", screen);
			RBC_Write(675, 330, manager.ReturnDone(), screen);
			RBC_Write(575, 360, "Score:", screen);
			RBC_Write(675, 360, manager.ReturnScore(), screen);

			for(int i=0; i<screen->w/2; i++){
					for(int j=0; j<screen->h/2; j++){
							RBC_DrawRect(i*2, j*2, 1,1, 0,0,0);
					}
			}


				RBC_Write(300, 300, "Game Over", screen);
				RBC_Write(300, 350, manager.ReturnScore(), screen);

		}else
		if(gamestatus==5){
			RBC_DrawRect((0+frame/2)%screen->w, 0, screen->w/5, screen->h, 105,210,231);
			if(((0+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((0+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 105,210,231);}

			RBC_DrawRect((screen->w/5+frame/2)%screen->w, 0, screen->w/5, screen->h, 167,219,216);
			if(((screen->w/5+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 167,219,216);}

			RBC_DrawRect((screen->w/5*2+frame/2)%screen->w, 0, screen->w/5, screen->h, 224,228,204);
			if(((screen->w/5*2+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*2+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 224,228,204);}

			RBC_DrawRect((screen->w/5*3+frame/2)%screen->w, 0, screen->w/5, screen->h, 243,134,48);
			if(((screen->w/5*3+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*3+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 243,134,48);}

			RBC_DrawRect((screen->w/5*4+frame/2)%screen->w, 0, screen->w/5, screen->h, 250,105,0);
			if(((screen->w/5*4+frame/2)%screen->w+screen->w/5)>screen->w){RBC_DrawRect(0, 0, ((screen->w/5*4+frame/2)%screen->w+screen->w/5)-screen->w, screen->h, 250,105,0);}

			RBC_Write(20, 300, "Use left and right arrow to move block sideways", screen);
			RBC_Write(20, 350, "Use down arrow to move block down faster for extra points", screen);
			RBC_Write(20, 400, "Use space to turn falling tetramino", screen);
			RBC_Write(20, 450, "Hit 'P' to pause game", screen);
		}

        RBC_Write(10, 20, "FPS: ", screen);RBC_Write(70, 20, GetFPS(), screen);

        // DRAWING ENDS HERE

        // finally, update the screen :)
        SDL_Flip(screen);
    } // end main loop

    // free loaded bitmap
	TTF_CloseFont(font);
	TTF_Quit();
    // all is well ;)
    printf("Exited cleanly\n");
    return 0;
}
Ejemplo n.º 5
0
ImageInfo::ImageInfo() {
    SetSize(0, 0);
    SetAspect(0, 0);
    SetFPS(0, 0); }
Ejemplo n.º 6
0
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{			
	int wmId, wmEvent;
	switch (message)
	{
	case WM_DRAWITEM:
		{				
			LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;
			if (lpDrawItemStruct->CtlType == ODT_LISTVIEW)
			{
				if (lpDrawItemStruct->CtlID == IDC_SONGLIST)
					return SongListProc(hWnd, message, wParam, lParam);
			}
		}
		break;

	case WM_MEASUREITEM:
		{			
			LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam;
			if (lpMeasureItemStruct->CtlType == ODT_LISTVIEW)
			{
				if (lpMeasureItemStruct->CtlID == IDC_SONGLIST)
					return SongListProc(hWnd, message, wParam, lParam); 
			}
		}
		break;

		case WM_HSCROLL:
		{
			if (LOWORD(wParam) == TB_ENDTRACK)
			{				
				DWORD pos = (DWORD)SendMessage(main_wnd.hTrack, TBM_GETPOS, 0, 0);
				TrackSetProgress(pos);
			}
		}
		break;

	case WM_NOTIFY:
		{
			LPNMHDR lpnmh = (LPNMHDR)lParam;
			if (lpnmh->idFrom == IDC_SONGLIST)
			{				
				LPNMITEMACTIVATE lpnmia = (LPNMITEMACTIVATE)lParam;				
				switch (lpnmh->code)
				{
				case NM_DBLCLK:
					{						
						if (lpnmia->iItem > -1)
						{
							PLAYERINFO* playerinfo = GetPlayerInfo(lpnmia->iItem);
							if (playerinfo != NULL)
								PlayInfoPrepare(playerinfo);
						}						
					}
					break;

				case NM_RCLICK:
					{
						POINT p = {0};
						GetCursorPos(&p);
						HMENU hMenu = LoadMenu(main_wnd.inst, MAKEINTRESOURCE(IDR_MENU_SONGLIST));
						TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN, p.x, p.y, 0, hWnd, NULL);						
					}
					break;
				}
			}
			else
			{
				if (lpnmh->hwndFrom == main_wnd.hTrack)
				{
					DWORD pos = (DWORD)SendMessage(main_wnd.hTrack, TBM_GETPOS, 0, 0);
					if (pos != main_wnd.track && !main_wnd.lock_track)
						TrackLock(TRUE);
				}
			}
		}
		break;

	case WM_COMMAND:		
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);		
				
		switch (wmId)
		{		
		case IDM_PLAY_START:
			{
				DWORD size = 1024;
				TCHAR* filename = new TCHAR[size];
				ZeroMemory(filename, size); 

				OPENFILENAME ofn = {0};
				ofn.lStructSize = sizeof(ofn);
				ofn.hwndOwner = hWnd;
				ofn.lpstrFile = filename;
				ofn.nMaxFile = size;
				ofn.lpstrFileTitle = L"Ñ¡Ôñ²¥·ÅÎļþ";
				ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

				if (GetOpenFileName(&ofn) && wcslen(filename) > 0)
				{
					PLAYERINFO* playerinfo = new PLAYERINFO();
					ZeroMemory(playerinfo, sizeof(PLAYERINFO));
					playerinfo->filename = WideCharToChar(filename, wcslen(filename));
					playerinfo->n = -1;
					InitializeCriticalSection(&playerinfo->lock_lyric);
					InitializeCriticalSection(&playerinfo->lock_lyricinfo);
					PlayInfoPrepare(playerinfo);
				}
				
				SAFE_DELETE_ARRAY(filename);
			}
			break;

		case IDM_PLAY_STOP:
			{
				player.stop = TRUE;
				playerstatus = ID_STATUS_STOP;
				SetEvent(main_wnd.handle);
			}
			break;

		case IDM_PLAY_PAUSE:
			{
				if (player.current != NULL)
				{
					PLAYERINFO* playerinfo = player.current;
					LPDIRECTSOUNDBUFFER dbuffer = playerinfo->dx.dbuffer;
					if (playerinfo->playing && dbuffer != NULL)
					{
						if (playerinfo->pause)
						{
							playerinfo->pause = FALSE;
							playerinfo->playing = TRUE;
							playerstatus = ID_STATUS_START;							
							dbuffer->Play(0, 0, DSBPLAY_LOOPING);
						}
						else
						{
							playerinfo->pause = TRUE;
							playerinfo->playing = FALSE;
							playerstatus = ID_STATUS_PAUSE;
							dbuffer->Stop();
						}
					}
					else
					{
						if (playerinfo->pause)
						{
							playerinfo->pause = FALSE;
							playerinfo->playing = TRUE;
							playerstatus = ID_STATUS_START;
							dbuffer->Play(0, 0, DSBPLAY_LOOPING);
						}
						else
						{
							playerinfo->pause = TRUE;
							playerinfo->playing = FALSE;
							playerstatus = ID_STATUS_PAUSE;
							dbuffer->Stop();
						}
					}

					SetWindowText(playerinfo);
					RefreshItem(playerinfo->n);
				}					
			}
			break;

		case IDM_SONGLIST_ADD_DIR:
			return SongListProc(hWnd, message, wParam, lParam);

		case IDM_SONGLIST_ADD_FILE:
			return SongListProc(hWnd, message, wParam, lParam);

		case IDM_SONGLIST_REMOVE_FILE:
			{
				if (SongListScan())				
					MessageBox(hWnd, L"ÕýÔÚɨÃèÎļþ", L"´íÎó", MB_ICONERROR);				
				else
				{
					while (SongListGetSelectCount() > 0)
					{
						int n = SongListGetSelectItem();
						if (n == -1)
							break;
						else
							SongListRemove(n, &player);
					}
				}				
			}
			break;

		case IDM_SONGLIST_REMOVE_ALL:
			{
				if (SongListScan())				
					MessageBox(hWnd, L"ÕýÔÚɨÃèÎļþ", L"´íÎó", MB_ICONERROR);
				else
					SongListClear(&player);
			}
			break;

		case IDM_MENU_SPECTRUM_LINE:
			{
				if (GetSpectrumLine())
					SetSpectrumLine(FALSE);
				else
					SetSpectrumLine(TRUE);
			}
			break;

		case IDM_MENU_25FPS:
			SetFPS(IDM_MENU_25FPS);
			break;

		case IDM_MENU_30FPS:
			SetFPS(IDM_MENU_30FPS);
			break;

		case IDM_MENU_40FPS:
			SetFPS(IDM_MENU_40FPS);
			break;

		case IDM_MENU_50FPS:
			SetFPS(IDM_MENU_50FPS);
			break;

		case IDM_MENU_LYRIC_STATUS:
			{
				if (GetLyricStatus())
				{
					SetLyricStatus(FALSE);
				}
				else
				{
					SetLyricStatus(TRUE);
					LyricInfoReStart(player.current);
				}			
			}
			break;

		case IDM_MENU_LYRIC_FONT:
			{
				LOGFONT* font = LyricGetFont();
				CHOOSEFONT cf = {0};
				cf.lStructSize = sizeof(CHOOSEFONT);				
				cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS;
				cf.lpLogFont = font;
				if (ChooseFont(&cf))
					LyricSetFont();
			}
			break;

		case IDM_MENU_LYRIC_COLOR:
			{
				DialogBox(main_wnd.inst, MAKEINTRESOURCE(IDD_DIALOG_FONTCOLOR), main_wnd.hWnd, FontColorProc);
			}
			break;

		case IDM_MENU_LYRIC_SUB_500:
			SetLyricDelay(-500);
			break;

		case IDM_MENU_LYRIC_SUB_1000:
			SetLyricDelay(-1000);
			break;

		case IDM_MENU_LYRIC_SUB_3000:
			SetLyricDelay(-3000);
			break;

		case IDM_MENU_LYRIC_0:
			SetLyricDelay(0);
			break;

		case IDM_MENU_LYRIC_ADD_500:
			SetLyricDelay(500);
			break;

		case IDM_MENU_LYRIC_ADD_1000:
			SetLyricDelay(1000);
			break;

		case IDM_MENU_LYRIC_ADD_3000:
			SetLyricDelay(3000);
			break;

		case IDM_MENU_LYRIC_SEARCH:
			{
				LyricSearchShow(TRUE);
			}
			break;

		case IDM_MENU_DSP_STATUS:
			{
				HMENU menu = GetMenu(main_wnd.hWnd);
				if (menu != NULL)
				{
					if (DspGetStatus())					
					{
						DspSetStatus(FALSE);
						CheckMenuItem(menu, IDM_MENU_DSP_STATUS, MF_UNCHECKED);
					}
					else
					{
						DspSetStatus(TRUE);
						CheckMenuItem(menu, IDM_MENU_DSP_STATUS, MF_CHECKED);
					}
				}					
			}
			break;

		case IDM_MENU_DSP_SOUNDTOUCH:
			{
				SoundTouchShowDialog(TRUE);
			}
			break;

		default:
			{
				if (wmId >= WM_USER + WM_CDROM)
				{
					CDROM* current = main_cdrom;
					while (current != NULL)
					{
						if (current->msgId == wmId)
							break;
						else
							current = current->next;
					}

					if (current != NULL)			
						return SongListProc(hWnd, WM_COMMAND, IDM_SONGLIST_ADD_CD, (LPARAM)current);
				}
				else
					return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		}
		break;

	case WM_CLOSE:
		{
			player.stop = TRUE;
			playerstatus = ID_STATUS_EXIT;
			SetEvent(main_wnd.handle);
		}
		break;

	case WM_DROPFILES:
		return SongListProc(hWnd, message, wParam, lParam); 
		
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
				
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}