参考网上写的简单超级玛丽

下载地址:http://yunpan.cn/cjftE6y6CCDQw  提取码 32d1


//部分源码
#ifndef _SUPERMARRY_MARYH_
#define _SUPERMARRY_MARYH_


//头文件
#include<windows.h>
#include<stdio.h>
#include"resource.h"
#include"clock.h"
#include"font.h"
#include"note.h"
#include"picture.h"
#include"CGame.h"
#include"family.h"


//动态链接库
#pragma  comment(lib,"Msimg32.lib")


ATOM RegisterMyClass(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL InitGame(HINSTANCE hInstance, int nShowCmd);  //初始化游戏
void KeyUpProc(int state, int key);            //按键控制
void KeyDownProc(int state, int key);          //按键控制
void TimeManage(HWND hWnd, int state);         //时钟管理
void ViewManage(int state);                  //界面管理


//全局对象
CMyGame  g_cGame;
CPicture g_cStarPic;
CPicture g_cStarChoice;
CFont    g_cFont;
CClock   g_cClock;
CNote    g_cNote;   //日志管理对象


//全局变量
//名字
TCHAR g_szTitle[MAX_LOADSTRING]; 
TCHAR g_szWindowClass[MAX_LOADSTRING]; 
TCHAR g_szStart[] = L"开始游戏";
TCHAR g_szHelp[] = L"游戏帮助";
TCHAR *g_pHelpText[]={
L"制作: 牙政维 2015年1月",
L"操作:   Z:子弹   X:跳   方向键移动",
L"(上下键选择菜单,回车键确认)",
L"开始游戏",
L"操作说明",
L"QQ: 1258029407",
L"(回车键返回主菜单)"
};
//窗口尺寸
int g_wGameWnd, g_hGameWnd;
int g_wSceen, g_hSceen;
//句柄
HWND g_hwnd;
HDC g_hWndDC, g_hSceenDC, g_hMemDC;
HBITMAP g_hNullBmp;
#endif


#include "mary.h"
int APIENTRY WinMain(
  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPSTR lpCmdLine, 
  int nShowCmd )
{
    HACCEL hAccelTable;
MSG msg = {0};

LoadString(hInstance, IDS_APP_TITLE, g_szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WND_TITLE, g_szWindowClass, MAX_LOADSTRING);
if(!RegisterMyClass(hInstance))
{
MessageBox(NULL, L"注册窗口类失败!", L"提示", 0);
return 0;
}

InitGame(hInstance, nShowCmd);


hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WND_TITLE);


// Main message loop:
while (GetMessage(&msg, NULL, 0, 0)) 
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}


return msg.wParam;
}




ATOM RegisterMyClass(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 = (HICON)LoadImage(hInstance, L"ico.ico", IMAGE_ICON
,0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= NULL;
wcex.lpszClassName= g_szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);


return RegisterClassEx(&wcex);
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
switch (msg)
{
case WM_CREATE:
break;


case WM_PAINT:
g_hWndDC = BeginPaint(hWnd, &ps);


ViewManage(g_cGame.m_gState);


EndPaint(hWnd, &ps);
break;


case WM_TIMER:
TimeManage(hWnd, g_cGame.m_gState);
break;


case WM_KEYDOWN:
KeyDownProc(g_cGame.m_gState, wParam);
break;

case WM_KEYUP:
KeyUpProc(g_cGame.m_gState, wParam);
break;

case WM_DESTROY:
PostQuitMessage(0);
g_cClock.EndTime (hWnd);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}


BOOL InitGame(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

g_wGameWnd = WIDTH * LENGTH;   //游戏窗口的宽度和高度  
g_hGameWnd = HIDTH * LENGTH;


g_wSceen=GetSystemMetrics(SM_CXSCREEN);
g_hSceen=GetSystemMetrics(SM_CYSCREEN);

hWnd = CreateWindow(g_szWindowClass, g_szTitle, WS_OVERLAPPEDWINDOW,
(g_wSceen-g_wGameWnd)/2, (g_hSceen-g_hGameWnd)/2, 
g_wGameWnd, g_hGameWnd, NULL, NULL, hInstance, NULL);

g_hwnd = hWnd;


if (!hWnd)
{
return FALSE;
}


//dc
//游戏窗口的DC,
g_hWndDC=GetDC(g_hwnd);
//整个游戏地图对应的DC
g_hSceenDC=CreateCompatibleDC(g_hWndDC);
g_hMemDC=CreateCompatibleDC(g_hWndDC);

//用空位图初始化各个DC
//建立一个整个地图大小(LENTHMAP倍窗口宽)的空位图,选入hscreen
g_hNullBmp=CreateCompatibleBitmap(g_hWndDC,g_wGameWnd*LENTHMAP,g_wGameWnd);
SelectObject(g_hSceenDC,g_hNullBmp);
SelectObject(g_hMemDC,g_hNullBmp);

ReleaseDC(g_hwnd, g_hWndDC);


//初始化开始菜单位图
g_cStarPic.Init (hInstance,IDB_START, 1, 1);
g_cStarPic.SetDevice (g_hSceenDC,g_hMemDC, g_wGameWnd, g_hGameWnd);


//初始化开始菜单选择位图
g_cStarChoice.Init(hInstance, IDB_CHOICE,1, 2);
g_cStarChoice.SetDevice (g_hSceenDC,g_hMemDC, g_wGameWnd, g_hGameWnd);


//初始化地图砖头
g_cGame.m_cMapPic.Init (hInstance, IDB_CRICK, 4, 1);
g_cGame.m_cMapPic.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);


//初始化地图背景图片
g_cGame.m_cMapBkPic.Init (hInstance, IDB_BK3, 1, 1);
g_cGame.m_cMapBkPic.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);


