|
[em3]首先要感谢 光线引擎的开发组为我们带来了自己做游戏的可能.
首先建立main.h gamemain.h main.cpp gamemain.cpp
4个文件
在main.h中,路径根据自己的环境来设定
#include <windows.h>
#include "stdio.h"
#include "./include/light.h"
#pragma comment( lib, "light.lib" )
在main.cpp中的内容
#include "main.h"
#include "gamemain.h"
//字符串cmdline将保存修剪完成后的启动参数
char* cmdline;
//console方法修剪传进来的启动参数
//主要功能去掉参数前的第一个字符“-”
char* console(char* co)
{
//声明一个char*变量str 它的长度是传进来的co的长度
char* str=new char[strlen(co)];
int y=strlen(co);
for(int i=0;i<strlen(co);i++)
{
if(i==strlen(co)-1)
str='\0';
else
str=co[i+1];
}
return str;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX wcex; //win窗体类结构体
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ERROR)); //定义游戏图标
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ERROR)); //定义游戏小图表(任务栏中现实)
//把传进来的参数行 赋值给test
char* test=lpCmdLine;
//判断是否有参数,并且参数第一个字符为"-"
if(test!=NULL && test[0]=='-')
{
//printf("有参数 %s,%d\n",console(test),sizeof(test));
cmdline=console(test);
//实力化引擎类,这里我把引擎程序方到类中实现了.
gamemain *gm=new gamemain();
gm->gameshow(); //开始运行游戏引擎
//退出程序前彻底销毁引擎类收回内存空间
delete gm;
}
else
{
//实力化引擎类,这里我把引擎程序方到类中实现了.
gamemain *gm=new gamemain();
//printf("无参数\n");
gm->gameshow(); //开始运行游戏引擎
//退出程序前彻底销毁引擎类收回内存空间
delete gm;
}
return 0;
}
在gamemain.h中
extern char* cmdline; //申明这个字符串变量在其他文件中已经申明了
class gamemain
{
public:
LightEngine *engine; //申明引擎类
LightImage *ui[5]; //申明图片类
LightText *text; //申明字体实现类
LightImageRenderDesc desc;//申明图像操作类
LightInput *input; //申明输入设备类
LightSound *sound[2]; //申明sound音乐类
POINT point; //申明2D坐标类,只保存xy轴坐标.本例中用做保存鼠标坐标
int iScreenWidth; //用于存储系统屏幕宽度
int iScreenHeight; //用于存储系统屏幕高度
//====引擎通用实例====
LightEngineDesc engineDesc;//创建光线引擎实例
//====方法函数====
gamemain(); //构造函数在被初始化时调用
~gamemain(); //析构函数在被销毁时调用
int gameshow(); //引擎主函数
};
在gamemain.cpp中
#include "main.h"
#include "gamemain.h"
#include <string>
/***************************************
重写gamemain类中的方法
****************************************/
//构造方法
gamemain::gamemain()
{
//获得显示器分辨率
HDC hIC=::CreateIC(TEXT("DISPLAY"),TEXT(""),TEXT(""),NULL);
iScreenWidth = GetDeviceCaps(hIC,HORZRES); //获得系统分辨率宽度
iScreenHeight = GetDeviceCaps(hIC,VERTRES); //获得系统分辨率高度
DeleteDC(hIC); //它的使命完成了,销毁它
//当启动参数不等于空时检测,是否是全屏显示
if(cmdline != NULL)
{
if(strcmp(cmdline,"full")==0 || strcmp(cmdline,"FULL")==0)
{
//当参数是full时,设置成全屏显示
engineDesc.displayMode.mode = LIGHT_FULLSCREEN_MODE; //全屏显示模式
}
else
{
//当参数不为full时,设置成窗口显示
engineDesc.displayMode.mode = LIGHT_WINDOW_MODE; //窗口显示模式
}
}else{
engineDesc.displayMode.mode = LIGHT_WINDOW_MODE; //窗口显示模式
}
//设置光线引擎实例
engineDesc.displayMode.window.x = iScreenWidth/2-400; //让窗体中好现实在屏幕中间
engineDesc.displayMode.window.y = iScreenHeight/2-300;//让窗体中好现实在屏幕中间
engineDesc.displayMode.window.width = 800; //设置窗口宽度
engineDesc.displayMode.window.height = 600; //设置窗口高度
engineDesc.displayMode.fullscreen.width = iScreenWidth; //全屏模式的宽度—这里我设置和系统相同
engineDesc.displayMode.fullscreen.height = iScreenHeight; //全屏模式的高度—这里我设置和系统相同
engineDesc.displayMode.fullscreen.color = 32; //全屏幕模式的色度默认16位
engine = LightEngineCreate( engineDesc );
// 改变窗口标题
engine->setString( LIGHT_WINDOW_CAPTION, "自制按钮脚本测试" );
//取消默认鼠标显示
ShowCursor( FALSE );
// 关闭垂直同步
engine->disable( LIGHT_SWAP_INTERVAL );
// 启用关键色(系统默为禁用关键色)
engine->enable( LIGHT_KEY_COLOR );
// 设置关键色(默认值为黑色 0,0,0 )
//engine->setKeyColor( 255, 0, 0 );
// 创建文字对象
LightTextDesc textDesc;
text = engine->createText( textDesc );
// 创建输入接口
LightInputDesc inputDesc;
input = engine->createInput( inputDesc );
// 创建图像对象
LightImageDesc imageDesc;
ui[0] = engine->createImage( imageDesc );
ui[1] = engine->createImage( imageDesc );
ui[2] = engine->createImage( imageDesc );
//ui[3] = engine->createImage( imageDesc );
//ui[4] = engine->createImage( imageDesc );
ui[0]->load("../data/img/m_bg.jpg");
ui[1]->load("../data/img/m1.png");
ui[2]->load("../data/img/m2.png");
//ui[3]->load("../data/img/bt_0.png");
//ui[4]->load("../data/img/bt_1.png");
// 创建声音对象
LightSoundDesc soundDesc;
sound[0] = engine->createSound( soundDesc );
sound[1] = engine->createSound( soundDesc );
// 将声音文件读取到内存中
sound[0]->load( "../data/sound/hqmr.wav" );
sound[1]->load( "../data/sound/2pop01.wav" );
//设置sound[0]重复200次
sound[0]->setRepeats(200);
// 可以同时播放多个声音(支持混音)
sound[0]->play();
}
//析构方法
gamemain::~gamemain()
{
//收回图像控件占用的内存
ui[0]->unload();
ui[1]->unload();
ui[2]->unload();
//ui[3]->unload();
//ui[4]->unload();
//收回音乐控件占用的内存
sound[0]->unload();
sound[1]->unload();
// 释放光线引擎实例
LightEngineRelease( engine );
}
//引擎主显示方法
int gamemain::gameshow()
{
do
{
// 显示光标位置
input->getCursorPos(&point);
// 清除屏幕内容
engine->clear( LIGHT_COLOR_BUFFER_BIT | LIGHT_DEPTH_BUFFER_BIT );
//当程序以全屏模式运行时的状况
if(engineDesc.displayMode.mode==LIGHT_FULLSCREEN_MODE)
{
// 缩放图像
desc.flags = LIGHT_IMAGE_DESTRECT;
desc.dest_rect.left = 0;
desc.dest_rect.top = 0;
desc.dest_rect.right = iScreenWidth;
desc.dest_rect.bottom = iScreenHeight;
ui[0]->renderDesc(0,0,desc);
}
else{
//当不在全屏时。这里以800*600为例
// 缩放图像
desc.flags = LIGHT_IMAGE_DESTRECT;
desc.dest_rect.left = 0;
desc.dest_rect.top = 0;
desc.dest_rect.right = 800;
desc.dest_rect.bottom = 600;
ui[0]->renderDesc(0,0,desc);
}
//显示帧速(FPS)
char fps[20];
sprintf_s( fps,20, "帧速: %d 帧/秒", engine->getFramePerSecond() );
text->color( 255, 255, 0 );
text->setTextPos( 20, 550 );
text->drawText( fps );
//音乐播放状态显示
char soundState[22];
sprintf_s( soundState,22, "音频播放状态:%s", sound[0]->getState()!=0?"播放":"停止" );
text->color( 255, 255, 0 );
text->setTextPos( 120, 550 );
text->drawText( soundState );
//鼠标坐标显示
char mxy[40];
sprintf_s( mxy,40, "当前X坐标为:%d 当前Y坐标为:%d", point.x , point.y );
text->color( 255, 255, 0 );
text->setTextPos( 240, 550 );
text->drawText( mxy );
//显示提示
text->color( 0, 255, 0 );
text->setTextPos( 20, 10 );
text->drawText( "按ESC退出程序,按S键控制音乐播放或停止。" );
//显示鼠标
input->getKeyState(KEY_MOUSE_BUTTON0)==0?ui[1]->render(point.x,point.y):ui[2]->render(point.x,point.y);
//当按下S键时,如果目前为播放状态就改为停止,否则开始播放
if(input->getKey()==KEY_S)
sound[0]->getState()==0?sound[0]->play():sound[0]->stop();
//当按ESC时退出游戏
if(input->getKeyState(KEY_ESCAPE)!=0)goto append;
// 更新显示
engine->swapBuffers();
}
while( engine->dispatchMessage() );// 配送消息
append:
return 0;
} |
|