超级玛丽增强版源代码

超级玛丽增强版源代码
超级玛丽增强版源代码

//bitmaptool.h

#ifndef __BITMAPTOOL

#define __BITMAPTOOL

#include "filereport.h"

#define BM_BOTTOM_RIGHT 0

#define BM_BOTTOM_CENTER 1

#define BM_CENTER 2

#define BM_USER 3

//

class MYBITMAP

{

public:

MYBITMAP();

~MYBITMAP();

//初始化

void Init(HINSTANCE hInstance,int iResource,int row,int col);

void SetDevice(HDC hdest,HDC hsrc,int wwin,int hwin);

//

void SetPos(int istyle,int x,int y);

//显示

void Draw(DWORD dwRop);

void Stretch(int x,int y);

void Stretch(int x,int y,int id);

void Show(int x,int y);

void ShowCenter(int y);

void ShowLoop(int left,int top,int right,int bottom,int iframe);

void ShowNoBack(int x,int y,int iFrame);

void ShowNoBackLoop(int x,int y,int iFrame,int iNum);

//动画播放

void ShowAni();

void SetAni(int x,int y);

// FILEREPORT f;

HBITMAP hBm;

public:

//按照行列平均分成几个

int inum;

int jnum;

int width;

int height;

int screenwidth;

int screenheight;

HDC hdcdest;

HDC hdcsrc;

//当前位置

int xpos;

int ypos;

int iStartAni;

};

class MYBKSKY:public MYBITMAP

{

public:

MYBKSKY();

~MYBKSKY();

//show

void DrawRoll(); //循环补空

void DrawRollStretch(int x,int y);

void DrawRollStretch(int x,int y,int id);

void MoveTo(int x,int y);

void MoveRoll(int x);

//data

int xseparate;

};

#define BM_SQUARE 1

class MY ANIOBJ:public MYBITMAP

{

public:

MY ANIOBJ();

~MY ANIOBJ();

//init list

void InitAniList(int *pw,int *ph,int inum,int ismask);

void InitAniList(int style,int a,int b);

//show

void DrawItem(int x,int y,int id,int iframe);

void DrawItemNoMask(int x,int y,int id,int iframe);

//指定宽度

void DrawItemNoMaskWidth(int x,int y,int id,int w,int iframe);

//自动播放

void PlayItem(int x,int y,int id);

//

int wlist[20];

int hlist[20];

int ylist[20];

int iframeplay;

};

class MY ANIMAGIC:public MYBITMAP

{

public:

MY ANIMAGIC();

~MY ANIMAGIC();

//init list

void InitAniList(int *pw,int *ph,int inum);

void SetDevice(HDC hdest,HDC hsrc,HDC htemp);

//show

void DrawItem(int x,int y,int id,int iframe);

//

int wlist[20];

int hlist[20];

int ylist[20];

HDC hdctemp;

};

class MYROLE:public MYBITMAP

{

public:

MYROLE();

~MYROLE();

//init

void InitRole(int xleft, int xright);

void SetLimit(int xleft, int xright);

//show

void Draw();

void Draw(int x,int y,int iframe);

void ChangeFrame();

void SetState(int i);

void Move();

void Jump();

//ANI

void MoveTo(int x,int y);

void MoveOffset(int x,int y);

void MoveStepTo(int x,int y);//向目的地移动单位距离

void PlayAni();//播放一段动画

void SetAni(int istyle);

int IsInAni();//是否正在播放动画

//data

int iState;

int iFrame;

int minx;

int maxx;

//move

int movex;

int movey;

// jump

int jumpheight;

int jumpx;

//方向

int idirec;

//动画

int iAniBegin;

int iparam1;

int iAniStyle;

};

#endif

// bitmaptool.cpp

// Finishing https://www.360docs.net/doc/9c1076293.html,

#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(iResour ce));

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

width=bm.bmWidth/inum;

height=bm.bmHeight/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,SRCCO PY);

}

}

}

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,iFram e*width,height/2,SRCAND);

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

}

void MYBITMAP::ShowAni()

{

/* if(!iStartAni)

return;

SelectObject(hdcsrc,hBm);

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

BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,framenow*wid th,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(!gamemap.RoleCanMove(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 /////////////////////

MY ANIOBJ::MY ANIOBJ()

{

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

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

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

iframeplay=0;

}

MY ANIOBJ::~MY ANIOBJ()

{}

void MY ANIOBJ::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 MY ANIOBJ::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 MY ANIOBJ::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 MY ANIOBJ::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 MY ANIOBJ::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 MY ANIOBJ::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/////////////////////

MY ANIMAGIC::MY ANIMAGIC()

{

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

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

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

}

MY ANIMAGIC::~MY ANIMAGIC()

{}

void MY ANIMAGIC::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 MY ANIMAGIC::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 MY ANIMAGIC::SetDevice(HDC hdest, HDC hsrc, HDC 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

//filereport.cpp

#include "stdafx.h"

#include "filereport.h"

#include "stdio.h"

#include "stdlib.h"

FILEREPORT::FILEREPORT()

{

fp=fopen("trace.txt","w");

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

}

FILEREPORT::FILEREPORT(char *p)

{

fp=fopen(p,"w");

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

}

FILEREPORT::~FILEREPORT()

{

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(MY ANIOBJ & bmobj);

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

void ShowBkObj(MY ANIOBJ & bmobj);

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

void ShowAniObj(MY ANIOBJ & bmobj);

void ShowInfo(HDC h);

void ShowOther(HDC h);

//键盘处理

int KeyProc(int iKey);

void KeyUpProc(int iKey);

void MoveV iew();

//设置视图起始坐标

void Set V iew(int x);

void Set V iewState(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(MY ANIOBJ & 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 iV iewState;

//地图数据

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

//gamemap.cpp

// Finishing https://www.360docs.net/doc/9c1076293.html,

#include "stdafx.h"

#include "gamemap.h"

#include "myclock.h"

#include "tool01.h"

#include "texttool.h"

extern int wwin,hwin;

extern HWND hWndMain;

//基本图像

extern MY ANIOBJ bmMap;

//天空背景

extern MYBKSKY bmSky;

//角色

extern MYROLE rmain;

//计时器

extern MYCLOCK c1; extern MY ANIMAGIC 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(P A TH_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(MY ANIOBJ & 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;

bmobj.DrawItemNoMask(xstart, ystart, MapArray[i].id, 0);

break;

default:

for(j=0;j

{

xstart=MapArray[i].x*32;

for(k=0;k

{

bmobj.DrawItemNoMask(xstart, ystart, MapArray[i].id, 0);

xstart+=32;

}

ystart+=32;

} // end of for

break;

}//end of switch

}

}

void GAMEMAP::ChangeMap()

{

viewx=0;

//

iMatch=mapinfo.iSubMap;

InitMatch();

rmain.SetPos(BM_USER,mapinfo.xReturnPoint*32,mapinfo.y ReturnPoint*32);

rmain.InitRole(0,GAMEW*32*MAX_P AGE-32);

//设定视图位置

if(rmain.xpos - viewx > 150)

{

SetView(mapinfo.xReturnPoint*32-32);//往左让一格

if(viewx>(mapinfo.viewmax-1)*GAMEW*32)

viewx=(mapinfo.viewmax-1)*GAMEW*32;

}

//设定人物活动范围

rmain.SetLimit(viewx, GAMEW*32*MAX_P AGE);

//设定背景图片坐标

bmSky.SetPos(BM_USER,viewx,0);

LoadMap();

}

//根据人物与视图的位置关系决定是否移动视图

int GAMEMAP::KeyProc(int iKey)

{

int i;

switch(iGameState)

{

case GAME_PRE:

switch(iKey)

{

case 0xd:

//enter

switch(iMenu)

{

case 0:

c1.ReStart(TIME_GAME_IN_PRE); //停顿两秒

iGameState=GAME_IN_PRE;

break;

case 1:

SetGameState(GAME_HELP);

break;

}

break;

case VK_UP:

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(rmain.IsInAni())

{

break;

}

switch(iKey)

{

case VK_RIGHT:

if(rmain.movey!=0)

{

rmain.jumpx=4;

}

rmain.movex=4;

rmain.idirec=0;

break;

case VK_LEFT:

if(rmain.movey!=0)

{

rmain.jumpx=-4;

}

rmain.movex=-4;

rmain.idirec=1;//朝左

break;

case VK_DOWN:

for(i=0;i

{

//下方线

if( LINE_IN_LINE(rmain.xpos,

rmain.ypos+32,

32,

MapArray[i].x*32,

MapArray[i].y*32,

MapArray[i].w*32)

)

{

if(MapArray[i].id == ID_MAP_PUMP_IN)

{

//进入地图

rmain.SetAni(ROLE_ANI_DOWN);

iGameState=GAME_PUMP_IN;

c1.ReStart(TIME_GAME_PUMP_W AIT);

}

}

}

break;

case KEY_X: //跳

if(rmain.movey!=0)

break;

rmain.movey=-SPEED_JUMP;

rmain.jumpx=rmain.movex;//解决x键和方向键的响应问题

break;

case KEY_Z: //FIRE

if(iBeginFire)

break;

iTimeFire=0;

iBeginFire=1;

break;

case 0x7a://f11

iAttack=(iAttack+1)%A TTACK_MAX_TYPE;

break;

case 0x7b://f12

//直接通关

rmain.xpos = MAX_PAGE*GAMEW*32;

break;

}

break;

}

return 0;

}

void GAMEMAP::SetV iewState(int i)

{

iViewState=i;

}

void GAMEMAP::SetGameState(int i)

{

iGameState=i;

}

void GAMEMAP::SetV iew(int x)

{

viewx=x;

}

//移动视图

//视图不能往右移

void GAMEMAP::MoveV iew()

{

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

if(mapinfo.viewmax == 1)

return;

if(rmain.xpos - viewx > 150)

{

viewx+=ROLE_STEP;

if(viewx>(mapinfo.viewmax-1)*GAMEW*32)

viewx=(mapinfo.viewmax-1)*GAMEW*32;

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

rmain.SetLimit(viewx, GAMEW*32*MAX_P AGE);

}

bmSky.SetPos(BM_USER,viewx,0);

}

void GAMEMAP::ShowBkObj(MY ANIOBJ & bmobj)

{

int i;

int xstart,ystart;

for(i=0;i

{

ystart=MapBkArray[i].y*32;

xstart=MapBkArray[i].x*32;

bmobj.DrawItem(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;

bmMap.DrawItemNoMaskWidth(xstart-1,

ATTACK_TO_Y-1,ID_MAP_HEAL TH_BK,

iAttackMaxLife*BMP_WIDTH_HEALTH, 0);

bmMap.DrawItemNoMaskWidth(xstart,

ATTACK_TO_Y,ID_MAP_HEAL TH,

iAttackLife*BMP_WIDTH_HEALTH, 0);

}

}

void GAMEMAP::ShowAniObj(MY ANIOBJ & bmobj)

{

int i;

int xstart,ystart;

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

for(i=0;i

{

ystart=MapCoinArray[i].y;

xstart=MapCoinArray[i].x;

bmobj.DrawItem(xstart,ystart,MapCoinArray[i].id, MapCoinArray[i].iframe);

}

//显示敌人

for(i=0;i

{

if (MapEnemyArray[i].show)

{

bmobj.DrawItem(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:

bmobj.DrawItem(xstart,ystart,FireArray[i].id,FireArray[i].ifra me);

break;

case ID_ANI_FIRE_MAGIC:

bmMagic.DrawItem(xstart,ystart, 0, FireArray[i].iframe);

break;

default:

bmobj.DrawItem(xstart,ystart,FireArray[i].id,FireArray[i].ifra me);

break;

}

}

}

//显示爆炸效果

for(i=0;i

{

if (BombArray[i].show)

{

ystart=BombArray[i].y;

xstart=BombArray[i].x;

bmobj.DrawItem(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(rmain.xpos+xoff,

rmain.ypos+yoff,

32,

32,

MapArray[i].x*32,

MapArray[i].y*32,

MapArray[i].w*32,

MapArray[i].h*32)

)

{

canmove=0;

if(yoff<0)

{

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

rmain.movey=1;

}

if(yoff>0)

{

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

rmain.jumpheight=0;

rmain.movey=0;

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

}

break;

}

}

return canmove;

}

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

int GAMEMAP::CheckRole()

{

int i;

//角色的检查

if(rmain.movey == 0 )

{

//在水平移动,

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

for(i=0;i

{

//下方线

if( LINE_ON_LINE(rmain.xpos,

rmain.ypos+32,

32,

MapArray[i].x*32,

MapArray[i].y*32,

MapArray[i].w*32)

)

{

return 1;

}

}

//角色开始下落

rmain.movey=1;

rmain.jumpx=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% WA TER_SPEED)

{

ibkobjframe=1-ibkobjframe;

for(i=0;i

{

if(MapCoinArray[i].show)

{

MapCoinArray[i].iframe=(MapCoinArray[i].iframe+1)%MapC oinArray[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==rmain.idirec)

{

FireArray[iFireNum].movex=1;

}

else

{

FireArray[iFireNum].movex=-1;

}

switch(iAttack)

{

case ATTACK_NORMAL:

FireArray[iFireNum].id=ID_ANI_FIRE;

FireArray[iFireNum].x=rmain.xpos;

FireArray[iFireNum].y=rmain.ypos;

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=rmain.xpos-ID_ANI_FIRE_MAGIC_ XOFF;

FireArray[iFireNum].y=rmain.ypos-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_CREA TE_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_CREA TE_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_S WORD;

MapEnemyArray[iMapEnemyCursor].health=ENEMY_SWO RD_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 || 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(rmain.xpos,

rmain.ypos,

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_A TTACK:

//碰到武器

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_XO FF;

BombArray[iBombNum].y=MapEnemyArray[i].y-BOMB_YO FF;

iBombNum=(iBombNum+1)%MAX_MAP_OBJECT;

//清除显示属性

MapEnemyArray[i].health--;

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

{

MapEnemyArray[i].show=0;

}

//攻击对象提示

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(rmain.xpos,

rmain.ypos+32,32,

MapEnemyArray[i].x,

MapEnemyArray[i].y,

MapEnemyArray[i].w,

MapEnemyArray[i].h))

{

if(0 == rmain.movey)

{

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(rmain.ypos > GAMEH*32)

{

Fail();

return 0;

}

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

if(rmain.xpos > X_WIN*32 )

{

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

iGameState=GAME_WIN;

//到达目的地

rmain.MoveStepTo(MAX_PAGE*GAMEW*32,

Y_WIN*32);

}

if(rmain.xpos >= MAX_PAGE*GAMEW*32 )

{

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

iGameState=GAME_WIN_WAIT;

c1.ReStart(TIME_GAME_WIN_W AIT);

iMatch=mapinfo.iNextMap;

if(iMatch>=MAX_MA TCH)

{

//全部通过

Init();

iGameState=GAME_PASS;

LoadMap();

}

else

{

InitMatch();

rmain.SetPos(BM_USER,3*32,8*32);

rmain.InitRole(0,GAMEW*32*MAX_P AGE-32);

//加载下一关的地图

LoadMap();

}

}

return 1;

}

void GAMEMAP::Fail_Wait()

{

InitMatch();

if( iLife <=0)

{

Init();

iGameState=GAME_OVER;

c1.ReStart(TIME_GAME_END);

}

else

{

iGameState=GAME_IN_PRE;

c1.ReStart(TIME_GAME_IN_PRE);

}

rmain.SetPos(BM_USER,3*32,8*32);

rmain.InitRole(0,GAMEW*32*MAX_P AGE-32);

LoadMap();

}

void GAMEMAP::Fail()

{

rmain.movex=0;

rmain.movey=0;

iLife--;

rmain.iFrame=FAIL_FRAME;

iGameState=GAME_F AIL_WAIT;

c1.ReStart(TIME_GAME_F AIL_WAIT);

}

void GAMEMAP::KeyUpProc(int iKey)

{

switch(iKey)

{

case VK_RIGHT:

rmain.movex=0;

break;

case VK_LEFT:

rmain.movex=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(MY ANIOBJ & bmobj)

{

bmobj.PlayItem(115,280+iMenu*30,

ID_ANI_MENU_ARROW);

}

//mario01.h

#if !defined(AFX_MARIO01_H__6851005A_5AC9_497B_B582_0 12BB1911237__INCLUDED_)

#define

AFX_MARIO01_H__6851005A_5AC9_497B_B582_012BB191123 7__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "resource.h"

#endif

// !defined(AFX_MARIO01_H__6851005A_5AC9_497B_B582_01 2BB1911237__INCLUDED_)

//mario01.cpp

// mario01.cpp : 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 2008年8月",

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

"x",

"地图文件错误,请修正错误后重新启动程序。",

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

"开始游戏",

"操作说明",

"博客: https://www.360docs.net/doc/9c1076293.html,/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_MA TCH,-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;

MY ANIOBJ bmMap;

MY ANIOBJ bmMapBkObj;

MY ANIOBJ bmAniObj;

MYROLE rmain;

MY ANIMAGIC 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:

A TOM 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(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return msg.wParam;

}

//

// 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.

//

A TOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = (WNDPROC)WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MARIO01);

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // wcex.lpszMenuName = (LPCSTR)IDC_MARIO01;

wcex.lpszMenuName = NULL;

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_S MALL);

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=GetS ystemMetrics(SM_CXSCREEN);

hwin=GetSystemMetrics(S M_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

bmPre.Init(hInstance,IDB_BITMAP_PRE1,1,5);

bmPre.SetDevice(hscreen,hmem,GAMEW*32,GAMEH*32);

bmPre.SetPos(BM_USER,0,0);

bmSky.Init(hInstance,IDB_BITMAP_MAP_SKY,1,4);

bmSky.SetDevice(hscreen,hmem,GAMEW*32*MAX_P AGE, GAMEH*32);

bmSky.SetPos(BM_USER,0,0);

bmMap.Init(hInstance,IDB_BITMAP_MAP,1,1);

bmMap.SetDevice(hscreen,hmem,GAMEW*32*MAX_P AGE, GAMEH*32);

bmMap.InitAniList(mapsolid[0],mapsolid[1],

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

bmMapBkObj.Init(hInstance,IDB_BITMAP_MAP_BK,1,1);

bmMapBkObj.SetDevice(hscreen,hmem,GAMEW*32*MAX_ PAGE,GAMEH*32);

bmMapBkObj.InitAniList(mapanibk[0],mapanibk[1],sizeof(ma panibk[0])/sizeof(int),1);

bmAniObj.Init(hInstance,IDB_BITMAP_ANI,1,1);

bmAniObj.SetDevice(hscreen,hmem,GAMEW*32*MAX_P A GE,GAMEH*32);

bmAniObj.InitAniList(mapani[0],mapani[1],sizeof(mapani[0])/ sizeof(int),1);

bmMagic.Init(hInstance,IDB_BITMAP_MAGIC,1,1);

bmMagic.SetDevice(hscreen,hmem, hmem2);

bmMagic.InitAniList(mapanimagic[0],mapanimagic[1],sizeof( mapanimagic[0])/sizeof(int));

rmain.Init(hInstance,IDB_BITMAP_ROLE,5,1);

rmain.SetDevice(hscreen,hmem,GAMEW*32*MAX_PAGE,G AMEH*32);

//text

myfont.SetDevice(hscreen);

//map

gamemap.Init();

rmain.SetPos(BM_USER,3*32,8*32);

rmain.InitRole(0,GAMEW*32*MAX_P AGE-32);

//文件检查

if(!gamemap.LoadMap())

{

gamemap.CodeErr(ERR_MAP_FILE);

}

c1.SetDevice(hscreen);

c1.Begin(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 code here...

//初始化空图

SelectObject(hscreen,hmapnull);

switch(gamemap.iGameState)

{

case GAME_ERR:

gamemap.viewx=0;

//显示错误信息

bmPre.Stretch(2,2,0);

myfont.SelectColor(TC_WHITE,TC_BLACK);

myfont.SelectFont(0);

myfont.ShowText(150,290,pPreText[3]);

break;

case GAME_PRE:

gamemap.viewx=0;

bmPre.Stretch(2,2,0);

myfont.SelectFont(0);

myfont.SelectColor(TC_BLACK,

TC_YELLOW_0);

myfont.ShowText(150,260,pPreText[4]);

myfont.ShowText(150,290,pPreText[5]);

myfont.ShowText(150,320,pPreText[6]);

gamemap.ShowMenu(bmAniObj);

break;

case GAME_HELP:

gamemap.viewx=0;

bmPre.Stretch(2,2,4);

myfont.SelectFont(0);

myfont.SelectColor(TC_BLACK,

TC_YELLOW_0);

myfont.ShowText(150,230,pPreText[8]);

myfont.ShowText(50,260,pPreText[1]);

myfont.ShowText(50,290,pPreText[0]);

myfont.ShowText(50,320,pPreText[7]);

break;

case GAME_IN_PRE:

gamemap.viewx=0;

bmPre.Stretch(2,2,2);

gamemap.ShowInfo(hscreen);

break;

case GAME_IN:

超级玛丽详细设计文档

目录 1.导言 (2) 1.1编写目的 (2) 1.2项目范围 (2) 1.3参考资料 (2) 1.4缩写说明 (2) 1.5术语定义 (2) 2.功能需求 (3) 2.1界面设计技术 (3) 2.2游戏功能划分 (3) 2.3功能划分的架构图 (3) 2.4具体的功能模块 (4) 2.5功能描述 (4) 2.6程序的总体架构 (4) 2.7程序的三层结构图 (4) 3.面向对象设计 (5) 3.1主要类图 (5) 3.2各个模块的方法或类名类表示 (6) 3.3地图绘制中的坐标说明 (6) 4.程序的详细设计 (7) 4.1主要人物玛丽的实现 (7) 4.2核心类 (7)

1.导言 1.1编写目的 该文档的目的是说明超级玛丽游戏的功能和设计方向、目标等描述游戏项目的整体框架的实现。其主要内容包括:游戏项目的功能简介,接口设计,模块设计,界面设计。本文档预期读者包括:项目管理人员,编程人员,数据库设计人员,美工,测试人员。 1.2项目范围 该文档定义了游戏的模块,结构单元,但未确定单元的实现方法,这部分内容将在具体的代码设计中实现。 1.3参考资料 《java语言程序设计》清华大学出版社郎波编著 1.4缩写说明 UML:Unified Modeling Language(统一建模语言)的缩写,是一个标准的建模语言。 1.5术语定义 MIDP 2.0 定义:MIDP 2.0 也叫MIDP_NG,它的编号是JSR 118。MIDP2.0 与1.0相比有很大提高,增加的特性包括:提供域安全模型,以允许对应用程序进行签名和论证;提供TCP、UDP网络接口;内置OTA;更好的用户界面;基本的声音API。

马里奥与路易金手指

游戏时间00:00 02058160 00000000 金币满 020580AC 000F423F 从砖块打出金币后金币满(图省事还是直接用上面的) 12018A34 0000041C 从砖块打出金币后得到金币n倍*1 12018A18 00002xx0 关于上面密码中的xx,请自行选择,比如2倍就是12018A18 00002080 xx=08(2倍),10(4倍),18(8倍),20(16倍),28(32倍),30(64倍), 38(128倍),40(256倍),48(512倍),50(1024倍),58(2048倍)… 特殊攻击全开 12057CE6 0000FFFF 22057CE8 00000007 按x键道具全开 94000136 FFFE0000 120580B2 00006363 120580C8 00006363 020580B4 63636363 E20580B8 00000010 63636363 63636363 63636363 63630063 D0000000 00000000 按x键装备全开 94000136 FFFE0000 C0000000 0000007F 220580D3 00000009 DC000000 00000001 D2000000 00000000 D0000000 00000000 --------------------------------------------------------------- 战斗相关 战斗后获得经验值9999(马里奥和路易) 5206ACAC E1530002 12133150 0000270F D0000000 00000000 战斗后获得经验值9999(库巴) 5206ACAC E1530002 12133152 0000270F D0000000 00000000 战斗后获得金币9999(马里奥和路易) 5206ACAC E1530002 12133154 0000270F D0000000 00000000

超级玛丽Java课程设计

《面向对象程序设计》 课程设计报告 题目:超级玛丽软件的设计与实现 院(系):信息科学与工程学院 专业班级:计算机科学与技术1201班 学生姓名:程伟 学号:20121183011 指导教师:吴奕 20 14 年 12 月 29 日至20 15 年 1 月 9 日 华中科技大学武昌分校制

面向对象程序设计课程设计任务书

目录 1需求与总体设计 (6) 1.1需求分析 (6) 1.2程序功能图 (6) 1.3程序类图 (7) 2详细设计 (8) 2.1 MyFrame实现 (8) 2.1.1窗体对象的序列图 (8) 2.1.2 Myframe详细类图 (9) 2.2 Mario实现 (9) 2.2.1 Mario对象的序列图 (9) 2.2.2 Mario类图 (10) 2.3 Enemy类的实现 (11) 2.4 Obstruction类的实现 (12) 2.5 BackGround类实现 (12) 3编码实现 (13) 3.1 MyFrame类的详细代码........................................................................................... 错误!未定义书签。 3.2 BackGround类的详细代码..................................................................................... 错误!未定义书签。 3.3 Mario类的详细代码............................................................................................... 错误!未定义书签。 3.4 Enemy类的详细代码............................................................................................... 错误!未定义书签。 3.5 Obstruction类的详细代码................................................................................... 错误!未定义书签。4系统测试. (63) 4.1 游戏开始界面的测试 (63) 4.2 游戏运行的测试 (63) 4.3 排除错误的处理 (66) 总结 (67)

所有超级玛丽金手指

0039-01-00 特殊状态1<00顶出,01顶出花,02顶出星,03顶出,40顶出闪蘑菇> 0045-01-00 <一旦使用就改不了了> 009f-01-00 <00跳不高,07跳不起来,10一跳即死,80,FC,FF升天> 00B5-01-00 上下屏相连<00断开,01相连> 0433-01-00 <00正常,01飞天,FF入地> 0484-01-00 踩坏蛋的分数<00-10,10为1UP> 0704-01-00 <00水中大跳,01空中游泳> 0705-01-ff 前进问题<00-FF,值越大后退越困难> 0706-01-ff 跳跃问题<00-40,值越大跳跃越轻松> 0712-01-00 每次跳崖都有音效<00有,01无> 0716-01-00 系统问题<00正常,01死机> 0723-01-00 屏滚样式<00一直滚动,01一直锁定> 074E-01-00 修改场景<00白天,02地下,03城堡,04,05,06> 0751-01-00 强行<00-??,??由关卡长度决定> 0752-01-00 出场方式<00站在地面,01半空坠落,02管中钻出,03高空坠落,07接近地面,??等等> 0753-01-ff 颜色<00红色,01绿色> 0754-01-ff 上穿墙问题<00-FF,值越大穿墙越轻松> 0755-01-ff 压屏问题<00正常,01锁定,50高压缩,FF完全压缩> 0756-01-02 特殊状态2<00不火且个头不变且顶出,01不火但个头变换且顶出花,02开火且个头变换且顶出花,03开火且个头变换且顶出星,04开火且个头变换且顶出,EE开火且个头变换且顶出龟壳> 075A-01-00 锁定人数<人数恒不变> 075B-01-00 选小节<00-??,??由关卡决定> 075F-01-00 选大关<00-??,??由作品决定> 0760-01-00 选小关<00-??,??由作品决定> 076a-01-00 周(00世界一,01世界二) 077a-01-01 玩家人数<00单人,01双人> 0781-01-00 行走样式<00正常,01,02> 0784-01-00 砖块问题<00正常,03砖块变石块> 0785-01-00 屏幕滚动速度<00正常,01缓慢,02锁定> 0786-01-00 弹簧质量<00优质,01劣质,02报废> 0791-01-00 体质<00-09,10刀枪不入但、、火、锤子等除外> 0797-01-00 敌人状态<00动态,FF僵硬> 0784-01-00 砖块问题<00正常,03砖块变石块> 079E-01-00 隐身<00正常,01隐身> 079F-01-00 保护<00肉体,01> 07FA-01-00 时间锁定<00正常,01锁定>

Java web开发教程部分 (2)

对于我这样一个爱书、爱开源及爱Spring的人来说,每一次读市面上关于Spring的图书,都会让我对Spring有新的认识及体验,因为每一个作者都会用他所认识的方式来告诉我们什么是Spring、怎么用Spring。由所选择的点不同,角度的不540C,因此读多了就知道Spring真正是什么。 2007年,我跟ErikChang、船长、stef等曾经打算合作写一本能“深入Spring 2”的书籍,然而由于工作的原因,却没能坚持到最后,遗憾的同时,也让我深深体会到了写作的艰辛。2008年春节刚过,ErikChang突然告诉我,他已写完了一本关于Spring 2的书籍。给我发了《精通Spring 2.x Java Web开发》的几章,我一口气读完,感到非常欣慰与惊叹。欣慰的是我读到了一本真正“Spring 2”的书,惊叹的是ErikChang在几个月的时间里奇迹般地写出这么多的东西。 不管您是Spring的新手还是老手,我相信你从这本书中一定能读到以前所不了解的Spring,在应用好Spring的同时,了解他的设计原理,了解他里面的设计精华及编码艺术,这将会为您增加不少的财富。 只是能简单地应用Spring,这没意义;反复不断地深入学习Spring的源码,并把收获及心得拿出来与大家分享,这有意义。因此,ErikChang做了一件非常有意义的事。 用心能做好一件事,执着能让我们取得成功。祝愿每一位读者朋友工作顺利,事业成功! EasyJF 创始人 技术总监 蔡世友,

第1章 开始Spring之旅 自从Spring问世以来就引起了J2EE业界的关注,J2EE开发原本就是一个很复杂的领域,很多初级程序员都不敢涉足,Spring改变了这个局面,Spring出现以后迅速使J2EE开发越来越简单,某种程度上促进了软件生产力的发展,Spring已经成为众多程序员都日益青睐的开发框架,本章将带领大家开始学习Spring,主要内容如下。 ●Spring源码的获取 ●源码内容说明 ●第一个Spring实例 1.1 获取并查看Spring 在使用Spring之前首先要获取该框架的jar包,同时Spring是一个开源项目,有兴趣的读者可以查看Spring源码,了解Spring的设计思想及源码的编写,本节带领读者一步步来获取并查看Spring源码,使读者学会独立获取Spring并在Eclipse IDE中查看Spring源码,对Spring有个概念的认识。 1.1.1 获取Spring 首先到官方网站下载Spring, Spring的官方网址是https://www.360docs.net/doc/9c1076293.html,/,单击download栏目,进入下载页面,如图1-1所示。

手机游戏简介

章手机游戏简介 学习J2ME开发手机游戏,首先需要了解手机游戏的相关知识,本章主要介绍手机游戏的发展现状、分类及特点等内容,并对手机游戏策划进行阐述。 1.1手机游戏概述 顾名思义,手机游戏就是可以在手机上进行的游戏。随着科技的发展,现在手机的功能也越来越多,越来越强大。而手机游戏也远远不是我们印象中的《俄罗斯方块》和《贪吃蛇》之类规则简单的游戏,如今手机游戏的规则越来越复杂,画面越来越精美,娱乐性和交互性也越来越强。 1.1.1手机游戏产业发展现状 近年来,我国手机游戏市场尤其是手机网络游戏发展迅猛。据统计,早在2008年中国手机游戏市场营收规模就已达到13亿元;随着2009年3G牌照的发放以及3G技术的推广,预计2009至2010年中国手机游戏市场规模将达到42亿元,同比增长约38.5%。手机游戏的发展已经成为整个游戏产业的新亮点,手机有望成为一个集通信和娱乐于一身的娱乐终端,未来的发展势头将会十分惊人。 随着全球3G商用步伐的不断加快,无线娱乐业务成为无线增值业务中最被看好的市场增长点。作为手机娱乐服务的重要内容之一,近几年来,手机游戏业务全面崛起。特别是在日本和韩国,手机游戏业务对移动运营商业绩的提升发挥了十分重要的作用。目前,全球手机游戏的市场规模已经超过了手机音乐,成为名副其实的“无线娱乐产业之王”。近年来在世界范围内,手机游戏已经成为整个视频游戏领域发展速度最快的部分。现在,无论是在地铁里,还是机场的候机大厅,经常可以看到很多人在不停按手机键盘玩手机游戏来打发时间,手机网游也在掌上一族中日益流行,渐渐已经没有人会怀疑它拥有的巨大市场潜力了。 目前,手机游戏产业链的构成主要包括移动运营商、CP(游戏开发商)、SP(游戏发行商)、游戏平台开发商、终端制造商、游戏分销商以及用户。手机游戏从开发到为用户提供服务,需要产业链上各方的参与。游戏平台开发商基于J2ME(Java2 Micro Edition)及BREW等技术平台向移动运营商、手机游戏开发商和终端制造商提供移动游戏平台或SDK (Software Developer Kit),手机游戏开发商将自主开发的手机游戏提供给移动游戏提供商或移动运营商,或者将开发的游戏直接嵌入到终端制造商制造的终端中。 移动运营商及手机厂商正在不断地进行各种手机游戏市场催生活动,新推出的手机机型普遍支持Java功能,运营商正在加紧各种服务平台的升级扩容。Java游戏下载市场从2005年下半年以来已经开始呈现出快速的增长势头,美国克里夫兰咨询公司最近的调查报

超级玛丽详细设计文档

超级玛丽详细设计文档

超级玛丽JA V A小游戏详细设计 目录 1.导言 ............................................................................................ 错误!未定义书签。 1.1编写目的 .................................................................... 错误!未定义书签。 1.2项目范围 .................................................................... 错误!未定义书签。 1.3参考资料 .................................................................... 错误!未定义书签。 1.4缩写说明 .................................................................... 错误!未定义书签。 1.5术语定义 .................................................................... 错误!未定义书签。 2.功能需求 .................................................................................... 错误!未定义书签。 2.1界面设计技术............................................................ 错误!未定义书签。 2.2游戏功能划分............................................................ 错误!未定义书签。 2.3功能划分的架构图.................................................... 错误!未定义书签。 2.4具体的功能模块........................................................ 错误!未定义书签。 2.5功能描述 .................................................................... 错误!未定义书签。 2.6程序的总体架构........................................................ 错误!未定义书签。 2.7程序的三层结构图 (6) 3.面向对象设计 (7) 3.1主要类图 (7) 3.2各个模块的方法或类名类表示 (8) 3.3地图绘制中的坐标说明 (8) 4.程序的详细设计 (9) 4.1主要人物玛丽的实现 (9) 4.2核心类 (9)

所有超级玛丽金手指

所有超级玛丽金手指 Document number【AA80KGB-AA98YT-AAT8CB-2A6UT-A18GG】

0039-01-00 特殊状态1<00顶出,01顶出花,02顶出星,03顶出,40顶出闪蘑菇> 0045-01-00 <一旦使用就改不了了> 009f-01-00 <00跳不高,07跳不起来,10一跳即死,80,FC,FF升天> 00B5-01-00 上下屏相连<00断开,01相连> 0433-01-00 <00正常,01飞天,FF入地> 0484-01-00 踩坏蛋的分数<00-10,10为1UP> 0704-01-00 <00水中大跳,01空中游泳> 0705-01-ff 前进问题<00-FF,值越大后退越困难> 0706-01-ff 跳跃问题<00-40,值越大跳跃越轻松> 0712-01-00 每次跳崖都有音效<00有,01无> 0716-01-00 系统问题<00正常,01死机> 0723-01-00 屏滚样式<00一直滚动,01一直锁定> 074E-01-00 修改场景<00白天,02地下,03城堡,04,05,06> 0751-01-00 强行<00-??,??由关卡长度决定> 0752-01-00 出场方式<00站在地面,01半空坠落,02管中钻出,03高空坠落,07 接近地面,??等等> 0753-01-ff 颜色<00红色,01绿色> 0754-01-ff 上穿墙问题<00-FF,值越大穿墙越轻松> 0755-01-ff 压屏问题<00正常,01锁定,50高压缩,FF完全压缩> 0756-01-02 特殊状态2<00不火且个头不变且顶出,01不火但个头变换且顶出花,02开火且个头变换且顶出花,03开火且个头变换且顶出星,04开火且个头变 换且顶出,EE开火且个头变换且顶出龟壳> 075A-01-00 锁定人数<人数恒不变> 075B-01-00 选小节<00-??,??由关卡决定> 075F-01-00 选大关<00-??,??由作品决定> 0760-01-00 选小关<00-??,??由作品决定> 076a-01-00 周(00世界一,01世界二) 077a-01-01 玩家人数<00单人,01双人> 0781-01-00 行走样式<00正常,01,02> 0784-01-00 砖块问题<00正常,03砖块变石块> 0785-01-00 屏幕滚动速度<00正常,01缓慢,02锁定> 0786-01-00 弹簧质量<00优质,01劣质,02报废> 0791-01-00 体质<00-09,10刀枪不入但、、火、锤子等除外> 0797-01-00 敌人状态<00动态,FF僵硬> 0784-01-00 砖块问题<00正常,03砖块变石块> 079E-01-00 隐身<00正常,01隐身> 079F-01-00 保护<00肉体,01> 07FA-01-00 时间锁定<00正常,01锁定>

基于《超级玛丽》游戏的Flash引导层动画教学案例

基于《超级玛丽》游戏的Flash引导层动画教学案例 背景 本课程教学对象是初一级学生,学生活泼好动,喜欢动漫小游戏等,学生已经会使用flash工具绘图,创建元件,添加图层和制作逐帧动画,具备了基本的操作技巧。此案例是整个flash教学中以《超级玛丽》游戏为主题的一个部分,从初识flash,制作图形元件,影片剪辑元件和帧动画都是围绕着这个游戏主题展开,所以学生都已经拥有了属于自己的半成品作品可供自己使用,本节课引导层动画知识学习也是在其半成品的基础上开展的。半成品flash文件基本构成有背景层,马里奥角色元件,蘑菇角色元件,乌龟角色元件。 本课程学习采用小组合作模式进行,小组合作学习模式已经在本校开展了半年多,模式比较成熟,每组6个学生,根据能力分有A层、B层和C层三个层次的学生,每个层次学生都有机会在组内发表意见,有利于组内开展帮扶学习,方便 组内成员一起探究学习。 一、学习目标 (一)、知识与技能 1、理解引导层的概念; 2、熟练掌握制作引导层动画的基本方法; 3、运用引导层制作动画。 (二)、过程与方法 1、通过游戏引入吸引学生,利用游戏素材提高学生的学习兴趣; 2、在学生学习知识过程中也注重发现问题解决问题能力的培养,培养学生的创新精神和动手操作能力。 (三)、情感、态度与价值观 通过学生在制作超级玛丽动画激发学生的学习兴趣,游戏过程中马丽奥不断 的遇到很多障碍和困难,但他还是一一克服了,并最终达到了他的目标,告诉学 生在生活中会遇到各种各样的障碍,为了实现自己的梦想要有马丽奥的精神,努

力克服所有困难。 二、教学重难点 重点:掌握制作引导层动画的基本方法。 难点:运用引导层制作动画,运动对象与引导线的吸附操作。 三、教学方法 演示法,讨论法,练习法,小组合作法。 四、教学过程 (一)、课前准备 T:教师 1、授课PPT; 2、课前欣赏的视频《超级玛丽》游戏视频; 3、现场游戏器材(细绳,两个蘑菇实物); 4、学生使用的素材(之前完成的半成品作品); 5、动画制作。 S:学生 按照8个组座位就坐,小组模式学习(每个小组6至7人,按能力分为A、B和C 三个层次学生,设有组长,副组长)。 设计意图: 1、视频吸引学生,激发学生学习兴趣; 2、以小组积分模式激励学生,提高学生学习积极性。 积分树:小组得一分可以攀登一片叶子 小组:①②③④⑤⑥⑦⑧

教你在电脑版PC上玩超级玛丽 旗舰版

教你在电脑版PC上玩超级玛丽旗舰版相信大家对于 这款游戏,大家不会陌生。相信会有玩家询问:是否有超级玛丽旗舰版 呢?如何用电脑玩叫MT呢?答案是肯定的,下面口袋巴士小编,为大家带来超级玛丽旗舰版电脑版安装教程,看看如何在电脑上玩超级玛丽旗舰版。 本教程的主题思想,就是需要通过安卓模拟器bluestack来完成操作。大概思路就是首先安装安卓模拟器,然后再安装超级玛丽旗舰版安卓版,接着就可以进入游戏了。另外小编提示大家,根据邢山虎的说法,公司是不会退出超级玛丽旗舰版电脑版(端游版),所以现阶段大家只能通过模拟器在电脑上玩了。 超级玛丽旗舰版安卓版下载安卓模拟器下载 超级玛丽旗舰版电脑版安装步骤: 1.首先在安装bluestack模拟器之前,我们先需要在加载环境。首先下载下载.Java Runtime Environment-6.0.370.exe和NetFx20SP2_x86.exe(注意这个是xp版本下的,WIN7版本请另寻选择这两个软件。 而关于这两款软件的下载,其实相信大家的电脑中,都应该安装了。所以小编这里就不给大家提供下载了,另外如果需要下载则直接可以进入360软件进行下载。当然杀毒软件也可能阻碍你的程序安装,所以有必要时先关闭杀毒软件。 2.接着就是安装安卓模拟器。点击上文的地址进行下载,然后进行安装,不会安装的朋友可以按照下文的教程进行安装。 3.第三步就是下载超级玛丽旗舰版安卓版客户端,然后通过bluestack进行安装到你的电脑下。 4.随后就是进入游戏了,接下来你的任务就是进入游戏然后畅玩超级玛丽旗舰版电脑版了。基本的步骤就为大家介绍到这里,不懂的朋友们可以参见下文的具体安装教程。 超级玛丽旗舰版电脑版详细安装教程

java超级玛丽可行性研究报告

一、可行性研究报告 一、可行性研究报告 (1) 1.引言........................................................................................................... 错误!未定义书签。 1.1编写目的 (2) 1.2项目背景 (2) 1.3定义 (2) 1.4参考资料 (2) 2.可行性研究的前提 (2) 2.1要求 (2) 2.2目标 (3) 2.3条件、假定和限制 (3) 2.4可行性研究方法 (3) 2.5决定可行性的主要因素 (4) 3.对现有系统的分析 (4) 3.1处理流程和数据流程....................................................................... 错误!未定义书签。 3.2工作负荷........................................................................................... 错误!未定义书签。 3.3费用支出 (4) 3.4人员 (4) 3.5设备................................................................................................... 错误!未定义书签。 3.6局限性 (4) 4.所建议技术可行性分析 (4) 4.1对系统的简要描述 (4) 4.2处理流程和数据流程....................................................................... 错误!未定义书签。 4.3与现有系统比较的优越性 (5) 4.4采用建议系统可能带来的影响 (5) 4.5技术可行性评价 (5) 5.所建议系统经济可行性分析 (6) 5.1支出 (6) 5.2效益 (6) 5.3收益/投资比 (6) 5.4投资回收周期................................................................................... 错误!未定义书签。 5.5敏感性分析 (6) 6.社会因素可行性分析 (6) 6.1法律因素 (6) 6.2用户使用可行性 (6) 7.其他可供选择的方案 (6)

FC经典小游戏金手指

赤色要塞 1P 人数无限0031-01-0A 武器: 手榴弹0050-01-00 普通导弹0050-01-01 二方导弹0050-01-02 四方导弹0050-01-03 无敌0052-01-90 2P 人数无限0032-01-0A 武器: 手榴弹0051-01-00 普通导弹0051-01-01 二方导弹0051-01-02 四方导弹0051-01-03 无敌0053-01-90 1P2P全部无敌0052-02-255 超级玛丽 NES版SMB3 0552-01-00 无敌 0553-01-FF 保护无限 05F0-04-09 无限时间 0736-01-63 1号无限命数 0737-01-63 2号无限命数 056E-01-FF 飞行能量最大 00ED-01-05 变身(00可改:长大01,火球02,飞行03,青蛙04,狐狸05,乌龟06) 0727-01-00 选关(00可改:01~07) 00ED-01-07 变身幽灵 SMB1 079E-01-03 透明无敌 07FA-01-09 时间 0756-01-02 子弹 079F-01-09 无敌 0754-01-02 大小 075A-01-09 生命 0704-01-01 超能力<00水中大跳,01空中游泳>

0754-01-FF 上穿墙问题<00-FF,值越大穿墙越轻松> 079E-01-01 隐身<00正常,01隐身> 079F-01-01 保护<00肉体,01金身> 07FA-01-01 时间锁定<00正常,01锁定> 0039-01-03 特殊状态1<00顶出红蘑菇,01顶出花,02顶出星,03顶出绿蘑菇,40顶出闪蘑菇> 0484-01-00 踩坏蛋的分数<00-10,10为1UP> 0706-01-FF 跳跃问题<00-40,值越大跳跃越轻松> 0752-01-00 出场方式<00站在地面,01半空坠落,02管中钻出,03高空坠落,07接近地面,??等等> 0756-01-04 特殊状态2<00不火且个头不变且顶出红蘑菇,01不火但个头变换且顶出花,02开火且个头变换且顶出花,03开火且个头变换且顶出星,04开火且个头变换且顶出绿蘑菇,EE开火且个头变换且顶出龟壳> 076A-01-01 周目数(00世界一,01世界二) 0781-01-02 行走样式<00正常,01飞毛腿,02溜冰> 0786-01-00 弹簧质量<00优质,01劣质,02报废> 0791-01-10 体质<00-09,10刀枪不入但刺猬、食人花、火、锤子等除外> 0797-01-FF 敌人状态<00动态,FF僵硬> 079E-01-01 隐身<00正常,01隐身> 07FA-01-01 时间锁定<00正常,01锁定> 0754-01-FF 上穿墙 0723-01-00 忍者神龟3 [P1 无限只数] ON= 006A-01-08 [P1 生命值] ON= 04F1-01-7F [P1 透明] ON= 04ED-01-80 [P2 无限只数] ON= 006B-01-08 [P2 生命值] ON= 04F2-01-7F [P2 透明]

所有超级玛丽金手指精编版

……………………………………………………………最新资料推荐………………………………………………… 0039-01-00 特殊状态1<00顶出红蘑菇,01顶出花,02顶出星,03顶出绿蘑菇,40顶出闪蘑菇> 0045-01-00 步履艰难<一旦使用就改不了了> 009f-01-00 重力加速度<00跳不高,07跳不起来,10一跳即死,80死不瞑目,FC龙卷风,FF升天> 00B5-01-00 上下屏相连<00断开,01相连> 0433-01-00 弹跳力<00正常,01飞天,FF入地> 0484-01-00 踩坏蛋的分数<00-10,10为1UP> 0704-01-00 超能力<00水中大跳,01空中游泳> 0705-01-ff 前进问题<00-FF,值越大后退越困难> 0706-01-ff 跳跃问题<00-40,值越大跳跃越轻松> 0712-01-00 每次跳崖都有音效<00有,01无> 0716-01-00 系统问题<00正常,01死机> 0723-01-00 屏滚样式<00一直滚动,01一直锁定> 074E-01-00 修改场景<00白天,02地下,03城堡,04,05,06> 0751-01-00 强行盗链<00-??,??由关卡长度决定> 0752-01-00 出场方式<00站在地面,01半空坠落,02管中钻出,03高空坠落,07接近地面,??等等> 0753-01-ff 颜色<00红色,01绿色> 0754-01-ff 上穿墙问题<00-FF,值越大穿墙越轻松> 0755-01-ff 压屏问题<00正常,01锁定,50高压缩,FF完全压缩> 0756-01-02 特殊状态2<00不火且个头不变且顶出红蘑菇,01不火但个头变换且顶出花,02开火且个头变换且顶出花,03开火且个头变换且顶出星,04开火且个头变换且顶出绿蘑菇,EE开火且个头变换且顶出龟壳> 075A-01-00 锁定人数<人数恒不变> 075B-01-00 选小节<00-??,??由关卡决定> 075F-01-00 选大关<00-??,??由作品决定> 0760-01-00 选小关<00-??,??由作品决定> 076a-01-00 周目数(00世界一,01世界二) 077a-01-01 玩家人数<00单人,01双人> 0781-01-00 行走样式<00正常,01飞毛腿,02溜冰> 0784-01-00 砖块问题<00正常,03砖块变石块> 0785-01-00 屏幕滚动速度<00正常,01缓慢,02锁定> 0786-01-00 弹簧质量<00优质,01劣质,02报废> 0791-01-00 体质<00-09,10刀枪不入但刺猬、食人花、火、锤子等除外> 0797-01-00 敌人状态<00动态,FF僵硬> 0784-01-00 砖块问题<00正常,03砖块变石块> 079E-01-00 隐身<00正常,01隐身> 079F-01-00 保护<00肉体,01金身> 07FA-01-00 时间锁定<00正常,01锁定> 1

java超级玛丽基于Android的超级玛丽游戏最终作业

目录一、可行性分析 5 1.引言 5 1.1编写目的 5 1.2项目背景 5 1.3定义 5 1.4参考资料 6 2.可行性研究的前提 6 2.1要求 6 2.2目标 6 2.3条件、假定和限制 7 2.4可行性研究方法 7 2.5决定可行性的主要因素 7 3.对现有系统的分析 7 3.1工作负荷 7 3.2费用支出 7 3.3人员 7

3.5 局限性 (7) 4.所建议技术可行性分析 8 4.1对系统的简要描述 8 4.2与现有系统比较的优越性 8 4.3采用建议系统可能带来的影响 8 4.5技术可行性评价 9 5.社会因素可行性分析 9 5.1法律因素 9 5.2用户使用可行性 9 6.其他可供选择的方案 10 二.需求规格说明书 10 1.引言 10 1.1编写目的 10 1.2项目背景 10 1.3定义 11 1.4参考资料 11

2.任务概述 12 2.1目标 12 2.2运行环境 12 3.数据描述 12 3.1数据库介绍 12 3.2数据词典 12 3.3数据采集 12 4.功能需求 12 4.1功能划分 12 4.2功能描述 12 5.其它需求 13 5.1安全性要求 13 5.2一致性要求 13 5.3完整性要求 13 6.运行需求 13 6.1用户界面 13 6.2硬件接口 13

6.3软件接口 13 6.4故障处理 (13) 7.其它需求 14 三、面向对象分析 14 1、用例图 14 1.1、用例图 14 1.2、用例叙述 14 2、时序图图 15 3、类图 18 四、概要设计说明书 19 1.引言 19 1.1编写目的 19 1.2项目背景 19 1.3定义 19 1.4参考资料 20 2.任务概述 20

超级玛丽--Java课程设计

超级玛丽--Java课程设计

《面向对象程序设计》 课程设计报告 题目:超级玛丽软件的设计与实现 院(系):信息科学与工程学院 专业班级:计算机科学与技术1201班 学生姓名:程伟 学号:20121183011 指导教师:吴奕 20 14 年 12 月 29 日至20 15 年 1 月 9 日 华中科技大学武昌分校制

总体设计1天 详细设计1.5天 编制源程序实现3.5天 测试与修改1天 撰写课设报告2天 六、主要参考资料 [1] 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2011. [2] 耿祥义. Java课程设计(第二版).北京:清华大学出版社, 2008. [3] 耿祥义.JAVA大学实用教程.北京:清华大学出版社,2009. [4] 邹林达.陈国君 Java2程序设计基础.北京:清华大学出版社,2010. [5] 邹林达.Java2程序设计基础实验指导.北京:清华大学,2010.

目录 1需求与总体设计 (2) 1.1需求分析 (2) 1.2程序功能图 (3) 1.3程序类图 (3) 2详细设计 (4) 2.1 MyFrame实现 (4) 2.1.1窗体对象的序列图 (4) 2.1.2 Myframe详细类图 (5) 2.2 Mario实现 (6) 2.2.1 Mario对象的序列图 (6) 2.2.2 Mario类图 (7) 2.3 Enemy类的实现 (8) 2.4 Obstruction类的实现 (9) 2.5 BackGround类实现 (9) 3编码实现 (10) 3.1 MyFrame类的详细代码....... 错误!未定义书签。 3.2 BackGround类的详细代码.错误!未定义书签。 3.3 Mario类的详细代码........... 错误!未定义书签。 3.4 Enemy类的详细代码........... 错误!未定义书签。 3.5 Obstruction类的详细代码错误!未定义书签。

马里奥与路易基RPG2金手指

金钱77777(改完后存档然后关闭该金手指,否则金币是永远顶不完的)0233C4A4 00012FD1 大马里奥 等级最大 2233C42C 00000064 体力上限值最大 1233C420 000003E8 当前体力值最大 1233C422 000003E8 各项能力值最大 1233C424 000003E8 1233C426 000003E8 1233C428 000003E8 1233C42A 000003E8 升级所需经验值为1 1233C430 00000001 降低各项能力值并将等级变为4 2233C42C 00000004 2233C42D 00000000 2233C42E 00000000 2233C42F 00000000 1233C420 00000063 1233C422 00000063 1233C424 00000014 1233C426 00000014 1233C428 00000014 1233C42A 00000014 1233C430 00000064 小马里奥 等级最大 2233C474 00000064 体力上限值最大 1233C468 000003E8 当前体力值最大 1233C46A 000003E8 各项能力值最大 1233C46C 000003E8 1233C46E 000003E8 1233C470 000003E8 1233C472 000003E8 升级所需经验值为1 1233C478 00000001 降低各项能力值并将等级变为4 2233C474 00000004

2233C476 00000000 2233C477 00000000 1233C468 00000063 1233C46A 00000063 1233C46C 00000014 1233C46E 00000014 1233C470 00000014 1233C472 00000014 1233C478 00000064 大路易 等级最大 2233C450 00000064 体力上限值最大 1233C444 000003E8 当前体力值最大 1233C446 000003E8 各项能力值最大 1233C448 000003E8 1233C44A 000003E8 1233C44C 000003E8 1233C44E 000003E8 升级所需经验值为1 1233C454 00000001 降低各项能力值并将等级变为4 2233C450 00000004 2233C451 00000000 2233C452 00000000 2233C453 00000000 1233C444 00000063 1233C446 00000063 1233C448 00000014 1233C44A 00000014 1233C44C 00000014 1233C44E 00000014 1233C454 00000064 小路易 等级最大 2233C498 00000064 体力上限值最大 1233C48C 000003E8 当前体力值最大 1233C48E 000003E8 各项能力值最大

VC++超级玛丽游戏系统

超级玛丽游戏系统 1.课程设计的目的 随着科学技术的发展,人们的生活水平的提高,然而也越来越繁忙。在充满竞争的社会条件,压力往往带给人们很多烦恼。为了给大家提供一个合理的解压平台,在本次课程设计中为大家开发了一款适合休闲解压的小游戏,超级玛丽。 本次设计加深对面向对象程序设计中基础理论和基本知识的理解,培养学生的实践能力,促进理论与实践的结合。通过课程设计,能够熟练运用C++进行面向对象编程,建立对象模型,降低软件的复杂性,改善软件的重用性和维护性,提高软件的生产效率,全面掌握面向对象编程技术。 2.设计方案论证 2.1设计思路 游戏基本功能: 1. 玩家起初只能用普通子弹或踩踏杀死敌人,但是踩踏无法杀死特殊敌人,无法顶碎砖块。被敌人碰到将失去一条生命。 2. 在玩家吃旋风炮弹之后,攻击能力变强,可以轻松杀死普通敌人和特殊敌人。 3. 玩家一共有三条命的机会去闯关超级玛丽游戏,玩家要在一定时间,通过游戏。如果三条生命都丢掉,将输掉整个游戏。 本游戏的用例模型如图1所示。 图1 用例模型 2.2开发工具选择 代码编写调试使用Visual C++ 6.0。美术工具,Windows自带的画图(开始-程序-附件-画图),Photoshop,记事本或UltraEdit等文本编辑工具。

3.2.2游戏背景类MYBKSKY 这是一个专门处理游戏背景的类。在横版游戏或射击游戏中,都有一个背景画面如图2所示,如山、天空、云、星空等等。这些图片一般只有1到2倍屏幕宽度,然后像一个卷轴一样循环移动,连成一片,感觉上像一很长的图片。这个类就是专门处理这个背景的。在超级玛丽增强版中,主要关卡是3关,各有一背景图片;从水管进去,有两关,都用一全黑图片。共四图。这四图大小一致,纵向排列在一个位图文件中。MYBKSKY 这个类,派生于MYBITMAP。由于背景图片只需要完成循环移动的效果,只需要实现一个功能,而无需关心其他任何问题(例如句柄、dc)。 图2 背景图 技术原理:一图片像卷轴一样不停移动。假设有一条垂直分割线,把图片分成左右两部分。先显示右边部分,再把左边部分接到图片末尾。不停移动向右移动分割线,图片就会循环地显示。 成员函数功能列表: class MYBKSKY:public MYBITMAP { public: MYBKSKY(); ~MYBKSKY(); //show //功能显示一个背景. //入参无 void DrawRoll(); //循环补空 //功能显示一个背景,并缩放图片 //入参横纵方向缩放比例

相关文档
最新文档