//初始化地图背景静态图片
g_cGame.m_cMapStaThingPic.Init (hInstance, IDB_STATHING, 4, 1);
g_cGame.m_cMapStaThingPic.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);


//初始化地图背景动态可移动图片
g_cGame.m_cMapRlativeMovThingPic.Init (hInstance, IDB_COW, 4, 4);
g_cGame.m_cMapRlativeMovThingPic.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);


//初始化地图背景雪花图片
g_cGame.m_cMapFlowerSnowPic.Init (hInstance, IDB_SNOW, 1, 1);
g_cGame.m_cMapFlowerSnowPic.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);


//初始化地图动态不可移动图片
g_cGame.m_cMapStaMovThingPic.Init (hInstance, IDB_STAMOV, 9, 4);
g_cGame.m_cMapStaMovThingPic.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);


//初始化玩家角色图片
g_cGame.m_cMyRole.Init (hInstance, IDB_ROLE, 1, 6);
g_cGame.m_cMyRole.SetDevice(g_hSceenDC, g_hMemDC, g_wGameWnd, g_wGameWnd);
g_cGame.m_cMyRole.InitRole(15, 300-g_cGame.m_cMyRole.m_hPic, g_cGame.m_cMyRole.m_wPic
,g_cGame.m_cMyRole.m_hPic,1,1);

//初始化游戏字体
g_cFont.SetDevice(g_hSceenDC);
g_cFont.SelectColor(RGB(0,0,255), RGB(255,0,0));


//加载地图数据
if (!g_cGame.LoadMap ())
{
//写入日志
return FALSE;
}


//初始化游戏状态
g_cGame.m_gState = GAME_START;


//启动定时器和开启时钟
g_cClock.StarTime(g_hwnd);


ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}


void KeyUpProc(int state, int key)
{
switch (state)
{
case GAME_START:
break;
case GAME_ENTER:
switch(key)
{
case VK_RIGHT:
g_cGame.m_cMyRole.m_roleBody.movex=0;
break;


case VK_LEFT:
g_cGame.m_cMyRole.m_roleBody.movex=0;
break;


case KEY_Z: //跳
break;


case KEY_X: //FIRE
break;
}
break;
case GAME_FAIL:
break;
case GAME_PASS:
break;
case GAME_OVER:
break;
default:
break;
}
}


