2024年2月21日发(作者:)

int jumpx;

//方向

int idirec;

//动画

int iAniBegin;

int iparam1;

int iAniStyle;

};

#endif

//

// Finishing

#include "stdafx.h"

#include "bitmaptool.h"

#include "gamemap.h"

extern GAMEMAP gamemap;

extern FILEREPORT f1;

MYBITMAP::MYBITMAP()

{}

MYBITMAP::~MYBITMAP()

{

DeleteObject(hBm);

}

void MYBITMAP::Init(HINSTANCE hInstance,int iResource,int

row,int col)

{

BITMAP bm;

inum=row;

jnum=col;

hBm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResource));

GetObject(hBm,sizeof(BITMAP),&bm);

width=h/inum;

height=ht/jnum;

}

void MYBITMAP::SetDevice(HDC hdest,HDC hsrc,int wwin,int

hwin)

{

hdcdest=hdest;

hdcsrc=hsrc;

screenwidth=wwin;

screenheight=hwin;

}

void MYBITMAP::Show(int x,int y)

{

xpos=x;

ypos=y;

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY);

}

void MYBITMAP::ShowCenter(int y)

{

xpos=(screenwidth-width)/2;

ypos=y;

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY);

}

void MYBITMAP::ShowLoop(int left,int top,int right,int bottom,int

iframe)

{

int i,j;

SelectObject(hdcsrc,hBm);

for(j=top;j

{

for(i=left;i

{

BitBlt(hdcdest,i,j,width,height,hdcsrc,iframe*width,0,SRCCOPY);

}

}

}

void MYBITMAP::ShowNoBack(int x,int y,int iFrame)

{

xpos=x;

ypos=y;

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,height/2,SRCAND);

BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,0,SRCPAINT);

}

void MYBITMAP::ShowNoBackLoop(int x,int y,int iFrame,int

iNum)

{

int i;

xpos=x;

ypos=y;

SelectObject(hdcsrc,hBm);

for(i=0;i

{

BitBlt(hdcdest,xpos+i*width,ypos,width,height/2,hdcsrc,iFrame*width,height/2,SRCAND); BitBlt(hdcdest,xpos+i*width,ypos,width,height/2,hdcsrc,iFrame*width,0,SRCPAINT); }

}

void MYBITMAP::ShowAni()

{

/* if(!iStartAni)

return;

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,framenow*width,height/2,SRCAND);

BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,framenow*width,0,SRCPAINT);

framenow++;

//播放结束

if(framenow>=inum)

iStartAni=0;

*/

}

void MYBITMAP::SetAni(int x,int y)

{

xpos=x;

ypos=y;

/*

framenow=0;

iStartAni=1;

*/

}

void MYBITMAP::SetPos(int istyle,int x,int y)

{

switch(istyle)

{

case BM_CENTER:

xpos=(screenwidth-width)/2;

ypos=y;

break;

case BM_USER:

xpos=x;

ypos=y;

break;

}

}

void MYBITMAP::Draw(DWORD dwRop)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,dwRop);

}

void MYBITMAP::Stretch(int x,int y)

{

SelectObject(hdcsrc,hBm);

StretchBlt(hdcdest,xpos,ypos,width*x,height*y,

hdcsrc,0,0,width,height,

SRCCOPY);

}

void MYBITMAP::Stretch(int x,int y,int id)

{

SelectObject(hdcsrc,hBm);

StretchBlt(hdcdest,xpos,ypos,width*x,height*y,

hdcsrc,0,id*height,

width,height,

SRCCOPY);

}

///////////////////////// bitmap object animation//////////////////

MYBKSKY::MYBKSKY()

{

xseparate=0;

}

MYBKSKY::~MYBKSKY()

{}

void MYBKSKY::MoveTo(int x,int y)

{

xpos=x;

ypos=y;

}

void MYBKSKY::MoveRoll(int x)

{

xseparate+=x;

xseparate%=width;

if(xseparate<0)

{

xseparate=width;

}

}

void MYBKSKY::DrawRoll()

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,

width-xseparate,height,

hdcsrc,xseparate,0,SRCCOPY);

BitBlt(hdcdest,xpos+width-xseparate,ypos,

xseparate,height,

hdcsrc,0,0,SRCCOPY);

}

void MYBKSKY::DrawRollStretch(int x,int y)

{

SelectObject(hdcsrc,hBm);

StretchBlt(hdcdest,xpos,ypos,

(width-xseparate)*x,height*y,

hdcsrc,xseparate,0,

width-xseparate,height,

SRCCOPY);

StretchBlt(hdcdest,xpos+(width-xseparate)*x,ypos,

xseparate*x,height*y,

hdcsrc,0,0,

xseparate,height,

SRCCOPY);

}

void MYBKSKY::DrawRollStretch(int x,int y, int id)

{

SelectObject(hdcsrc,hBm);

StretchBlt(hdcdest,xpos,ypos,

(width-xseparate)*x,height*y,

hdcsrc,xseparate,id*height,

width-xseparate,height,

SRCCOPY);

StretchBlt(hdcdest,xpos+(width-xseparate)*x,ypos,

xseparate*x,height*y,

hdcsrc,0,id*height,

xseparate,height,

SRCCOPY);

}

///////////////////////// bitmap role//////////////////

MYROLE::MYROLE()

{}

MYROLE::~MYROLE()

{}

void MYROLE::MoveTo(int x,int y)

{

xpos=x;

ypos=y;

}

void MYROLE::MoveOffset(int x,int y)

{

if(x==0 && y==0)

return;

if(!nMove(x,y))

return;

xpos+=x;

ypos+=y;

if(xpos

xpos=minx;

if(xpos>maxx)

xpos=maxx;

}

void MYROLE::MoveStepTo(int x,int y)

{

if(xpos

xpos+=ROLE_STEP;

if(ypos

ypos+=8;

if(ypos>y)

ypos=y;

}

// 去背显示

void MYROLE::Draw()

{

if(iAniBegin)

{

PlayAni();

}

else

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,xpos,ypos,

width,height/2,

hdcsrc,iFrame*width,height/2,SRCAND);

BitBlt(hdcdest,xpos,ypos,

width,height/2,

hdcsrc,iFrame*width,0,SRCPAINT);

}

}

void MYROLE::Draw(int x,int y,int frame)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,x,y,

width,height/2,

hdcsrc,frame*width,height/2,SRCAND);

BitBlt(hdcdest,x,y,

width,height/2,

hdcsrc,frame*width,0,SRCPAINT);

}

void MYROLE::InitRole(int xleft,int xright)

{

iFrame=0;

iState=0;

maxx=xright;

minx=xleft;

jumpheight=0;

movex=0;

movey=0;

jumpx=0;

idirec=0;

iAniBegin=0;

}

void MYROLE::SetLimit(int xleft,int xright)

{

maxx=xright;

minx=xleft;

}

void MYROLE::Move()

{

if(0 == movey)

{

//水平移动

MoveOffset(movex, 0);

}

else

{

//跳动

MoveOffset(jumpx, 0);

MoveOffset(0, movey);

}

//帧控制

if(movex<0 && iFrame<3)

{

iFrame=3;

}

if(movex>0 && iFrame>=3)

{

iFrame=0;

}

if(movex!=0)

{

if(0==idirec)

iFrame=1-iFrame;

else

iFrame=7-iFrame;

}

if(movey!=0)

{

iFrame=idirec*3;

}

if(movey<0)

{

//up

jumpheight+=(-movey);

//根据重力影响,加速度减慢

if(movey<-1)

{

movey++;

}

//到达顶点后向下落

if(jumpheight >= JUMP_HEIGHT * 32)

{

jumpheight = JUMP_HEIGHT * 32;

movey=4;

}

}

else if(movey>0)

{

jumpheight -= movey;

//根据重力影响,加速度增大

movey++;

}

}

void MYROLE::Jump()

{

//上升过程

MoveOffset(0, -4);

}

void MYROLE::ChangeFrame()

{}

void MYROLE::SetState(int i)

{

iState=i;

}

void MYROLE::SetAni(int istyle)

{ iAniStyle=istyle;

iparam1=0;

iAniBegin=1;

}

//是否正在播放动画

int MYROLE::IsInAni()

