游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6018|回复: 0

[原创]用启动参数设置程序是否窗口化

[复制链接]

11

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2009-10-9 21:43:00 | 显示全部楼层 |阅读模式
[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;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-2 05:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表