ArchLinux — Musca 平铺窗口管理器

作为重度 Terminal 使用者,最初用的是 Gnome-Do 这种启动器来调 Gnome-Terminal,后来发现了 Tilda ,一个 Drop Down Terminal ,因为 F1 F2 都经常会用到,就绑在 F3 上。

这种模式一直使用了好久,直到我遇到了 Tiling Window Manager。所谓平铺窗口就是窗口平铺开,窗口与窗口之间不互相遮挡,没有重叠。awesome  subtile  i3 什么的好多品种,最后还是选择了 Musca。据说 windows 在 1.0 的时候也是平铺窗口的,后来改成层叠的了。安装和配置就不多说了,LinuxToy 有篇不错的文章 http://linuxtoy.org/archives/musca.html 。

Read more »

泡泡堂Tips

C++ fstream 使用相对路径存取文件失败

读取泡泡堂地图的时候发现 ifstream 无法打开文件,后来发现是因为不能使用相对路径名,但如果使用绝对路径,游戏的移植性又太差,解决方法:

TCHAR buf[MAX_PATH + 1];
CString strtemp, path;
//得到exe文件的路径名
GetModuleFileName(NULL,buf,sizeof(buf));
strtemp=buf;
//得到exe文件所在文件夹的路径
int s=strtemp.ReverseFind('\\');
if (s != -1)
	strtemp=strtemp.Left(s);
//最终路径
path = strtemp+"\\pic\\town2.mp";
ifstream fin(path);
if (fin.fail())
{
	::MessageBox(NULL, "read file failure", "Error", MB_OK ¦ MB_ICONERROR ¦ MB_APPLMODAL);
}

error C2601: 本地函数定义是非法的

问题原因:少了个大括号

关于HGE引擎设置bmp图片的ColorKey

HGE引擎原本无法对bmp图片设置透明色,但是现有的资源都是bmp的,转换太麻烦,只要对引擎稍加修改就可以达到目的.

原引擎接口:

HTEXTURE CALL HGE_Impl::Texture_Load(const char *filename, DWORD size, bool bMipmap)
{
	void *data;
	DWORD _size;
	D3DFORMAT fmt1, fmt2;
	LPDIRECT3DTEXTURE8 pTex;
	D3DXIMAGE_INFO info;
	CTextureList *texItem;

	if(size) { data=(void *)filename; _size=size; }
	else
	{
		data=pHGE->Resource_Load(filename, &_size);
		if(!data) return NULL;
	}

	if(*(DWORD*)data == 0x20534444) // Compressed DDS format magic number
	{
		fmt1=D3DFMT_UNKNOWN;
		fmt2=D3DFMT_A8R8G8B8;
	}
	else
	{
		fmt1=D3DFMT_A8R8G8B8;
		fmt2=D3DFMT_UNKNOWN;
	}

//	if( FAILED( D3DXCreateTextureFromFileInMemory( pD3DDevice, data, _size, &pTex ) ) ) pTex=NULL;
	if( FAILED( D3DXCreateTextureFromFileInMemoryEx( pD3DDevice, data, _size,
							D3DX_DEFAULT, D3DX_DEFAULT,
							bMipmap ? 0:1,		// Mip levels
							0,			// Usage
							fmt1,			// Format
							D3DPOOL_MANAGED,	// Memory pool
							D3DX_FILTER_NONE,	// Filter
							D3DX_DEFAULT,		// Mip filter
							0,			// Color key
							&info, NULL,
							&pTex ) ) )

	if( FAILED( D3DXCreateTextureFromFileInMemoryEx( pD3DDevice, data, _size,
							D3DX_DEFAULT, D3DX_DEFAULT,
							bMipmap ? 0:1,		// Mip levels
							0,			// Usage
							fmt2,			// Format
							D3DPOOL_MANAGED,	// Memory pool
							D3DX_FILTER_NONE,	// Filter
							D3DX_DEFAULT,		// Mip filter
							0,			// Color key
							&info, NULL,
							&pTex ) ) )

	{	
		_PostError("Can't create texture");
		if(!size) Resource_Free(data);
		return NULL;
	}

	if(!size) Resource_Free(data);

	texItem=new CTextureList;
	texItem->tex=(HTEXTURE)pTex;
	texItem->width=info.Width;
	texItem->height=info.Height;
	texItem->next=textures;
	textures=texItem;

	return (HTEXTURE)pTex;
}

理论上只要对该函数增加一个 ColorKey 的参数,然后在 D3DXCreateTextureFromFileInMemoryEx 调用里将 0 改成 ColorKey 就可以了,但由于HGE使用DX8,我的电脑没有安装,所以编译不成功,在网上找到一个改过的版本,不过是直接把RGB(255,0,255)设为了透明色,不能用别的透明色,凑合用着…

关于常量和全局变量

对于游戏里的各种常量,一开始是分别写在各个类里的,后来发现很多类都要用到相同的常量,要重复设置很多遍.

更佳方案:单独写一个头文件用来定义常量和宏

如果将全局变量写到头文件里就容易出现各种莫名其妙的错误,基本是因为重定义的问题,如果一个头文件被 include 多次就会出现这个问题,即使使用 ifdef 之类的宏只定义一次也难免会出问题,后来就导致我的程序无法编译,即使改回去也编译不成功,这个原因至今不明.