{ return iAniBegin;

}

void MYROLE::PlayAni()

{

switch(iAniStyle)

{

case ROLE_ANI_DOWN:

if(iparam1>31)

{

break;

}

//人物下降动画

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,

xpos,ypos+iparam1,

width,height/2-iparam1,

hdcsrc,

iFrame*width,height/2,SRCAND);

BitBlt(hdcdest,

xpos,ypos+iparam1,

width,height/2-iparam1,

hdcsrc,

iFrame*width,0,SRCPAINT);

iparam1++;

break;

case ROLE_ANI_UP:

if(iparam1>31)

{

break;

}

//人物上升动画

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,

xpos,ypos+32-iparam1,

width,iparam1,

hdcsrc,

iFrame*width,height/2,SRCAND);

BitBlt(hdcdest,

xpos,ypos+32-iparam1,

width,iparam1,

hdcsrc,

iFrame*width,0,SRCPAINT);

iparam1++;

if(iparam1>31)

{

iAniBegin=0; //动画结束

}

default:

break;

}

}

/////////////////////////////////// my animation /////////////////////

MYANIOBJ::MYANIOBJ()

{

memset(wlist, 0, sizeof(wlist));

memset(hlist, 0, sizeof(hlist));

memset(ylist, 0, sizeof(ylist));

iframeplay=0;

}

MYANIOBJ::~MYANIOBJ()

{}

void MYANIOBJ::DrawItem(int x,int y,int id,int iframe)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id]+hlist[id],SRCAND);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id],SRCPAINT);

}

void MYANIOBJ::DrawItemNoMask(int x,int y,int id,int iframe)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id],SRCCOPY);

}

void MYANIOBJ::DrawItemNoMaskWidth(int x,int y,int id,int w,int

iframe)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,x,y,w,hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id],SRCCOPY);

}

void MYANIOBJ::PlayItem(int x,int y,int id)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframeplay*wlist[id],ylist[id]+hlist[id],SRCAND);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframeplay*wlist[id],ylist[id],SRCPAINT);

iframeplay=(iframeplay+1)%2;

}

void MYANIOBJ::InitAniList(int *pw,int *ph,int inum,int ismask)

{

int i;

memcpy(wlist, pw, inum*sizeof(int));

memcpy(hlist, ph, inum*sizeof(int));

ylist[0]=0;

for(i=1;i

{

//如果是mask,两张图片的间隔高度要乘以2

ylist[i]=ylist[i-1]+hlist[i-1]*(ismask+1);

}

}

void MYANIOBJ::InitAniList(int style,int a, int b)

{

int i;

switch(style)

{

case BM_SQUARE:

// a : 数量, b: 边长

for(i=0;i

{

wlist[i]=b;

hlist[i]=b;

ylist[i]=i*b;

}

break;

default:

break;

}

}

/////////////////////////////////// my animation magic/////////////////////

MYANIMAGIC::MYANIMAGIC()

{

memset(wlist, 0, sizeof(wlist));

memset(hlist, 0, sizeof(hlist));

memset(ylist, 0, sizeof(ylist));

}

MYANIMAGIC::~MYANIMAGIC()

{}

void MYANIMAGIC::DrawItem(int x,int y,int id,int iframe)

{

SelectObject(hdcsrc,hBm);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id]+hlist[id],SRCAND);

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id],SRCPAINT);

/*

//先在临时DC上画出效果总图

BitBlt(hdctemp,0,0,wlist[id],hlist[id],

hdcsrc,

0,ylist[id],SRCCOPY);

//用MASK图作裁剪

BitBlt(hdctemp,0,0,wlist[id],hlist[id],

hdcsrc,

iframe*wlist[id],ylist[id],SRCPAINT);

//最后画到屏幕上

BitBlt(hdcdest,x,y,wlist[id],hlist[id],

hdctemp,

0,0,SRCPAINT);

*/

}

//带MASK

void MYANIMAGIC::InitAniList(int *pw,int *ph,int inum)

