实例介绍
【实例简介】
操作说明:左右方向键 让 超级玛丽 走动, Ctrl Z Ctrl X 分别为 跳跃 和 发子弹 操作
【实例截图】
【核心代码】
#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=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<bottom;j =height) { for(i=left;i<right;i =width) { 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<iNum;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(!gamemap.RoleCanMove(x,y)) return; xpos =x; ypos =y; if(xpos<minx) xpos=minx; if(xpos>maxx) xpos=maxx; } void MYROLE::MoveStepTo(int x,int y) { if(xpos<x) xpos =ROLE_STEP; if(ypos<y) 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<inum;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<a;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<inum;i ) { ylist[i]=ylist[i-1] hlist[i-1]*2; } } void MYANIMAGIC::SetDevice(HDC hdest, HDC hsrc, HDC htemp) { hdcdest=hdest; hdcsrc=hsrc; hdctemp=htemp; }
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)