游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4563|回复: 3

刚写的一个游戏调试文件,高手点评以下,新手参考一下

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2003-10-19 17:40:00 | 显示全部楼层 |阅读模式
/*************************************

*       WIN32程序调试输出器 for Visual C++ (主要适用于开发全屏游戏又没有联机调试条件的个人开发者!)

*       chunfengzhao@sina.com

*       nwpu.狗蛋.

*       如果你对此有所改进,请告诉我一下!

************************************************************/



//注意,这个调试器只在 Debug模式下有效,对Release模式没任何影响(Release模式下自动屏蔽所有调试代码)!

//默认输出文件:debug.log



//如果配合VC 内部定义的几个宏:__FILE__,__LINE__......效果更好!

//使用方法:在需要调试的文件中包含这个头文件

//声明一个调试器对象,如:DebugStream debuger;或DebugStream debuger(1);或DebugStream debuger("debug.txt");

//推荐使用:DebugStream debuger("somefile.txt");

//在欲输出的地方就用:debuger<<"some message.."<<456<<...

//就像cout<<....一样,注意,用endlf换行,如debuger<<endlf;

/**************例子*******

DebugStream  debug(1);

int WINAPI WinMain(…){

……

int x=0;

BOOL r=game.Init(&x);

if(!r){

debug<<”游戏初始化失败”<<”x=”<<x<<endlf;

return 0;

}

……

}



*///////////////////////////////////////////////////////////////////

#ifndef _DEBUG_H_

#define  _DEBUG_H_

#ifdef _DEBUG

#include<windows.h>

#include<stdio.h>



struct _FENDL_{//这是一个没有实际内容的数据类型,仅仅是为了创建一种与基本类型不相冲突的重载

};

#define endlf ((_FENDL_ *)0)

class DebugStream {

    HANDLE file;

    bool buffered;

public:

    void SignUp(HANDLE fl=INVALID_HANDLE_VALUE){

        if(fl==INVALID_HANDLE_VALUE) return;

        char msg[256];

        unsigned char end[4]={0xd,0xa,0xd,0xa};

        sprintf(msg,"编译时间:%s,%s.",__DATE__,__TIME__);

        DWORD writein;

        SetFilePointer(fl,0,0,FILE_END);

        WriteFile(fl,end,4,&writein,NULL);

        WriteFile(fl,&msg,(DWORD)strlen(msg),&writein,NULL);

        WriteFile(fl,end,2,&writein,NULL);

    };

    DebugStream(bool b=false){//当指明b=true时,会启用缓存,log文件仅仅被打开一次,但是可能造成冲突

    //否则,每一次<<操作将会打开,关闭文件一次

        buffered=b;

        if(b){

            file=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

            if(file==INVALID_HANDLE_VALUE) buffered=false;

            else SignUp(file);

        }

    }

    DebugStream(char* filename){//指明调试的输出文件

        if(NULL==filename) buffered=false;

        else{

            file=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

            if(file==INVALID_HANDLE_VALUE) buffered=false;

            else {

                SignUp(file);

                buffered=true;

            }

        }

    }

    ~DebugStream(){

        if(buffered){

        if(file!=INVALID_HANDLE_VALUE) CloseHandle(file);

        }

    }

    DebugStream &operator<<(char c){

        if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,&c,1,&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,&c,1,&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

    DebugStream &operator<<(char *s){

            if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

    DebugStream &operator<<(int x){

            char s[32];

    sprintf(s,"%d",x);

    if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

    DebugStream &operator<<(unsigned int x){

    char s[32];

    sprintf(s,"%u",x);

    if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

    DebugStream &operator<<(_FENDL_ *p){

        unsigned char end[2]={0xd,0xa};

    if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,end,2,&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,end,2,&writein,NULL);

            CloseHandle(f);

        }

    }

        return *this;

    }

    DebugStream &operator<<(float x){

    char s[32];

    sprintf(s,"%.8f",x);

    if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

    DebugStream &operator<<(double x){

    char s[32];

    sprintf(s,"%.16f",x);

    if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

    DebugStream &operator<<(long x){

    char s[32];

    sprintf(s,"%l",x);

    if(buffered){

        DWORD writein;

        SetFilePointer(file,0,0,FILE_END);

        WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);

    }

    else{

        HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

        if(f!=INVALID_HANDLE_VALUE){

            DWORD writein;

            SetFilePointer(f,0,0,FILE_END);

            WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);

            CloseHandle(f);

        }

    }

    return *this;

    }

};



#pragma warning(disable:4267)

#else

#define  DebugStream    /##/

#define  debug          /##/   

#endif

#endif
[em3]

4

主题

18

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2003-11-15 19:04:00 | 显示全部楼层

Re:刚写的一个游戏调试文件,高手点评以下,新手参考一

这是一个日志的类么?
线程安全么?
基本的如Write之类的API调用你真的那么放心么?怎么看不到if

1

主题

8

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2003-12-10 14:32:00 | 显示全部楼层

Re:刚写的一个游戏调试文件,高手点评以下,新手参考一

我也看不懂,一样郁闷!

2

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-2-28 12:16:00 | 显示全部楼层

Re: 刚写的一个游戏调试文件,高手点评以下,新手参考一

你的想法不错
可以考虑使用stl,这样写的简单的多
#include <sstream>
class cLog
{
        std:fstream m_file;
        template <class T>
                cLog& operator << (const T& value)
        {
                std::ostringstream myString;
                myString << value;
                m_file << myString.str();
                return *this;
        }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-25 13:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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