下载地址: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;
}
}