void KeyDownProc(int state, int key)
{
switch (state)
{
case GAME_START:
switch (key)
{
case 0xd: //enter
switch (g_cStarChoice.m_dy)
{
case 0:  //开始游戏
g_cGame.m_gState = GAME_ENTER;
break;
case 20: //游戏帮助
g_cGame.m_gState = GAME_HELP;
break;
}
break;
case VK_DOWN:
g_cStarChoice.m_dy = 20 - g_cStarChoice.m_dy;
break;
case VK_UP:
g_cStarChoice.m_dy = 20 - g_cStarChoice.m_dy;
break;
}
return;   //重绘
case GAME_HELP:
switch (key)
{
case 0xd: //enter
g_cGame.m_gState = GAME_START;
break;
}
return;
case GAME_ENTER:
switch (key)
{
case VK_RIGHT:
//角色控制
if(g_cGame.m_cMyRole.m_roleBody.movey!=0)
{
g_cGame.m_cMyRole.m_roleBody.jumpx=4;
}
g_cGame.m_cMyRole.m_roleBody.movex=4;
g_cGame.m_cMyRole.m_roleBody.idirec=0;
break;
case VK_LEFT:
//角色控制
if(g_cGame.m_cMyRole.m_roleBody.movey!=0)
{
g_cGame.m_cMyRole.m_roleBody.jumpx=-4;
}
g_cGame.m_cMyRole.m_roleBody.movex=-4;
g_cGame.m_cMyRole.m_roleBody.idirec=1;//朝左
break;
case KEY_Z: //跳
if(g_cGame.m_cMyRole.m_roleBody.movey!=0)
break;
g_cGame.m_cMyRole.m_roleBody.movey=-SPEED_JUMP;
g_cGame.m_cMyRole.m_roleBody.jumpx=g_cGame.m_cMyRole.m_roleBody.movex;//解决z键和方向键的响应问题
break;
case KEY_X:
break;
}
return;
case GAME_FAIL:
break;
case GAME_PASS:
break;
case GAME_OVER:
break;
default:
break;
}
}


void TimeManage(HWND hWnd, int state)
{
switch (state)
{
case GAME_START:
g_cClock.bArrive(7, 2);
if (g_cClock.m_bArriveArr[7])
{
g_cStarChoice.m_frame = (g_cStarChoice.m_frame) % 2 + 1;
::InvalidateRect (hWnd, NULL, FALSE);
}
break;
case GAME_HELP:
if (g_cClock.bArrive (1))
{
InvalidateRect (hWnd, NULL, FALSE);
}
break;
case GAME_ENTER:
::g_cGame.GameDataManage();
InvalidateRect (hWnd, NULL, FALSE);
break;
case GAME_FAIL:
break;
case GAME_PASS:
break;
case GAME_OVER:
break;
default:
break;
}


}


void ViewManage(int state)
{
switch (state)
{
case GAME_START:
g_cStarPic.PasteNorPic(0, 0, g_wGameWnd, g_hGameWnd,1,1);
g_cFont.PrintFont (g_wGameWnd / 2, g_hGameWnd / 2, g_szStart);
g_cFont.PrintFont (g_wGameWnd / 2, g_hGameWnd / 2 + 20, g_szHelp);
g_cStarChoice.PasteMarkPic (g_wGameWnd / 2 - 50,g_hGameWnd / 2 + g_cStarChoice.m_dy
,50,20,1,g_cStarChoice.m_frame);


if (g_cStarChoice.m_frame != 1 && g_cStarChoice.m_frame != 2)
{
char temp[50];
memset(temp, 0, sizeof(temp));
sprintf(temp, "m_frame is %d", g_cStarChoice.m_frame);
g_cNote.put (temp);
}
BitBlt(g_hWndDC,0,0,g_wGameWnd,g_hGameWnd,g_hSceenDC,0,0,SRCCOPY);
return;
case GAME_HELP:
g_cStarPic.PasteNorPic(0, 0, g_wGameWnd, g_hGameWnd,1,1);
for (int i = 0; i < 7; ++i)
g_cFont.PrintFont(g_wGameWnd / 3, g_hGameWnd / 3 + 20*i,g_pHelpText[i]);
BitBlt(g_hWndDC,0,0,g_wGameWnd,g_hGameWnd,g_hSceenDC,0,0,SRCCOPY);
return;
case GAME_ENTER:
g_cGame.ShowMapBk ();
g_cGame.ShowMapStaThing ();
g_cGame.ShowMapRlativeMovThing();
g_cGame.ShowMapFlowerSnow();
g_cGame.ShowMapStaMovThing();
g_cGame.ShowAni ();
g_cGame.ShowOther();
g_cGame.ShowMap ();
g_cGame.ShowMapRole ();


//总的地图显示
BitBlt(g_hWndDC,0,0,g_wGameWnd,g_hGameWnd,g_hSceenDC,g_cGame.m_xView,0,SRCCOPY);
return;
case GAME_FAIL:
return;
case GAME_PASS:
return;
case GAME_OVER:
return;
default:
return;
}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值