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 。
泡泡堂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
Blog 搬到这里了~
之前放在 blogger 上的,也没写多少东西,把 blog 搬过来跟女友的住一起了,要不 linode 上的资源也是浪费~
文章转过来,就把 blogger 上那个关了~
lazy 是女友小懒,bee 是我勤劳的小蜜蜂 -_-|| ,blog 里就不用 falood 这个名字了~
技术博,不矫情~