{

int i;

memcpy(wlist, pw, inum*sizeof(int));

memcpy(hlist, ph, inum*sizeof(int));

ylist[0]=0;

for(i=1;i

{

ylist[i]=ylist[i-1]+hlist[i-1]*2;

}

}

void MYANIMAGIC::SetDevice(HDC hdest, HDC hsrc, HDC

}

FILEREPORT::~FILEREPORT()

{

htemp)

{

hdcdest=hdest;

hdcsrc=hsrc;

hdctemp=htemp;

}

//filereport.h

#ifndef __FILEREPORT

#define __FILEREPORT

class FILEREPORT

{

public:

FILEREPORT();

FILEREPORT(char *p);

~FILEREPORT();

void put(char *p);

void put(char *p,int a,int b);

void putnum(int i,char *p);

//////////

void CheckDC(HDC h,char *p);

//show

void SetDevice(HDC h,int x,int y);

void Output(char *p,int a,int b);

void Show();

private:

FILE *fp;

//计数器组

int num[5];

//show

HDC hshow;

int xpos;

int ypos;

char info[50];

};

#endif

//

#include "stdafx.h"

#include "filereport.h"

#include "stdio.h"

#include "stdlib.h"

FILEREPORT::FILEREPORT()

{

fp=fopen("","w");

memset(num,0,sizeof(num));

}

FILEREPORT::FILEREPORT(char *p)

{

fp=fopen(p,"w");

memset(num,0,sizeof(num));

fclose(fp);

}

void FILEREPORT::put(char *p)

{

fwrite(p,sizeof(char),strlen(p),fp);

fwrite("n",1,1,fp);

}

//带计数器的跟踪

void FILEREPORT::putnum(int i,char *p)

{

char temp[50];

sprintf(temp,"(%d) ",num[i]);

fwrite(temp,sizeof(char),strlen(temp),fp);

num[i]++;

fwrite(p,sizeof(char),strlen(p),fp);

fwrite("n",1,1,fp);

}

void FILEREPORT::put(char *p,int a,int b)

{

char temp[50];

sprintf(temp,"%s : %d , %d",p,a,b);

fwrite(temp,sizeof(char),strlen(temp),fp);

fwrite("n",1,1,fp);

}

void FILEREPORT::CheckDC(HDC h,char *p)

{

if(h==NULL)

{

fwrite(p,sizeof(char),strlen(p),fp);

fwrite("n",1,1,fp);

}

}

void FILEREPORT::SetDevice(HDC h,int x,int y)

{

hshow=h;

xpos=x;

ypos=y;

}

void FILEREPORT::Output(char *p,int a,int b)

{

sprintf(info,"%s:%d,%d",p,a,b);

}

void FILEREPORT::Show()

{

TextOut(hshow,xpos,ypos,info,strlen(info));

}

//gamemap.h

#ifndef __GAMEMAP

#define __GAMEMAP

#include "bitmaptool.h"

struct MapObject

{

int x;

int y;

int w;

int h;

int id;

int iframe;

int iframemax;//最大帧数

int show; //是否显示

};

struct ROLE

{

int x;

int y;

int w;

int h;

int id;

int iframe;

int iframemax;//最大帧数

//移动局部

int xleft;//左界限

int xright;//右界限

int movex;

//人物属性

int health;

int show; //是否显示

};

struct MAPINFO

{

int iNextMap;

int iSubMap;

int xReturnPoint;

int yReturnPoint;

int iBackBmp;

int viewmax;

};

class GAMEMAP

{

public:

int LoadMap();

void Init();

void InitMatch();

//入参,物体索引图

void Show(MYANIOBJ & bmobj);

//入参,背景物体索引图

void ShowBkObj(MYANIOBJ & bmobj);

//入参,动画物体索引图

void ShowAniObj(MYANIOBJ & bmobj);

void ShowInfo(HDC h);

void ShowOther(HDC h);

//键盘处理

int KeyProc(int iKey);

void KeyUpProc(int iKey);

void MoveView();

//设置视图起始坐标

void SetView(int x);

void SetViewState(int i);

void SetGameState(int i);

//hittest

int RoleCanMove(int xoff, int yoff);

int CheckRole();

int CheckAni(int itimeclip);

void ClearEnemy(int i);

void ClearCoin(int i);

//动画帧控制

void ChangeFrame(int itimeclip);//入参,时间片

//逻辑检测

int IsWin();

void Fail();

void Fail_Wait();

//地图切换

void ChangeMap();

//错误检查

void CodeErr(int i);

//菜单控制

void ShowMenu(MYANIOBJ & bmobj);

GAMEMAP();

~GAMEMAP();

//data

int iMatch;

int iLife;

int iGameState;

struct MapObject MapArray[MAX_MAP_OBJECT];

int iMapObjNum;

struct MapObject MapBkArray[MAX_MAP_OBJECT];

int iMapBkObjNum;

struct ROLE MapEnemyArray[MAX_MAP_OBJECT];

int iMapEnemyCursor;

struct MapObject MapCoinArray[MAX_MAP_OBJECT];

int iCoinNum;

//MAP DATA

int iNextMap;

// role data

int iMoney;

int iAttack; //攻击方式

//view

int viewx;

int viewy;

int iViewState;

//地图数据

struct MAPINFO mapinfo;

//frame control

int ienemyframe;

int ibkobjframe;

//FIRE

struct ROLE FireArray[MAX_MAP_OBJECT];

int iFireNum;

int iTimeFire;//两个子弹的时间间隔

int iBeginFire;

//bomb

struct MapObject BombArray[MAX_MAP_OBJECT];

int iBombNum;

//攻击对象提示

char AttackName[20];

int iAttackLife;

int iAttackMaxLife;

//菜单局部

int iMenu;

//屏幕缩放

int iScreenScale;

};

#endif

//

// Finishing

#include "stdafx.h"

#include "gamemap.h"

#include "myclock.h"

#include "tool01.h"

#include "texttool.h"

extern int wwin,hwin;

extern HWND hWndMain;

//根本图像

extern MYANIOBJ bmMap;

//天空背景

extern MYBKSKY bmSky;

//角色

extern MYROLE rmain;

//计时器

extern MYCLOCK c1;

extern MYANIMAGIC bmMagic;

extern struct MAPINFO allmapinfo[];

extern struct ROLE gl_enemy_normal;

//extern FILEREPORT f1;

GAMEMAP::GAMEMAP()

{

iScreenScale=0;

Init();

}

GAMEMAP::~GAMEMAP()

{

}

int GAMEMAP::LoadMap()

{

FILE *fp;

char temp[50]={0};

int find=0;

int i;

memset(MapArray,0,sizeof(MapArray));

iMapObjNum=0;

memset(MapBkArray,0,sizeof(MapBkArray));

iMapBkObjNum=0;

memset(MapEnemyArray,0,sizeof(MapEnemyArray));

memset(MapCoinArray,0,sizeof(MapCoinArray));

iCoinNum=0;

fp=fopen(PATH_MAP,"r");

if(!fp)

{

return 0;

}

while(!find && !feof(fp))

{

FGetLine(temp,fp);

if(temp[0]=='*' && temp[1]=='0'+iMatch)

{

find=1;

}

}

if(!find)

{

return 0;

}

//找到了某一关的地图数据

i=0;

FGetLineJumpCom(temp,fp);

while(temp[0]!='#' && !feof(fp))

{

//map data

sscanf(temp,"%d %d %d %d %d",

&MapArray[i].x,

&MapArray[i].y,

&MapArray[i].w,

&MapArray[i].h,

&MapArray[i].id);

MapArray[i].show=0;

iMapObjNum++;

i++;

FGetLineJumpCom(temp,fp);

}

i=0;

FGetLineJumpCom(temp,fp);

while(temp[0]!='#' && !feof(fp))

{

sscanf(temp,"%d %d %d %d %d",

&MapBkArray[i].x,

&MapBkArray[i].y,

&MapBkArray[i].w,

&MapBkArray[i].h,

&MapBkArray[i].id);

MapBkArray[i].show=0;

MapBkArray[i].iframe=0;

iMapBkObjNum++;

i++;

FGetLineJumpCom(temp,fp);

}

i=0;

FGetLineJumpCom(temp,fp);

while(temp[0]!='#' && !feof(fp))

{

sscanf(temp,"%d %d %d %d %d %d %d",

&MapEnemyArray[i].x,

&MapEnemyArray[i].y,

&MapEnemyArray[i].w,

&MapEnemyArray[i].h,

&MapEnemyArray[i].id,

&MapEnemyArray[i].xleft,

&MapEnemyArray[i].xright);

//动画元件,使用绝对坐标

MapEnemyArray[i].x*=32;

MapEnemyArray[i].y*=32;

MapEnemyArray[i].w*=32;

MapEnemyArray[i].h*=32;

MapEnemyArray[i].xleft*=32;

MapEnemyArray[i].xright*=32;

MapEnemyArray[i].show=1;

MapEnemyArray[i].movex=-ENEMY_STEP_X;

MapEnemyArray[i].iframe=0;

MapEnemyArray[i].iframemax=2;

//设置生命值

switch(MapEnemyArray[i].id)

{

case ID_ANI_BOSS_HOUSE:

MapEnemyArray[i].health=BOSS_HEALTH;

break;

case ID_ANI_BOSS_HOUSE_A:

MapEnemyArray[i].health=BOSS_A_HEALTH;

break;

default:

MapEnemyArray[i].health=1;

break;

}

//将BOSS存储在数组的后半段

if ( i

&& ( MapEnemyArray[i].id ==

ID_ANI_BOSS_HOUSE

|| MapEnemyArray[i].id ==

ID_ANI_BOSS_HOUSE_A) )

{

//move data to BOSS_CURSOR

MapEnemyArray[BOSS_CURSOR]=MapEnemyArray[i];

memset(&MapEnemyArray[i],0,sizeof(MapEnemyArray[i]));

i=BOSS_CURSOR;

}

i++;

FGetLineJumpCom(temp,fp);

}

i=0;

FGetLineJumpCom(temp,fp);

while(temp[0]!='#' && !feof(fp))

{

sscanf(temp,"%d %d %d %d %d",

&MapCoinArray[i].x,

&MapCoinArray[i].y,

&MapCoinArray[i].w,

&MapCoinArray[i].h,

&MapCoinArray[i].id);

MapCoinArray[i].show=1;

MapCoinArray[i].iframe=0;

//索引坐标转化为绝对坐标

MapCoinArray[i].x*=32;

MapCoinArray[i].y*=32;

//设置这个动画元件的最大帧

switch(MapCoinArray[i].id)

{

case ID_ANI_COIN:

MapCoinArray[i].iframemax=4;

break;

default:

MapCoinArray[i].iframemax=2;

break;

}

i++;

iCoinNum++;

FGetLineJumpCom(temp,fp);

}

fclose(fp);

return 1;

}

void GAMEMAP::Init()

{

iGameState=GAME_PRE;

iMatch=0;

iLife=3;

iMoney=0;

//攻击种类

iAttack=ATTACK_NORMAL;

iMenu=0;

viewx=0;

InitMatch();

}

void GAMEMAP::InitMatch()

{

memset(MapArray,0,sizeof(MapArray));

memset(MapBkArray,0,sizeof(MapBkArray));

memset(MapEnemyArray,0,sizeof(MapEnemyArray));

memset(MapCoinArray,0,sizeof(MapCoinArray));

memset(FireArray,0,sizeof(FireArray));

memset(BombArray,0,sizeof(BombArray));

iMapObjNum=0;

iMapBkObjNum=0;

iBombNum=0;

iCoinNum=0;

//设置视图坐标

viewy=0;

ienemyframe=0;

iFireNum=0;

iTimeFire=0;

iBeginFire=0;

ibkobjframe=0;

//获取地图信息

mapinfo=allmapinfo[iMatch];

//初始化攻击对象提示

memset(AttackName,0,sizeof(AttackName));

iAttackLife=0;

iAttackMaxLife=0;

iMapEnemyCursor=0;

}

//显示地图

void GAMEMAP::Show(MYANIOBJ & bmobj)

{

int i;

int xstart,ystart;

int j,k;

for(i=0;i

{

ystart=MapArray[i].y*32;

switch(MapArray[i].id)

{

//进 出的下水道

case ID_MAP_PUMP_IN:

case ID_MAP_PUMP_OUT:

xstart=MapArray[i].x*32;

emNoMask(xstart, ystart,

switch(iMenu)

{

case 0:

t(TIME_GAME_IN_PRE); //停顿两秒

iGameState=GAME_IN_PRE;

break;

case 1:

SetGameState(GAME_HELP);

break;

}

break;

case VK_UP:

MapArray[i].id, 0);

break;

default:

for(j=0;j

{

xstart=MapArray[i].x*32;

for(k=0;k

{

emNoMask(xstart, ystart,

MapArray[i].id, 0);

xstart+=32;

}

ystart+=32;

} // end of for

break;

}//end of switch

}

}

void GAMEMAP::ChangeMap()

{

viewx=0;

//

iMatch=p;

InitMatch();

(BM_USER,nPoint*32,nPoint*32);

le(0,GAMEW*32*MAX_PAGE-32);

//设定视图位置

if( - viewx > 150)

{

SetView(nPoint*32-32);//往左让一格

if(viewx>(x-1)*GAMEW*32)

viewx=(x-1)*GAMEW*32;

}

//设定人物活动范围

it(viewx, GAMEW*32*MAX_PAGE);

//设定背景图片坐标

(BM_USER,viewx,0);

LoadMap();

}

int GAMEMAP::KeyProc(int iKey)

{

int i;

switch(iGameState)

{

case GAME_PRE:

switch(iKey)

{

case 0xd:

//enter

iMenu=(iMenu+1)%2;

break;

case VK_DOWN:

iMenu=(iMenu+1)%2;

break;

}

return 1;//重绘

case GAME_HELP:

switch(iKey)

{

case 0xd: //enter

SetGameState(GAME_PRE);

break;

}

return 1;

case GAME_IN:

//如果人物正在播放动画,拒绝键盘响应

if(i())

{

break;

}

switch(iKey)

{

case VK_RIGHT:

if(!=0)

{

=4;

}

=4;

=0;

break;

case VK_LEFT:

if(!=0)

{

=-4;

}

=-4;

=1;//朝左

break;

case VK_DOWN:

for(i=0;i

{

//下方线

if( LINE_IN_LINE(,

+32,

32,

MapArray[i].x*32,

MapArray[i].y*32,

MapArray[i].w*32)

)

{

if(MapArray[i].id ==

viewx+=ROLE_STEP;

if(viewx>(x-1)*GAMEW*32)

viewx=(x-1)*GAMEW*32;

ID_MAP_PUMP_IN)

{

//进入地图

(ROLE_ANI_DOWN);

iGameState=GAME_PUMP_IN;

t(TIME_GAME_PUMP_WAIT);

}

}

}

break;

case KEY_X: //跳

if(!=0)

break;

=-SPEED_JUMP;

=;//解决x键和方向键的响应问题

break;

case KEY_Z: //FIRE

if(iBeginFire)

break;

iTimeFire=0;

iBeginFire=1;

break;

case 0x7a://f11

iAttack=(iAttack+1)%ATTACK_MAX_TYPE;

break;

//直接通关

= MAX_PAGE*GAMEW*32;

break;

}

break;

}

return 0;

}

void GAMEMAP::SetViewState(int i)

{

iViewState=i;

}

void GAMEMAP::SetGameState(int i)

{

iGameState=i;

}

void GAMEMAP::SetView(int x)

{

viewx=x;

}

//移动视图

//视图不能往右移

void GAMEMAP::MoveView()

{

//只有一屏宽,不移动视图

if(x == 1)

return;

if( - viewx > 150)

{

//设置人物移动的最大范围

it(viewx, GAMEW*32*MAX_PAGE);

}

(BM_USER,viewx,0);

}

void GAMEMAP::ShowBkObj(MYANIOBJ & bmobj)

{

int i;

int xstart,ystart;

for(i=0;i

{

ystart=MapBkArray[i].y*32;

xstart=MapBkArray[i].x*32;

em(xstart,ystart,MapBkArray[i].id,ibkobjframe);

}

}

void GAMEMAP::ShowInfo(HDC h)

{

char temp[50]={0};

SetTextColor(h, TC_WHITE);

SetBkColor(h, TC_BLACK);

sprintf(temp, "LIFE : %d",iLife);

TextOut(h, 220,100,temp,strlen(temp));

sprintf(temp, "WORLD : %d",iMatch+1);

TextOut(h, 220,130,temp,strlen(temp));

}

void GAMEMAP::ShowOther(HDC h)

{

char temp[50]={0};

int xstart;

//show money

sprintf(temp,"MONEY: %d",iMoney);

TextOut(h,viewx+20,20,temp,strlen(temp));

//显示攻击对象生命值

if(iAttackLife)

{

TextOut(h,viewx+ATTACK_TO_TEXT_X,

ATTACK_TO_TEXT_Y,AttackName,strlen(AttackName));

//画生命条

xstart=viewx+ATTACK_TO_X-iAttackMaxLife*10;

emNoMaskWidth(xstart-1,

ATTACK_TO_Y-1,ID_MAP_HEALTH_BK,

iAttackMaxLife*BMP_WIDTH_HEALTH, 0);

emNoMaskWidth(xstart,

ATTACK_TO_Y,ID_MAP_HEALTH,

iAttackLife*BMP_WIDTH_HEALTH, 0);

}

}

void GAMEMAP::ShowAniObj(MYANIOBJ & bmobj)

{

int i;

int xstart,ystart;

//显示金币,和其他物品

for(i=0;i

{

ystart=MapCoinArray[i].y;

xstart=MapCoinArray[i].x;

em(xstart,ystart,MapCoinArray[i].id,

MapCoinArray[i].iframe);

}

//显示敌人

for(i=0;i

{

if (MapEnemyArray[i].show)

{

em(MapEnemyArray[i].x,MapEnemyArray[i].y,

MapEnemyArray[i].id,MapEnemyArray[i].iframe);

}

}

//显示子弹,魔法攻击

for(i=0;i

{

if (FireArray[i].show)

{

ystart=FireArray[i].y;

xstart=FireArray[i].x;

switch(FireArray[i].id)

{

case ID_ANI_FIRE:

em(xstart,ystart,FireArray[i].id,FireArray[i].iframe);

break;

case ID_ANI_FIRE_MAGIC:

em(xstart,ystart, 0,

FireArray[i].iframe);

break;

default:

em(xstart,ystart,FireArray[i].id,FireArray[i].iframe);

break;

}

}

}

//显示爆炸效果

for(i=0;i

{

if (BombArray[i].show)

{

ystart=BombArray[i].y;

xstart=BombArray[i].x;

em(xstart,ystart,BombArray[i].id,

BombArray[i].iframe);

}

}

}

// 返回0,不能走;1,能走

int GAMEMAP::RoleCanMove(int xoff, int yoff)

{

int canmove=1;

int i;

for(i=0;i

{

if( RECT_HIT_RECT(+xoff,

+yoff,

32,

32,

MapArray[i].x*32,

MapArray[i].y*32,

MapArray[i].w*32,

MapArray[i].h*32)

)

{

canmove=0;

if(yoff<0)

{

//碰到了上面的物体要向下落

=1;

}

if(yoff>0)

{

//碰到了下面的物体,要停止下落

ight=0;

=0;

=MapArray[i].y*32-32;//纵坐标要修正

}

break;

}

}

return canmove;

}

//检查人物水平移动过程中,是否走出地图物体边界

int GAMEMAP::CheckRole()

{

int i;

//角色的检查

if( == 0 )

{

//在水平移动,

//检测角色是否站在某个物体上

for(i=0;i

{

//下方线

if( LINE_ON_LINE(,

+32,

32,

MapArray[i].x*32,

MapArray[i].y*32,

MapArray[i].w*32)

)

{

return 1;

}

}

//角色开始下落

=1;

=0;//此时要去除跳跃速度,否那么将变成跳跃,而不是落体

return 0;

}

return 0;

}

void GAMEMAP::ChangeFrame(int itimeclip)

{

int i;

///////////// 帧控制 ////////////////

if(0 == itimeclip% ENEMY_SPEED)

{

//敌人移动

for(i=0;i

{

if(MapEnemyArray[i].show)

{

//帧控制

MapEnemyArray[i].iframe=(MapEnemyArray[i].iframe+1)%MapEnemyArray[i].iframemax;

switch(MapEnemyArray[i].id)

{

case ID_ANI_ENEMY_NORMAL:

case ID_ANI_ENEMY_SWORD:

MapEnemyArray[i].x+=MapEnemyArray[i].movex;

//控制敌人移动

if(MapEnemyArray[i].movex<0)

{

if(MapEnemyArray[i].x<=MapEnemyArray[i].xleft)

{

MapEnemyArray[i].movex=ENEMY_STEP_X;

}

}

else

{

if(MapEnemyArray[i].x>=MapEnemyArray[i].xright)

{

MapEnemyArray[i].movex=-ENEMY_STEP_X;

}

}

break;

}

}

}

}

if(0 == itimeclip% WATER_SPEED)

{

ibkobjframe=1-ibkobjframe;

for(i=0;i

{

if(MapCoinArray[i].show)

{

MapCoinArray[i].iframe=(MapCoinArray[i].iframe+1)%MapCoinArray[i].iframemax;

}

}

}

//子弹,攻击控制

for(i=0;i

{

if(FireArray[i].show)

{

switch(FireArray[i].id)

{

case ID_ANI_FIRE_MAGIC:

FireArray[i].iframe++;

if(FireArray[i].iframe == 2)

{

FireArray[i].x+=FIRE_MAGIC_W;

}

if(FireArray[i].iframe>3)

{

FireArray[i].show=0;

}

break;

default:

FireArray[i].iframe=1-FireArray[i].iframe;

break;

}

}

}

//bomb frame control

for(i=0;i

{

if(BombArray[i].show)

{

BombArray[i].iframe++;

if(BombArray[i].iframe>3)

{

BombArray[i].show=0;

}

}

}

}

int GAMEMAP::CheckAni(int itimeclip)

{

int i,j;

int tempx,tempy;

//检测子弹和敌人的碰撞〔包括魔法攻击〕

for(i=0;i

{

if(MapEnemyArray[i].show)

{

for(j=0;j

{

if (FireArray[j].show)

{

if(RECT_HIT_RECT(FireArray[j].x+FIRE_XOFF,

FireArray[j].y,

FireArray[j].w,

FireArray[j].h,

MapEnemyArray[i].x,

MapEnemyArray[i].y,

MapEnemyArray[i].w,

MapEnemyArray[i].h)

)

{

ClearEnemy(i);

//魔法攻击时,攻击效果的消除由帧控制

switch(iAttack)

{

case ATTACK_NORMAL:

FireArray[j].show=0;

break;

default:

break;

}

return 0;

}

}

}

}

}

//发子弹

if(iBeginFire)

{

if(0 == iTimeFire )

{

FireArray[iFireNum].show=1;

FireArray[iFireNum].iframe = 0;

//子弹方向

if(0==)

{

FireArray[iFireNum].movex=1;

}

else

{

FireArray[iFireNum].movex=-1;

}

switch(iAttack)

{

case ATTACK_NORMAL:

FireArray[iFireNum].id=ID_ANI_FIRE;

FireArray[iFireNum].x=;

FireArray[iFireNum].y=;

FireArray[iFireNum].w=FIREW;

FireArray[iFireNum].h=FIREH;

FireArray[iFireNum].movex*=FIRE_SPEED;

break;

case ATTACK_MAGIC:

FireArray[iFireNum].id=ID_ANI_FIRE_MAGIC;

FireArray[iFireNum].x=-ID_ANI_FIRE_MAGIC_XOFF;

FireArray[iFireNum].y=-ID_ANI_FIRE_MAGIC_YOFF;

FireArray[iFireNum].w=FIRE_MAGIC_W;

FireArray[iFireNum].h=FIRE_MAGIC_H;

FireArray[iFireNum].movex=0;

break;

}

//移动数组游标

iFireNum=(iFireNum+1)%MAX_MAP_OBJECT;

}

iTimeFire=(iTimeFire+1)%TIME_FIRE_BETWEEN;

}

//检查敌人,动画元件

//如果在显示范围之内,那么设置显示属性

for(i=0;i

{

if ( IN_AREA(MapEnemyArray[i].x, viewx, VIEWW) )

{

if(MapEnemyArray[i].health)

{

MapEnemyArray[i].show=1;

//boss触发

switch(MapEnemyArray[i].id)

{

case ID_ANI_BOSS_HOUSE:

//每隔一段时间, 产生新的敌人

if(itimeclip ==

TIME_CREATE_ENEMY)

{

MapEnemyArray[iMapEnemyCursor]=gl_enemy_normal;

MapEnemyArray[iMapEnemyCursor].x=MapEnemyArray[i].x;

MapEnemyArray[iMapEnemyCursor].y=MapEnemyArray[i].y+32;

//移动游标

iMapEnemyCursor=(iMapEnemyCursor+1)%BOSS_CURSOR;

}

break;

case ID_ANI_BOSS_HOUSE_A:

if(itimeclip ==

TIME_CREATE_ENEMY)

{

MapEnemyArray[iMapEnemyCursor]=gl_enemy_normal;

MapEnemyArray[iMapEnemyCursor].x=MapEnemyArray[i].x;

MapEnemyArray[iMapEnemyCursor].y=MapEnemyArray[i].y+32;

MapEnemyArray[iMapEnemyCursor].id=ID_ANI_ENEMY_SWORD;

MapEnemyArray[iMapEnemyCursor].health=ENEMY_SWORD_HEALTH;

//移动游标

iMapEnemyCursor=(iMapEnemyCursor+1)%BOSS_CURSOR;

}

break;

default:

break;

}

}

}

else

{

MapEnemyArray[i].show=0;

}

}

//子弹移动

for(i=0;i

{

if (FireArray[i].show)

{

FireArray[i].x+=FireArray[i].movex;

//子弹超出显示范围,消失

if( FireArray[i].x > viewx+VIEWW ||

MapEnemyArray[i].health--;

if(MapEnemyArray[i].health<=0)

{

MapEnemyArray[i].show=0;

}

FireArray[i].x

{

FireArray[i].show = 0;

}

}

}

//检测角色和金币的碰撞,角色和其他物体的碰撞

for(i=0;i

{

tempx=MapCoinArray[i].x;

tempy=MapCoinArray[i].y;

if ( IN_AREA(tempx, viewx-32, VIEWW) )

{

if( RECT_HIT_RECT(,

,

32,32,

tempx,

tempy,

MapCoinArray[i].w,MapCoinArray[i].h)

)

{

switch(MapCoinArray[i].id)

{

case ID_ANI_COIN:

//碰到金币

iMoney+=10;

ClearCoin(i);

break;

case ID_ANI_ATTACK:

//碰到武器

iAttack=ATTACK_MAGIC;

ClearCoin(i);

break;

}

return 0;

}

}

} // end of for

return 0;

}

//去除敌人数据,只需要设置显示属性,不需要移动数组

void GAMEMAP::ClearEnemy(int i)

{

//create bomb

BombArray[iBombNum].show=1;

BombArray[iBombNum].id=ID_ANI_BOMB;

BombArray[iBombNum].iframe=0;

BombArray[iBombNum].x=MapEnemyArray[i].x-BOMB_XOFF;

BombArray[iBombNum].y=MapEnemyArray[i].y-BOMB_YOFF;

iBombNum=(iBombNum+1)%MAX_MAP_OBJECT;

//去除显示属性

//攻击对象提示

iAttackLife=MapEnemyArray[i].health;

switch(MapEnemyArray[i].id)

{

case ID_ANI_BOSS_HOUSE:

strcpy(AttackName,"普通级火圈");

iAttackMaxLife=BOSS_HEALTH;

break;

case ID_ANI_BOSS_HOUSE_A:

strcpy(AttackName,"战斗级火圈");

iAttackMaxLife=BOSS_A_HEALTH;

break;

case ID_ANI_ENEMY_SWORD:

strcpy(AttackName,"蘑菇刺客");

iAttackMaxLife=ENEMY_SWORD_HEALTH;

break;

default:

strcpy(AttackName,"敌人 ");

break;

}

}

void GAMEMAP::ClearCoin(int i)

{

if(i<0 || i>=iCoinNum)

return;

switch(MapCoinArray[i].id)

{

case ID_ANI_COIN:

//碰到了金币,播放一个得分的动画

BombArray[iBombNum].show=1;

BombArray[iBombNum].id=ID_ANI_COIN_SCORE;

BombArray[iBombNum].iframe=0;

BombArray[iBombNum].x=MapCoinArray[i].x-COIN_XOFF;

BombArray[iBombNum].y=MapCoinArray[i].y-COIN_YOFF;

iBombNum=(iBombNum+1)%MAX_MAP_OBJECT;

break;

}

//减少一个金币,或者减少一个其他物品

for(;i

{

MapCoinArray[i]=MapCoinArray[i+1];

}

iCoinNum--;

}

int GAMEMAP::IsWin()

{

int i;

//检测角色和敌人的碰撞

for(i=0;i

{

if(MapEnemyArray[i].show)

{

if(HLINE_ON_RECT(,

+32,32,

MapEnemyArray[i].x,

MapEnemyArray[i].y,

MapEnemyArray[i].w,

MapEnemyArray[i].h))

{

if(0 == )

{

Fail();

}

else

{

//踩到敌人上

switch(MapEnemyArray[i].id)

{

case ID_ANI_BOSS_HOUSE:

case ID_ANI_BOSS_HOUSE_A:

//踩到蘑菇火圈,失败

Fail();

break;

default:

ClearEnemy(i);

break;

}

}

return 0;

}

}

}

if( > GAMEH*32)

{

Fail();

return 0;

}

//到达目的地后,自动走到屏幕右侧

if( > X_WIN*32 )

{

//已经胜利,但要播放玩家走出屏幕的动画,不接受消息响应

iGameState=GAME_WIN;

//到达目的地

epTo(MAX_PAGE*GAMEW*32,

Y_WIN*32);

}

if( >= MAX_PAGE*GAMEW*32 )

{

//玩家已经走出屏幕,启动一定的时间间隔

iGameState=GAME_WIN_WAIT;

t(TIME_GAME_WIN_WAIT);

iMatch=ap;

if(iMatch>=MAX_MATCH)

{

//全部通过

Init();

iGameState=GAME_PASS;

LoadMap();

}

else

{

InitMatch();

(BM_USER,3*32,8*32);

le(0,GAMEW*32*MAX_PAGE-32);

//加载下一关的地图

LoadMap();

}

}

return 1;

}

void GAMEMAP::Fail_Wait()

{

InitMatch();

if( iLife <=0)

{

Init();

iGameState=GAME_OVER;

t(TIME_GAME_END);

}

else

{

iGameState=GAME_IN_PRE;

t(TIME_GAME_IN_PRE);

}

(BM_USER,3*32,8*32);

le(0,GAMEW*32*MAX_PAGE-32);

LoadMap();

}

void GAMEMAP::Fail()

{

=0;

=0;

iLife--;

=FAIL_FRAME;

iGameState=GAME_FAIL_WAIT;

t(TIME_GAME_FAIL_WAIT);

}

void GAMEMAP::KeyUpProc(int iKey)

{

switch(iKey)

{

case VK_RIGHT:

=0;

break;

case VK_LEFT:

=0;

break;

case KEY_X: //跳

break;

case KEY_Z: //FIRE

iBeginFire=0;

break;

case KEY_W: //调整窗口大小

MoveWindow(hWndMain,

(wwin-GAMEW*32)/2,

(hwin-GAMEH*32)/2,

GAMEW*32,

GAMEH*32+32,

true);

break;

}

}

void GAMEMAP::CodeErr(int i)

{

switch(i)

{

case ERR_MAP_FILE:

SetGameState(GAME_ERR);

break;

default:

break;

}

}

void GAMEMAP::ShowMenu(MYANIOBJ & bmobj)

{

em(115,280+iMenu*30,

ID_ANI_MENU_ARROW);

}

//mario01.h

#if !defined(AFX_MARIO01_H__6851005A_5AC9_497B_B582_012BB1911237__INCLUDED_)

#define

AFX_MARIO01_H__6851005A_5AC9_497B_B582_012BB1911237__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "resource.h"

#endif

// !defined(AFX_MARIO01_H__6851005A_5AC9_497B_B582_012BB1911237__INCLUDED_)

//

// : Defines the entry point for the application.

//

#include "stdafx.h"

#include "resource.h"

#include "bitmaptool.h"

#include "texttool.h"

#include "gamemap.h"

#include "myclock.h"

#define MAX_LOADSTRING 100

char *pPreText[]={

"制作: programking 2021年8月",

"操作: Z:子弹 X:跳 方向键移动 W:默认窗口大小",

"x",

"(上下键选择菜单,回车键确认)",

"开始游戏",

"操作说明",

"博客: :///programking",

"(回车键返回主菜单)"

};

int mapani[2][10]={

{32,32,64,32,32,52,64,32,64,32},

{32,32,64,32,32,25,64,32,64,32},

};

int mapsolid[2][13]={

{32,32,32,32,32,32,32,32,32,64,64,20,100},

{32,32,32,32,32,32,32,32,32,64,64,10,12}

};

int mapanibk[2][4]={

{96,96,96,96},

{64,64,64,64},

};

int mapanimagic[2][1]={

{192},

{128}

};

//所有地图信息

struct MAPINFO allmapinfo[]={

{1,3,66,7,0,5},

{2,4,25,4,1,5},

{MAX_MATCH,-1,-1,-1,2,5},

{-1,0,3,8,3,1},

{-1,1,3,8,3,2}

};

//普通蘑菇兵

struct ROLE gl_enemy_normal=

{

0,

0,

32,

32,

ID_ANI_ENEMY_NORMAL,

0,

2,

0,

0,

-ENEMY_STEP_X,//speed

1,

1

};

//跟踪打印

//FILEREPORT f1;

MYCLOCK c1;

GAMEMAP gamemap;

MYBITMAP bmPre;

MYBKSKY bmSky;

MYANIOBJ bmMap;

MYANIOBJ bmMapBkObj;

MYANIOBJ bmAniObj;

MYROLE rmain;

MYANIMAGIC bmMagic;

MYFONT myfont;

HDC hwindow,hscreen,hmem,hmem2;

HBITMAP hmapnull;

int wwin,hwin;

int wwingame,hwingame;

HWND hWndMain;

// Global Variables:

HINSTANCE hInst; //

current instance

TCHAR szTitle[MAX_LOADSTRING];

// The title bar text

TCHAR szWindowClass[MAX_LOADSTRING];

// The title bar text

// Foward declarations of functions included in this code module:

ATOM MyRegisterClass(HINSTANCE

hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,

LPARAM);

LRESULT CALLBACK About(HWND, UINT, WPARAM,

LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

// TODO: Place code here.

MSG msg;

HACCEL hAccelTable;

// Initialize global strings

LoadString(hInstance, IDS_APP_TITLE, szTitle,

MAX_LOADSTRING);

LoadString(hInstance, IDC_MARIO01, szWindowClass,

MAX_LOADSTRING);

MyRegisterClass(hInstance);

// Perform application initialization:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance,

(LPCTSTR)IDC_MARIO01);

// Main message loop:

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(, hAccelTable,

&msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return ;

}

//

// FUNCTION: MyRegisterClass()

//

// PURPOSE: Registers the window class.

//

// COMMENTS:

//

// This function and its usage is only necessary if you want this

code

// to be compatible with Win32 systems prior to the

'RegisterClassEx'

// function that was added to Windows 95. It is important to call

this function

// so that the application will get 'well formed' small icons

associated

// with it.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

= sizeof(WNDCLASSEX);

= CS_HREDRAW | CS_VREDRAW;

dProc = (WNDPROC)WndProc;

xtra = 0;

xtra = 0;

nce = hInstance;

= LoadIcon(hInstance,

(LPCTSTR)IDI_MARIO01);

r = LoadCursor(NULL, IDC_ARROW);

kground = (HBRUSH)(COLOR_WINDOW+1);

// nuName = (LPCSTR)IDC_MARIO01;

nuName = NULL;

assName = szWindowClass;

m = LoadIcon(nce,

(LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);

}

//

// FUNCTION: InitInstance(HANDLE, int)

//

// PURPOSE: Saves instance handle and creates main window

//

// COMMENTS:

//

// In this function, we save the instance handle in a global

variable and

// create and display the main program window.

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Store instance handle in our global

variable

wwingame=GAMEW*32;

hwingame=GAMEH*32;

wwin=GetSystemMetrics(SM_CXSCREEN);

hwin=GetSystemMetrics(SM_CYSCREEN);

hWnd = CreateWindow(szWindowClass, szTitle,

WS_OVERLAPPEDWINDOW,

(wwin-wwingame)/2, (hwin-hwingame)/2,

wwingame, hwingame+32, NULL, NULL, hInstance,

NULL);

if (!hWnd)

{

return FALSE;

}

hWndMain=hWnd;

//dc

hwindow=GetDC(hWnd);

hscreen=CreateCompatibleDC(hwindow);

hmem=CreateCompatibleDC(hwindow);

hmem2=CreateCompatibleDC(hwindow);//用于魔法特效的临时DC

//用空位图初始化各个DC

hmapnull=CreateCompatibleBitmap(hwindow,GAMEW*32*5,GAMEH*32);

SelectObject(hscreen,hmapnull);

SelectObject(hmem,hmapnull);

SelectObject(hmem2,hmapnull);

ReleaseDC(hWnd, hwindow);

//pic

(hInstance,IDB_BITMAP_PRE1,1,5);

ice(hscreen,hmem,GAMEW*32,GAMEH*32);

(BM_USER,0,0);

(hInstance,IDB_BITMAP_MAP_SKY,1,4);

ice(hscreen,hmem,GAMEW*32*MAX_PAGE,GAMEH*32);

(BM_USER,0,0);

(hInstance,IDB_BITMAP_MAP,1,1);

ice(hscreen,hmem,GAMEW*32*MAX_PAGE,GAMEH*32);

iList(mapsolid[0],mapsolid[1],

sizeof(mapsolid[0])/sizeof(int),0);

(hInstance,IDB_BITMAP_MAP_BK,1,1);

ice(hscreen,hmem,GAMEW*32*MAX_PAGE,GAMEH*32);

iList(mapanibk[0],mapanibk[1],sizeof(mapanibk[0])/sizeof(int),1);

(hInstance,IDB_BITMAP_ANI,1,1);

ice(hscreen,hmem,GAMEW*32*MAX_PAGE,GAMEH*32);

iList(mapani[0],mapani[1],sizeof(mapani[0])/sizeof(int),1);

(hInstance,IDB_BITMAP_MAGIC,1,1);

ice(hscreen,hmem, hmem2);

iList(mapanimagic[0],mapanimagic[1],sizeof(mapanimagic[0])/sizeof(int));

(hInstance,IDB_BITMAP_ROLE,5,1);

ice(hscreen,hmem,GAMEW*32*MAX_PAGE,GAMEH*32);

//text

ice(hscreen);

//map

();

(BM_USER,3*32,8*32);

le(0,GAMEW*32*MAX_PAGE-32);

if(!p())

{

r(ERR_MAP_FILE);

}

ice(hscreen);

(hWnd, GAME_TIME_CLIP ,-1);

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

//

// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)

//

// PURPOSE: Processes messages for the main window.

//

// WM_COMMAND - process the application menu

// WM_PAINT - Paint the main window

// WM_DESTROY - post a quit message and return

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,

WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

TCHAR szHello[MAX_LOADSTRING];

LoadString(hInst, IDS_HELLO, szHello,

MAX_LOADSTRING);

switch (message)

{

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Parse the menu selections:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst,

(LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

default:

return DefWindowProc(hWnd, message,

wParam, lParam);

}

break;

case WM_PAINT:

hwindow = BeginPaint(hWnd, &ps);

// TODO: Add any drawing

//初始化空图

SelectObject(hscreen,hmapnull);

switch(tate)

{

case GAME_ERR:

=0;

//显示错误信息

h(2,2,0);

Color(TC_WHITE,TC_BLACK);

Font(0);

xt(150,290,pPreText[3]);

break;

case GAME_PRE:

=0;

h(2,2,0);

Font(0);

Color(TC_BLACK,

TC_YELLOW_0);

xt(150,260,pPreText[4]);

xt(150,290,pPreText[5]);

xt(150,320,pPreText[6]);

nu(bmAniObj);

break;

case GAME_HELP:

=0;

h(2,2,4);

Font(0);

Color(TC_BLACK,

TC_YELLOW_0);

xt(150,230,pPreText[8]);

xt(50,260,pPreText[1]);

xt(50,290,pPreText[0]);

xt(50,320,pPreText[7]);

break;

case GAME_IN_PRE:

=0;

h(2,2,2);

fo(hscreen);

break;

case GAME_IN:

case GAME_WIN:

case GAME_FAIL_WAIT:

case GAME_PUMP_IN:

llStretch(2,2,mp);

Obj(bmMapBkObj);

(bmMap);

iObj(bmAniObj);

her(hscreen);

();

break;

case GAME_OVER:

=0;

//输出图片GAME OVER

h(2,2,1);

break;

case GAME_PASS:

=0;

//输出图片GAME OVER

h(2,2,3);

break;

}

if(nScale)

{

StretchBlt(hwindow,0,0,

wwingame,hwingame,

hscreen,

,0,

GAMEW*32,GAMEH*32,

SRCCOPY);

}

else

{

BitBlt(hwindow,0,0,GAMEW*32,GAMEH*32,hscreen,,0,SRCCOPY);

}

EndPaint(hWnd, &ps);

break;

case WM_TIMER:

switch(tate)

{

case GAME_PRE:

nt();

if(0 == %MENU_ARROW_TIME)

{

InvalidateRect(hWnd,NULL,false);

}

break;

case GAME_IN_PRE:

if(nt())

{

eState(GAME_IN);

t(TIME_GAME_IN);

}

InvalidateRect(hWnd,NULL,false);

break;

case GAME_IN:

case GAME_WIN:

nt();

if(0 == %SKY_TIME)

{

ll(SKY_SPEED);//云彩移动

}

Frame();//帧控制

();//人物移动

ew();//视图移动

ole();//角色检测

ni();//逻辑数据检测

();

InvalidateRect(hWnd,NULL,false);

break;

case GAME_WIN_WAIT:

if(nt())

{

eState(GAME_IN_PRE);

InvalidateRect(hWnd,NULL,false);

}

break;

case GAME_PUMP_IN:

if(nt())

{

Map();

eState(GAME_IN);

t(TIME_GAME_IN);

(ROLE_ANI_UP);

}

InvalidateRect(hWnd,NULL,false);

break;

case GAME_FAIL_WAIT:

if(nt())

{

_Wait();

}

break;

case GAME_PASS:

if(nt())

{

eState(GAME_PRE);

}

InvalidateRect(hWnd,NULL,false);

break;

case GAME_OVER:

if(nt())

{

eState(GAME_PRE);

return 0;

}

// Mesage handler for about box.

LRESULT CALLBACK About(HWND hDlg, UINT message,

WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:

}

InvalidateRect(hWnd,NULL,false);

break;

}

break;

case WM_KEYDOWN:

if(c(wParam))

InvalidateRect(hWnd,NULL,false);

break;

case WM_KEYUP:

roc(wParam);

break;

case WM_SIZE:

wwingame=LOWORD(lParam);

hwingame=HIWORD(lParam);

if( wwingame <= GAMEW*32 || hwingame <=

GAMEH*32)

{

wwingame = GAMEW*32;

hwingame = GAMEH*32;

nScale = 0;

}

else

{

if(wwingame*3 > hwingame*4)

{

//宽高不成比例

wwingame = hwingame*4/3;

}

else

{

hwingame = wwingame*3/4;

}

nScale =1;

}

break;

case WM_DESTROY:

y();

DeleteObject((HBITMAP)hmapnull);

DeleteDC(hwindow);

DeleteDC(hscreen);

DeleteDC(hmem);

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam,

lParam);

}

if (LOWORD(wParam) == IDOK ||

LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam));

return TRUE;

}

break;

}

return FALSE;

}

//myclock.h

//clock 1.0

#ifndef __MYCLOCK

#define __MYCLOCK

#include "stdio.h"

class MYCLOCK

{

public:

MYCLOCK()

{

iNum=0;

iIsActive=0;

iNumShow=0;

iElapse=100;

ishow=0;

}

~MYCLOCK()

{

Destroy();

}

void Begin(HWND hw,int elapse,int timetotal)

{

if(iIsActive)

return;//已经启动了,直接返回

hWnd=hw;

iElapse=elapse;

SetTimer(hWnd,1,iElapse,NULL);

iNum=1000/iElapse;//一秒钟的时间消息数量

iNumShow=timetotal;

iIsActive=1;

}

void Destroy()

{

if(iIsActive)

{

iIsActive=0;

KillTimer(hWnd,1);

}

}

//入参: 秒数

void ReStart(int timetotal)

{

iNumShow=timetotal;

iNum=1000/iElapse;

ishow=1;

}

//////////////////////////// 显示局部

void SetDevice(HDC h)

{

hDC=h;

}

void Show(int x,int y)

{

char temp[20]={0};

if(!ishow)

return;

sprintf(temp,"TIME: %d ",iNumShow);

TextOut(hDC,x, y, temp,strlen(temp));

}

//计数,但不销毁

int DecCount()

{

iNum--;

if(iNum==0)

{

//过了一秒

iNum=1000/iElapse;

iNumShow--;

if(iNumShow<=0)

{

//不销毁

return 1;

}

}

return 0;

}

int Dec()

{

iNum--;

if(iNum<=0)

{

//过了一秒

iNum=1000/iElapse;

iNumShow--;

if(iNumShow<=0)

{

iNumShow=0;

Destroy();

return 1;

}

}

return 0;

}

//

void SetShow(int i)

{

ishow=i;

}

public:

HWND hWnd;

HDC hDC;

int iNum;

int iNumShow;

int iElapse;

int iIsActive;

int ishow;

};

#endif

//texttool.h

#ifndef __TEXTTOOL

#define __TEXTTOOL

#define TEXT_BOTTOM_RIGHT 0

#define TEXT_BOTTOM_CENTER 1

#define TEXT_CENTER 2

#define TEXT_USER 3

#define TC_BLACK RGB(0,0,0)

#define TC_BLUE RGB(0,0,255)

#define TC_WHITE RGB(255,255,255)

#define TC_YELLOW_0 RGB(207,193,0)

//////////////////// FONT ///////////////////

class MYFONT

{

public:

MYFONT();

~MYFONT();

void SetDevice(HDC h);

void SelectFont(int i);

void SelectOldFont();

void ShowText(int x,int y,char *p);

void SetColor(COLORREF cbk, COLORREF ctext);

void SelectColor(COLORREF cbk, COLORREF ctext);

//dc

HDC hdc;

//font

HFONT hf[5];

HFONT oldhf;

//color

COLORREF c1;

COLORREF c2;

};

#endif

//

// Finishing

#include "stdafx.h"

#include "texttool.h"

///////////////////////// FONT ///////////////////

MYFONT::MYFONT()

{

char temp[10]={0};

int i;

for(i=0;i<=sizeof(hf)/sizeof(HFONT);i++)

{

sprintf(temp,"black%d",i);

hf[i]=CreateFont(10*i,0,0,0,FW_NORMAL,

0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,temp);

}

}

MYFONT::~MYFONT()

{

}

void MYFONT::SetDevice(HDC h)

{

hdc=h;

//设置默认字体

oldhf=(HFONT)SelectObject(hdc,hf[0]);

SelectObject(hdc,oldhf);

}

void MYFONT::SelectFont(int i)

{

SelectObject(hdc,hf[i]);

}

void MYFONT::SelectOldFont()

{

SelectObject(hdc,oldhf);

}

void MYFONT::ShowText(int x,int y,char *p)

{

TextOut(hdc,x,y,p,strlen(p));

}

void MYFONT::SetColor(COLORREF cbk, COLORREF ctext)

{

c1=cbk;

c2=ctext;

}

void MYFONT::SelectColor(COLORREF cbk, COLORREF ctext)

{

SetBkColor(hdc,cbk);

SetTextColor(hdc,ctext);

}

//tool01.h

#ifndef __TOOL01

#define __TOOL01

#define ISTEXT(x) ((x)>=32 && (x)<=126)

#define DISTANCE(x,y,x2,y2)

(((x)-(x2))*((x)-(x2))+((y)-(y2))*((y)-(y2)))

//点与矩形碰撞

#define POINT_IN_RECT(x,y,x1,y1,w,h) ((y)>(y1) && (y)<(y1)+(h)

&& (x)>(x1) &&

(x)<(x1)+(w))

//点在一个区间内

#define IN_AREA(x,x1,w) ( (x)>(x1) && (x)<(x1)+(w) )

//两个线段重叠

#define LINE_ON_LINE(x1,y1,w1,x2,y2,w2) ((y1)==(y2)

&& (x1)<(x2)+(w2)

&& (x1)>(x2)-(w1) )

#define LINE_IN_LINE(x1,y1,w1,x2,y2,w2) ((y1)==(y2)

&& (x1)>=(x2) &&

(x1)+(w1)<=(x2)+(w2) )

//竖线与矩形碰撞

#define VLINE_IN_RECT(x,y,h,x1,y1,w1,h1) ( (y)+(h)>(y1) &&

(y)<(y1)+(h1)

&& (x)>(x1) &&

(x)<(x1)+(w1) )

//横线与矩形碰撞

#define HLINE_IN_RECT(x,y,w,x1,y1,w1,h1) ( (y)>(y1) &&

(y)<(y1)+(h1)

&& (x)+(w)>(x1)

&& (x)<(x1)+(w1) )

//横线与矩形碰撞

#define HLINE_ON_RECT(x,y,w,x1,y1,w1,h1) ( (y)>=(y1) &&

(y)<=(y1)+(h1)

&& (x)+(w)>=(x1)

&& (x)<=(x1)+(w1) )

//矩形与矩形碰撞

#define RECT_HIT_RECT(x,y,w,h,x1,y1,w1,h1) ( (y)+(h)>(y1) &&

(y)<(y1)+(h1)

&& (x)+(w)>(x1)

&& (x)<(x1)+(w1) )

int CmpDistance(int x,int y,int x2,int y2,int l)

{

if(DISTANCE(x,y,x2,y2)<=l*l)

{

return 1;

}

return 0;

}

int FGetLineJumpCom(char *pchar,FILE *fp)

{

int ch=-1;

int i=0;

//过滤前面的非法字符

while(!ISTEXT(ch) && !feof(fp))

{

ch=fgetc(fp);

}

if(!ISTEXT(ch))

{

pchar[0]=0;

return 0;

}

//jump comment begin

if(';' == ch)

{

while(ISTEXT(ch) && !feof(fp) )

{

ch=fgetc(fp);

}

while(!ISTEXT(ch) && !feof(fp))

{

ch=fgetc(fp);

}

}

//jump comment end

//得到新的一行

while(ISTEXT(ch) && !feof(fp))

{

pchar[i]=ch;

i++;

ch=fgetc(fp);

}

pchar[i]=0;

return 1;

}

int FGetLine(char *pchar,FILE *fp)

{

int ch=-1;

int i=0;

//过滤前面的非法字符

while(!ISTEXT(ch) && !feof(fp))

{

ch=fgetc(fp);

}

if(!ISTEXT(ch))

{

pchar[0]=0;

return 0;

}

while(ISTEXT(ch) && !feof(fp))

{

pchar[i]=ch;

i++;

ch=fgetc(fp);

}

pchar[i]=0;

return 1;

}

#define KEY_A 65

#define KEY_B 66

#define KEY_C 67

#define KEY_D 68

#define KEY_E 69

#define KEY_F 70

#define KEY_G 71

#define KEY_H 72

#define KEY_I 73

#define KEY_J 74

#define KEY_K 75

#define KEY_L 76

#define KEY_M 77

#define KEY_N 78

#define KEY_O 79

#define KEY_P 80

#define KEY_Q 81

#define KEY_R 82

#define KEY_S 83

#define KEY_T 84

#define KEY_U 85

#define KEY_V 86

#define KEY_W 87

#define KEY_X 88

#define KEY_Y 89

#define KEY_Z 90

#endif