方案:目前的解决方法是把全局变量写在 main 函数前,在其它文件里使用 extern 声明. 不知道又没用更好的方案,有时间要把C++基础补补了.好多东西都忘了.

另外如果两个头文件相互 include 也会出现奇怪问题,设计时要把类的关系划分清楚,搞的很混乱就很容易出问题.

C++传递二维数组作为函数参数的语法:

比如一个二维数组:

int map[10][12];

函数定义方法

void fuc( int map[][12] )
{
    int (*interMap)[12] ; //这个定义太纠结了>___<
    interMap = map;
}

使用库时报错缺少 dll 文件

解决方法: 要将库里的 dll 文件放到 exe 文件的文件夹下.

No space left on device

今天又遇到一个问题,touch 文件的时候提示 空间已满(No space left on device),但 df -h 的结果是每个分区都有比较大的空余。翻了10多页 Google,终于找到了答案: Ext 3 的 Inode 满了。查看的命令很简单,用df 的 -i 参数来查看 Inode 的使用率。

df -i

发现一个分区已经占用 100% 了。

于是到处找哪里小文件成堆,最后定位在了 /var/spool/clientmqueue/ 这个目录文件过多。

那就删呗,结果 rm -rf * 报错参数过多。于是

for i in `ls`; do rm $i; done

确实开始删了。。。每秒50个。。总共 120000+ 文件要删的呀,这还得了。。

mkdir /tmp/temp
rsync --delete-before -a -H -v --progress --stats /tmp/temp/ /var/spool/clientmqueue/

注意最后2个参数目录后面一定要加 / ,至于为什么直接 man rsync。

删除速度每秒1300,问题解决~

PS.

1. 正在写的监控程序要把 Inode 监控加上了…

2.  sendmail 这个东西如果不使用最好把服务关掉,这个破东西容易引发各种各样的问题 …

贪吃蛇&泡泡堂编辑器Tips

用 MFC 写贪吃蛇和泡泡堂地图编辑器的作业的时候发现的问题:

1) MFC 对话框无法截取到 WM_KEYDOWN 和 WM_KEYUP 消息,原因是???(我不知道=___=),要截获按键消息可重载 PreTranslateMessage 函数,使用方法如下:

BOOL CSnakeDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (!(pMsg->lParam & 0x40000000))
	{
		switch(pMsg->wParam)
		{
		case VK_DOWN:
			break;
		default:
			break;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

其中 (pMsg->lParam & 0x40000000)  这个条件是为了确认在按下键或抬起的时候进行消息处理,否则每次按键会处理两次,一次是按下一次是抬起.写的时候贪吃蛇的行为很奇怪找了好久才发现是这个问题=___=.

随时监测某个键是否按下的方法:

#define KeyDown(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

我使用这个方法来处理泡泡堂人物的走动.在每一帧监测一次并更新数据.缺点是帧数低的时候可能会漏掉按键消息.

2)按下回车键对话框就自动关闭了…..这个解决方法简单,初始化对话框时加上如下函数调用:

SetDefID(-1);

另外要设置对话框的大小位置:

::SetWindowPos(this->m_hWnd, HWND_BOTTOM, left, top, width, height, SWP_NOZORDER);

3)打开和保存文件:

//第一个参数true是打开对话框,false为另存为对话框
CFileDialog fd( true, "xx", NULL, OFN_HIDEREADONLY ¦ OFN_OVERWRITEPROMPT,"xx文件( *.xx )¦*.xx¦¦", this );
if(  fd.DoModal()  == IDCANCEL  )
	return;
CString name(  fd.GetPathName()  ); //得到选择的文件路径名

4)给对话框加上菜单:

建好菜单资源后,把菜单ID添加到对话框资源的”Menu”属性中.

5) memset(arrName, 0, sizeof(int) * n);

将一块内存区域快速清0,最后一个参数是以字节为单位的内存区大小.

ASSERT(x);

老师推荐用的东西…如果x为假就会弹出对话框”Debug Assertion Failed”显示报错信息,否则程序可能只是崩掉…但是报错信息没写什么地方出的错,这个宏大概是用来缩小查错范围的吧…

 

最后抱怨一下,VS2003真心难用啊,各种问题…不知道老师干嘛要让我们用这个老古董=___=!

ArchLinux

当时在 Arch 和 Gentoo 之间选择,2个发行版都很适合定制,但我的老掉牙的 HP520 实在编译不动一堆堆的软件,就选 Arch 了。

目前在用的软件

musca  conky  fcitx zsh  mpd  emacs

还有个特别推荐的字体 monofur,附个链接

http://www.dafont.com/monofur.font

不同的发行版之间最大的不同是软件包管理器,但这只是表面上

A simple, lightweight linux distribution

ArchLinux

Blog 搬到这里了~

之前放在 blogger 上的,也没写多少东西,把 blog 搬过来跟女友的住一起了,要不 linode 上的资源也是浪费~

文章转过来,就把 blogger 上那个关了~

lazy 是女友小懒,bee 是我勤劳的小蜜蜂 -_-|| ,blog 里就不用 falood 这个名字了~

技术博,不矫情~

 

Hello world!