📄 main.cpp
字号:
#pragma comment(lib,"dxguid.lib")
#define WIN32_LEAN_AND_MEAN
/////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#include <ddraw.h>
#include "readyplayvideo.h"
/////////////////////////////////////////////////////////////
#include <dmksctrl.h>
#include <dinput.h>
#include "T3DLIB1.h"
#include "T3DLIB2.h"
#include "gameobject.h"
/////窗口类名
#define WINDOW_CLASS_NAME "WINCLASS"
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//////最重要的飞机出现安排。。。函数
int Show_Enemy();
int Set_Blue_Show(int number);
int Set_Yellow_Show(int number,int mode);
int Show_Blue();
int Show_Yellow();
int Show_Enemy1();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//控制兰色飞机和黄色飞机出现的变量 应该是最后的了.
int blue_pos_x1;
int blue_pos_x2;
int show_blue1=0;
int show_blue2=0;
int blue_number1;
int blue_number2;
int show_blue_time1;
int show_blue_time2;
int show_yellow1=0;
int show_yellow2=0;
int yellow_number1;
int yellow_number2;
int show_yellow_time1;
int show_yellow_time2;
int yellow_mode1;
int yellow_mode2;
char buffer[20];
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HWND main_window_handle;
HINSTANCE main_instance;
////////////////函数
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(msg)
{
case WM_CREATE:
{
return(0);
} break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return(0);
} break;
/*
case WM_KEYDOWN:
{
switch(toupper((int) wparam))
{
case 'X':
CloseClip();
break;
}//end swith
}
break;
///事件返回。。消息
case WM_GRAPHNOTIFY:
HandleGraphEvent();
break;
*/
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;
default:break;
} // end switch
if (pVW)
pVW->NotifyOwnerMessage((LONG_PTR) hwnd, msg, wparam, lparam);
return (DefWindowProc(hwnd, msg, wparam, lparam));
} // end WinProc
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASS winclass;
MSG msg;
HWND hwnd;
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = NULL;
winclass.hCursor = NULL;
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
if (!RegisterClass(&winclass))
return(0);
if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME,
"穿越尼布尼滋",
WS_POPUP | WS_VISIBLE,
0,0,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,
NULL,
hinstance,
NULL)))
return(0);
main_window_handle = hwnd;
main_instance = hinstance;
CoInitialize(NULL);
OpenClip();
ToggleFullScreen();
CoUninitialize();
Game_Init();
while(1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Game_Main();
}
Game_Shutdown();
return(msg.wParam);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
int Game_Main()
{
// 游戏处于什么状态?
if (Game_state == GAME_STATE_INIT)
{
Game_state = GAME_STATE_MENU;
}
else
if (Game_state == GAME_STATE_MENU)
{
while(control_menu==1)
{
DInput_Read_Keyboard();
lpddsback->Blt(NULL,lpddmainmenu,NULL,DDBLT_WAIT,NULL);
DDraw_Flip();
if(keyboard_state[DIK_RETURN])
{
///////这里搞定飞行的背景///////////////////////////////////////////////////////////////////////
int index=0,surface_lpitch;
UCHAR * source_buffer=NULL,* dest_buffer=NULL;
lpddbackground=DDraw_Create_Surface(480,1200,DDSCAPS_VIDEOMEMORY,-1);
Load_Bitmap_File(&bitmap8bit,"beijing.bmp");
memcpy(mainpalette,bitmap8bit.palette,256);
lpddpal->SetEntries(0,0,256,bitmap8bit.palette);
DDRAW_INIT_STRUCT(ddsd);
lpddbackground->Lock(NULL,&ddsd,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);
dest=(UCHAR *)ddsd.lpSurface;
surface_lpitch=(int)ddsd.lPitch;
dest_buffer=dest;
source_buffer=bitmap8bit.buffer;
for(index=0;index<1200;index++)
{
memcpy((void *)dest_buffer,(void *)source_buffer,480);
dest_buffer+=surface_lpitch;
source_buffer+=480;
}
Unload_Bitmap_File(&bitmap8bit);
lpddbackground->Unlock(NULL);
///////////位图加载完毕/////////////////////////////////////////////////////////////////////////////
Game_state=GAME_STATE_RESTART;
break;
}
else if(keyboard_state[DIK_DOWN] || keyboard_state[DIK_S])
{
control_menu=2;
Sleep(300);
break;
}
else if(keyboard_state[DIK_ESCAPE])
{
SendMessage(main_window_handle,WM_DESTROY,0,0);
break;
}
};
while(control_menu==2)
{
DInput_Read_Keyboard();
if(keyboard_state[DIK_RETURN] )
{
show_instraction=1;
break;
}
if(!show_instraction)
{
lpddsback->Blt(NULL,lpddmenuinst,NULL,DDBLT_WAIT,NULL);
DDraw_Flip();
}
else
{
lpddsback->Blt(NULL,lpddinstraction,NULL,DDBLT_WAIT,NULL);
DDraw_Flip();
Sleep(10000);
show_instraction=0;
DDraw_Fill_Surface(lpddsback,0,NULL);
break;
}
if(keyboard_state[DIK_UP] || keyboard_state[DIK_W])
{
control_menu=1;
Sleep(300);
break;
}
else if(keyboard_state[DIK_DOWN] || keyboard_state[DIK_S])
{
control_menu=3;
Sleep(300);
break;
}
else if(keyboard_state[DIK_ESCAPE])
{
SendMessage(main_window_handle,WM_DESTROY,0,0);
break;
}
};
while(control_menu==3)
{
DInput_Read_Keyboard();
lpddsback->Blt(NULL,lpddmenuexit,NULL,DDBLT_WAIT,NULL);
DDraw_Flip();
if(keyboard_state[DIK_UP] || keyboard_state[DIK_W])
{
control_menu=2;
Sleep(300);
break;
}
if(keyboard_state[DIK_RETURN])
{
SendMessage(main_window_handle,WM_DESTROY,0,0);
break;
}
if(keyboard_state[DIK_ESCAPE])
{
SendMessage(main_window_handle,WM_DESTROY,0,0);
break;
}
};
}
else
if (Game_state == GAME_STATE_RESTART)
{
//游戏参数重新设为默认初值。
DDraw_Fill_Surface(lpddsprimary,0,NULL);
Reset_Player();
Player_ship=3;
Reset_Game();
Sleep(1000);
Game_state = GAME_STATE_RUNNING;
}
else
if (Game_state == GAME_STATE_RUNNING)
{
// int index;
//记时器开始记时
Start_Clock();
//清空后备缓冲表面
DDraw_Fill_Surface(lpddsback, 0);
//获取键盘输入的格式化数据
DInput_Read_Keyboard();
if (keyboard_state[DIK_T] && !control_stop1)
{
control_stop1 = 1;
control_stop2 = (control_stop2) ? 0 : 1;
} // end if
if (!keyboard_state[DIK_T]) control_stop1 = 0;
if(!control_stop2)
{
//左边的帮助信息和循环的背景。。
Move_And_Draw_Background();
lpddsback->Blt(&dest_rect,lpddhelp,NULL,DDBLT_WAIT,NULL);
if(part==1)
{
if(control_show_enemy < 130)
{
if(control_show_enemy > 2)
{
Draw_Text_GDI("射",265,220,0,lpddsback);
}
if(control_show_enemy > 4)
{
Draw_Text_GDI("击",280,220,0,lpddsback);
}
if(control_show_enemy > 6)
{
Draw_Text_GDI("小",295,220,0,lpddsback);
}
if(control_show_enemy > 8)
{
Draw_Text_GDI("小",310,220,0,lpddsback);
}
if(control_show_enemy > 10)
{
Draw_Text_GDI("小",325,220,0,lpddsback);
}
if(control_show_enemy > 12)
{
Draw_Text_GDI("游",340,220,0,lpddsback);
}
if(control_show_enemy > 14)
{
Draw_Text_GDI("戏.",355,220,0,lpddsback);
}
if(control_show_enemy > 16)
{
Draw_Text_GDI("川",375,220,0,lpddsback);
}
if(control_show_enemy > 18)
{
Draw_Text_GDI("师",390,220,0,lpddsback);
}
if(control_show_enemy > 20)
{
Draw_Text_GDI("版.",405,220,0,lpddsback);
}
if(control_show_enemy > 22)
{
Draw_Text_GDI("谢",425,220,0,lpddsback);
}
if(control_show_enemy > 24)
{
Draw_Text_GDI("谢",440,220,0,lpddsback);
}
if(control_show_enemy > 26)
{
Draw_Text_GDI("试",455,220,0,lpddsback);
}
if(control_show_enemy > 28)
{
Draw_Text_GDI("玩",470,220,0,lpddsback);
}
if(control_show_enemy > 30)
{
Draw_Text_GDI(": )",490,220,0,lpddsback);
}
if(control_show_enemy > 32)
{
Draw_Text_GDI("制",300,250,0,lpddsback);
}
if(control_show_enemy > 34)
{
Draw_Text_GDI("作",320,250,0,lpddsback);
}
if(control_show_enemy > 36)
{
Draw_Text_GDI("者:",340,250,0,lpddsback);
}
if(control_show_enemy > 38)
{
Draw_Text_GDI("叉",365,250,0,lpddsback);
}
if(control_show_enemy > 40)
{
Draw_Text_GDI("叉",385,250,0,lpddsback);
}
if(control_show_enemy > 42)
{
Draw_Text_GDI("叉.",405,250,0,lpddsback);
}
if(control_show_enemy > 44)
{
Draw_Text_GDI("参:",290,280,0,lpddsback);
}
if(control_show_enemy > 46)
{
Draw_Text_GDI("赛",315,280,0,lpddsback);
}
if(control_show_enemy > 48)
{
Draw_Text_GDI("号:",340,280,0,lpddsback);
}
if(control_show_enemy > 50)
{
Draw_Text_GDI("C-",360,280,0,lpddsback);
}
if(control_show_enemy > 52)
{
Draw_Text_GDI("03",375,280,0,lpddsback);
}
if(control_show_enemy > 54)
{
Draw_Text_GDI("3.",390,280,0,lpddsback);
}
if(control_show_enemy > 56)
{
Draw_Text_GDI("OK了",425,280,0,lpddsback);
}
if(control_show_enemy > 58)
{
Draw_Text_GDI(": )",460,280,0,lpddsback);
}
}
}//end part==1
else if(part==2)
{
if(control_show_enemy < 130)
{
if(control_show_enemy > 2)
{
Draw_Text_GDI("进",265,220,0,lpddsback);
}
if(control_show_enemy > 4)
{
Draw_Text_GDI("入",280,220,0,lpddsback);
}
if(control_show_enemy > 6)
{
Draw_Text_GDI("第",295,220,0,lpddsback);
}
if(control_show_enemy > 8)
{
Draw_Text_GDI("二",310,220,0,lpddsback);
}
if(control_show_enemy > 10)
{
Draw_Text_GDI("关",325,220,0,lpddsback);
}
if(control_show_enemy > 12)
{
Draw_Text_GDI("了",340,220,0,lpddsback);
}
if(control_show_enemy > 14)
{
Draw_Text_GDI("啊.",355,220,0,lpddsback);
}
if(control_show_enemy > 16)
{
Draw_Text_GDI("加",375,220,0,lpddsback);
}
if(control_show_enemy > 18)
{
Draw_Text_GDI("油",390,220,0,lpddsback);
}
if(control_show_enemy > 20)
{
Draw_Text_GDI("啊.",405,220,0,lpddsback);
}
if(control_show_enemy > 22)
{
Draw_Text_GDI("GO!",425,220,0,lpddsback);
}
}
}//end part==2
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
if(!player_win)
{
if(Player_state==ALIVE) //玩家活着才检测它的行为和事件
{
//玩家同时按下右和上,或者右和下
if ((keyboard_state[DIK_RIGHT] && (keyboard_state[DIK_UP])) || (keyboard_state[DIK_D] && (keyboard_state[DIK_W])))
{
//这里将DDraw_BOB中的那个动画序列改成向右的模式动画。
//并将x,y坐标加上速度。
Set_Animation_BOB(&Player,0); //左倾
Player.x+=Player.xv;
Player.y-=Player.yv;
}
else
if ((keyboard_state[DIK_LEFT] && (keyboard_state[DIK_UP]))|| (keyboard_state[DIK_A] && keyboard_state[DIK_W]))
{
//这里将DDraw_BOB中的那个动画序列改成向左的模式动画。
//并将x,y坐标减去速度。
Set_Animation_BOB(&Player,1);
Player.x-=Player.xv;
Player.y-=Player.yv;
}
else
if((keyboard_state[DIK_RIGHT] && (keyboard_state[DIK_DOWN])) || (keyboard_state[DIK_D] && keyboard_state[DIK_S]))
{
Set_Animation_BOB(&Player,0);
Player.x+=Player.xv;
Player.y+=Player.yv;
}
else
if((keyboard_state[DIK_LEFT] && (keyboard_state[DIK_DOWN])) || (keyboard_state[DIK_A] && keyboard_state[DIK_S]))
{
Set_Animation_BOB(&Player,1);
Player.x-=Player.xv;
Player.y+=Player.yv;
}
else
if (keyboard_state[DIK_UP] || keyboard_state[DIK_W])
{
//这里将DDraw_BOB中的那个动画序列改成单张的。
//将y 坐标减去速度。
Player.y-=Player.yv;
}
else
if (keyboard_state[DIK_DOWN] || keyboard_state[DIK_S])
{
//这里将DDraw_BOB中的那个动画序列改成单张的
//将y坐标加上速度。
Player.y+=Player.yv;
}
else
if(keyboard_state[DIK_LEFT] || keyboard_state[DIK_A])
{
Set_Animation_BOB(&Player,1);
Player.x-=Player.xv;
}
else
if (keyboard_state[DIK_RIGHT] || keyboard_state[DIK_D])
{
Set_Animation_BOB(&Player,0);
Player.x+=Player.xv;
}
if (keyboard_state[DIK_V] && !Scanner_time)
{
Scanner_time = 1;
Scanner_show = (Scanner_show) ? 0 : 1;
} // end if
if (!keyboard_state[DIK_V])
Scanner_time = 0;
if(!Scanner_show)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -