/*
WIN.CPP
*/
#include "stdafx.h"
#include "win.h"
#include "screen.h"
#include "sfc.h"
#include "sprite.h"
#include "gameapi.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(WIN, CWnd)
//{{AFX_MSG_MAP(MAIN)
ON_WM_KEYDOWN()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//--------------GOBAL------------------
#define INIT 0
#define SETICON 1
#define ACTIVEBOMB 2
#define MINUTE 60000
SCREEN screen;
SFC sfc[2];
SFC_RES sfc_res[2];
SPRITE sprite;
SPRITE_RES sprite_res;
SPRITE bomb;
SPRITE_RES bomb_res;
NOTIFYICONDATA nf;
bool addicon=0;
int delay=1;
char *SPRITEBMP="SPRITEBMP";
char *BOMBBMP="BOMBBMP";
char *BOMBWAVE="bomb.wav";
WIN::WIN()
{
int width=1;
int length=1;
CreateEx(
0,
AfxRegisterWndClass(1),
"DAIMY",
WS_POPUP,
0,0,
width,length,
NULL,NULL
);
srand( (unsigned)time( NULL ) );
Run(INIT);
Run(SETICON);
FILE *file=fopen("bomb.dat","r");
if( file!=NULL )
{
fread(&delay,1,sizeof(int),file);
fscanf(file,"%d",delay);
if( delay>5 || delay<0 ) delay=1;
fclose(file);
}
while( SetTimer(1,delay*MINUTE,NULL)==0 );
MessageBox("屏幕小精灵~BOMB","DAIMY");
}
void WIN::End()
{
MessageBox("再见!","DAIMY");
if( addicon )
Shell_NotifyIcon(NIM_DELETE,&nf);
SendMessage( WM_CLOSE );
}
void WIN::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags )
{
if( nChar==VK_ESCAPE )
{
End();
}
if( nChar==VK_F12 )
{
Run(2);
}
}
void WIN::OnTimer( UINT nIDEvent )
{
KillTimer(1);
Run(ACTIVEBOMB);
}
void WIN::Run(int index)
{
switch( index )
{
//INIT ALL
case INIT:
screen.Init(GetSafeHwnd());
screen.CreateDesktop();
//SPRITE
ZeroMemory(&sfc_res[0],sizeof(SFC_RES));
sfc_res[0].filename=SPRITEBMP;
SetRect(&sfc_res[0].rect,0,0,64,160);
sfc_res[0].rgb=RGB(0,255,0);
sfc[0].Init(screen.lpdd,screen.primsfc,screen.backsfc);
sfc[0].Get(&sfc_res[0],1);
//BOMB
ZeroMemory(&sfc_res[1],sizeof(SFC_RES));
sfc_res[1].filename=BOMBBMP;
SetRect(&sfc_res[1].rect,0,0,256,32);
sfc_res[1].rgb=RGB(0,255,0);
sfc[1].Init(screen.lpdd,screen.primsfc,screen.backsfc);
sfc[1].Get(&sfc_res[1],1);
//SPRITE
ZeroMemory(&sprite_res,sizeof(SPRITE_RES));
bomb_res.rect=sfc_res[0].rect;
sprite_res.appwidth=32;
sprite_res.appheight=32;
sprite.GetFromSfc(&sprite_res,&sfc[0]);
//BOMB
ZeroMemory(&bomb_res,sizeof(SPRITE_RES));
bomb_res.rect=sfc_res[1].rect;
bomb_res.appwidth=32;
bomb_res.appheight=32;
bomb.GetFromSfc(&bomb_res,&sfc[1]);
break;
case SETICON:
if( addicon==0 )
{
nf.cbSize=sizeof(NOTIFYICONDATA);
nf.hWnd=GetSafeHwnd();
nf.uID=1;
nf.uFlags=NIF_TIP | NIF_ICON;
strcpy(nf.szTip,"屏幕小精灵~BOMB");
nf.hIcon=LoadIcon(AfxGetInstanceHandle(),"IDI_ICON");
Shell_NotifyIcon(NIM_ADD,&nf);
addicon=1;
}
break;
//ACTIVE THE BOMB
case ACTIVEBOMB:
ShowWindow(SW_SHOWNORMAL);
screen.lpdd->RestoreAllSurfaces();
SetCursorPos(screen.width,screen.height);
screen.GetDesktop();
RECT rc;
SetRect(&rc,0,0,screen.width,screen.height);
int i;
//MOVE SPRITE
for(i=0;i<screen.height/2-16;i+=4)
{
screen.PutDesktop(&rc,0);
sprite.SetFrom(i/8%2,0);
sprite.MoveTo(screen.width/2-16,i);
sprite.Put();
SetFps(24);
screen.Flip();
}
//SPRITE TALK
char *words[6];
int n=0;
HDC hdc;
words[0]="HELLO!我是屏幕小精灵。";
words[1]="为了感谢您使用本程序,我决定......";
words[2]="把你的屏幕炸掉!";
words[3]="叽哩咕噜~叽哩咕噜~叽哩咕噜~";
words[4]="消失吧!";
words[5]="嗨~~~";
while(n<4)
{
WaitForKey(VK_SPACE,0);
screen.PutDesktop(&rc,0);
sprite.SetFrom(0,0);
if( n==3 ) sprite.SetFrom(0,4);
sprite.Put();
if( screen.backsfc->GetDC(&hdc)==DD_OK )
{
TextOut(hdc,
(screen.width-strlen(words[n])*8)/2,sprite_res.y-16,
words[n],strlen(words[n]));
screen.backsfc->ReleaseDC(hdc);
}
screen.Flip();
n++;
WaitForKey(VK_SPACE,1);
}
//BOMB
for(i=0;i<8*15;i++)
{
if( i%8==0 )
{
bomb.MoveTo(rand()%(screen.width-64),rand()%(screen.height-64));
PlaySound(BOMBWAVE,NULL,SND_ASYNC);
}
screen.PutDesktop(&rc,0);
bomb.SetFrom(i%8,0);
bomb.SetSize(2);
bomb.Put();
sprite.SetFrom(0,4);
sprite.Put();
SetFps(24);
screen.Flip();
}
//SPRITE TALK AGAIN
while(n<6)
{
WaitForKey(VK_SPACE,0);
screen.PutDesktop(&rc,0);
sprite.SetFrom(0,0);
if( n==5 ) sprite.SetFrom(0,4);
sprite.Put();
if( screen.backsfc->GetDC(&hdc)==DD_OK )
{
TextOut(hdc,
(screen.width-strlen(words[n])*8)/2,sprite_res.y-16,
words[n],strlen(words[n]));
screen.backsfc->ReleaseDC(hdc);
}
screen.Flip();
n++;
WaitForKey(VK_SPACE,1);
}
//DISAPPEAR
for(i=10;i>=0;i--)
{
FillSfc(screen.backsfc,0,NULL);
rc.left=(screen.width-screen.width*i/10)/2;
rc.right=rc.left+screen.width*i/10;
rc.top=(screen.height-screen.height*i/10)/2;
rc.bottom=rc.top+screen.height*i/10;
screen.PutDesktop(&rc,0);
sprite.SetFrom(0,4);
sprite.Put();
SetFps(24);
screen.Flip();
}
for(i=0;i<8;i++)
{
if( i==0 )
PlaySound(BOMBWAVE,NULL,SND_ASYNC);
FillSfc(screen.backsfc,0,NULL);
screen.PutDesktop(&rc,0);
bomb.MoveTo((screen.width-(8-i)*32)/2,(screen.height-(8-i)*32)/2);
bomb.SetFrom(i,0);
bomb.SetSize(8-i);
bomb.Put();
sprite.SetFrom(0,4);
sprite.Put();
SetFps(10);
screen.Flip();
}
FillSfc(screen.backsfc,0,NULL);
screen.Flip();
if( GetAsyncKeyState(VK_F12)!=0 )
End();
else
{
ShowWindow(SW_HIDE);
while( SetTimer(1,delay*MINUTE,NULL)==0 );
}
break;
}
}