社区
GAME,图形处理/多媒体
帖子详情
2D小游戏的控制处理
baiduan
2008-09-30 08:28:52
我最近做个2D的射击类小游戏,
采用的是观察者的设计模式.
1个绘图线程,
1个计算线程,
当我操纵射击或者来会跑动,
瞄准的时候,这个单位出现残像
有的时候却没有.
怎么回事啊,那位大侠做过,给个
明示吧.想的头发都只剩下3根了...
...全文
193
25
打赏
收藏
2D小游戏的控制处理
我最近做个2D的射击类小游戏, 采用的是观察者的设计模式. 1个绘图线程, 1个计算线程, 当我操纵射击或者来会跑动, 瞄准的时候,这个单位出现残像 有的时候却没有. 怎么回事啊,那位大侠做过,给个 明示吧.想的头发都只剩下3根了...
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
testerHooK
2008-10-25
打赏
举报
回复
没有必要自己封装DSound。
你如果不是商业用的软件,可以去使用FMOD库,它对Delphi支持的很好。
也可以使用OpenAL,不过需要自己改写头文件,但是比使用DSound方便多了。
fxh7622
2008-10-21
打赏
举报
回复
传奇就是DELPHI开发的。
cncharles
2008-10-19
打赏
举报
回复
线程有好多的细节, 多多查资料。
baiduan
2008-10-19
打赏
举报
回复
函数名称编译后怎么变了呢,真是郁闷!
baiduan
2008-10-19
打赏
举报
回复
//将DirectSound 的播放封装到DLL给Delphi调用
extern "C" __declspec(dllexport) int _stdcall WaveOutBuffer(HWND hd,LPCSTR Filename,void* &pSBuf)
{
LPDIRECTSOUND pDS;
HRESULT result;
int ErrorCode=0;
//create Sound OBject
result=DirectSoundCreate(NULL,&pDS,NULL);
if (result!=DS_OK)
{
ErrorCode= -1;
goto GameOver;
};
//set RativeLevel
result=pDS->SetCooperativeLevel(hd,DSSCL_PRIORITY);
if (result!=DS_OK)
{
ErrorCode= -2;
goto GameOver;
};
//set First buffer
LPDIRECTSOUNDBUFFER pPBuf;
DSBUFFERDESC desc;
memset(&desc,0,sizeof(desc));
desc.dwSize=sizeof(desc);
desc.dwFlags=DSBCAPS_PRIMARYBUFFER;
desc.dwBufferBytes=0;
desc.lpwfxFormat=NULL;
result=pDS->CreateSoundBuffer(&desc,&pPBuf,NULL);
if (result!=DS_OK)
{
ErrorCode= -3;
goto GameOver;
}
//set file Format=*.wav
WAVEFORMATEX pwfmt;
memset(&pwfmt,0,sizeof(pwfmt));
pwfmt.wFormatTag =WAVE_FORMAT_PCM;
pwfmt.nChannels=2;
pwfmt.nSamplesPerSec=44100;
pwfmt.wBitsPerSample=16;
pwfmt.nBlockAlign=pwfmt.wBitsPerSample/8*pwfmt.nChannels;
pwfmt.nAvgBytesPerSec=pwfmt.nSamplesPerSec*pwfmt.nBlockAlign;
result=pPBuf->SetFormat(&pwfmt);
if (result!=DS_OK)
{
ErrorCode= -4;
goto GameOver;
}
//load file
WAVEFORMATEX swfmt;
MMCKINFO ckRiff;
MMCKINFO ckInfo;
MMRESULT mmresult;
HMMIO hmmio;
DWORD size;
// file is not find
hmmio=mmioOpen((char*)Filename,NULL,MMIO_ALLOCBUF|MMIO_READ);
if (hmmio==NULL)
{
ErrorCode= -11;
goto GameOver;
}
//file Format is Wrong
ckRiff.fccType=mmioFOURCC('W','A','V','E');
mmresult=mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
if (mmresult!=MMSYSERR_NOERROR)
{
ErrorCode= -6;
goto GameOver;
}
// Format Error
ckInfo.ckid=mmioFOURCC('f','m','t',' ');
mmresult=mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if (mmresult!=MMSYSERR_NOERROR)
{
ErrorCode= -7;
goto GameOver;
}
//load Foramt lost
mmresult=mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt));
if (mmresult==-1)
{
ErrorCode= -8;
goto GameOver;
}
//load Format lost
mmresult=mmioAscend(hmmio,&ckInfo,0);
ckInfo.ckid=mmioFOURCC('d','a','t','a');
mmresult=mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if (mmresult!=MMSYSERR_NOERROR)
{
ErrorCode= -9;
goto GameOver;
}
size=ckInfo.cksize;
//create second Buffer
//LPDIRECTSOUNDBUFFER pSBuf;
memset(&desc,0,sizeof(desc));
desc.dwSize=sizeof(desc);
desc.dwBufferBytes=size;
desc.lpwfxFormat=&swfmt;
desc.dwFlags=DSBCAPS_STATIC | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME |DSBCAPS_GLOBALFOCUS;
result=pDS->CreateSoundBuffer(&desc,(LPDIRECTSOUNDBUFFER *)(&pSBuf),NULL);
if (result!=DS_OK)
{
ErrorCode= -10;
goto GameOver;
}
//load wav and lock it
LPVOID pAudio;
DWORD bytesAudio;
result=LPDIRECTSOUNDBUFFER(pSBuf)->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
if (result!=DS_OK)
{
ErrorCode= -10;
goto GameOver;
}
//this read sound
mmresult=mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
if (mmresult==-1)
{
ErrorCode= -12;
goto GameOver;
}
//unlock it
result=LPDIRECTSOUNDBUFFER(pSBuf)->Unlock(pAudio,bytesAudio,NULL,NULL);
if (mmresult==-1)
{
ErrorCode= -13;
goto GameOver;
}
GameOver:
if (hmmio!=NULL) {mmioClose(hmmio,0);}
if (pPBuf!=NULL) {pPBuf->Release;}
if (pDS!=NULL) {pDS->Release;}
return ErrorCode;
}
//=================================
extern "C" __declspec(dllexport) int _stdcall PlayWave(void *p,DWORD playMark)
{
LPDIRECTSOUNDBUFFER(p)->Play(0,0,playMark);
return 0;
}
//=================================
extern "C" __declspec(dllexport) int _stdcall releaseLPDIRECTSOUNDBUFFER(void *p)
{
LPDIRECTSOUNDBUFFER(p)->Release;
return 0;
}
//================================
type Typ=function(hd:Thandle;Filename:LPCSTR;var pSBuf:pointer):integer;stdcall;
type Tpl=function(p:pointer;playMark:DWORD):integer;stdcall;
。。。。。。
//例子:
var
p:pointer;
ru:integer;
fn:LPCSTR;
begin
hwnd:=LoadLibrary('soundDll5.dll');
if hwnd>0 then
begin
fn:='102.wav';
a1:=GetProcAddress(Hwnd,'_WaveOutBuffer@12');//这个函数名称是编译后的
yp:=Typ(a1);
ru:=yp(self.Handle,fn,p);//无类型指针P 被赋值为DxSound建立的声音缓冲
a2:=getprocAddress(hwnd,'_PlayWave@8');
pl:=Tpl(a2);
ru:=pl(p,1);//播放背景音乐
end;
//freeLibrary(hwnd);//这里不要立即释放,子弹声音还需要用
end;
testerHooK
2008-10-14
打赏
举报
回复
呵呵,TForm完全可用于所有类型的游戏,而且让游戏编程异常便捷.
LZ可以去GameRes参考我写过的几个帖子, GameRes上的ID和我在CSDN的ID是一样的.
baiduan
2008-10-13
打赏
举报
回复
刚弄好声音,全弄好了上传到空间,大家帮忙看看分析下.
用多线程的原因是我用的TFROM,没有CreateWindow
testerHooK
2008-10-13
打赏
举报
回复
我不明白为什么要弄多线程……
你的问题只有看过Demo才能继续讨论下去。
juandu1188
2008-10-10
打赏
举报
回复
delphi 还能开发游戏?
呵呵,我是新手上路,还不懂。。
有什么网游是Delphi写的 啊>
baiduan
2008-10-10
打赏
举报
回复
DMEO正在弄,
正在+声音,
delphi的DxSound资料不多,
混音还没有过去....
baiduan
2008-10-10
打赏
举报
回复
[Quote=引用 12 楼 etomahawk 的回复:]
这样肯定是有问题了。
计算线程每隔10MS计算下单元的位置,然后把这个位置
写到posNow,将原当前位置移动到pospre;
完成这个过程之后,必须马上重绘,才能进行下一次计算。画面不花才怪。
线程同步没有做好。
[/Quote]
我原来也认为是这个问题,但经过检验不是.
因为错误是在一段时间后发生的
iamduo
2008-10-09
打赏
举报
回复
把Demo弄出来大家看看玩玩啊。
fxh7622
2008-10-08
打赏
举报
回复
Delphi开发游戏的多了。怎么能说没有人用delphi开发网游呢???
etomahawk
2008-10-08
打赏
举报
回复
这样肯定是有问题了。
计算线程每隔10MS计算下单元的位置,然后把这个位置
写到posNow,将原当前位置移动到pospre;
完成这个过程之后,必须马上重绘,才能进行下一次计算。画面不花才怪。
线程同步没有做好。
CDSoftwareWj
2008-10-08
打赏
举报
回复
估计是你控制fps出的问题
好好看看关于fps控制的思想
baiduan
2008-10-08
打赏
举报
回复
怪物,子弹,可控单元的数据存放在结构数组里.
结构体
..
posPre:Tpoint;//原位置
posNow:Tpoint;//当前位置
..
计算线程每隔10MS计算下单元的位置,然后把这个位置
写到posNow,将原当前位置移动到pospre;
绘图线程
在当前位置bitblt上单元图象,在posPre上贴上背景图.
现象如下:
开始游戏后不管,那么游戏一直正常运行,
使用键盘控制单元射击,一段时间后出现残像,
使用鼠标点击From,也会出现.
我用的就是TFrom,override了wndproc,提升了进程优先级为HIGH_PRIORITY_CLASS
etomahawk
2008-10-07
打赏
举报
回复
瞄准的时候,这个单位出现残像
有的时候却没有.
--------------------------------
你的说说你怎么绘制的,否则,怎么帮你找问题呢?
baiduan
2008-10-06
打赏
举报
回复
10.1过了,还是没有人来
qkhhxkj102
2008-10-04
打赏
举报
回复
不会帮顶
panrongzeng
2008-10-04
打赏
举报
回复
没几人用Delphi做游戏吧,我估计,我不会
加载更多回复(5)
2D
格斗游戏,C语言实现
尽管C语言不像现代的高级编程语言那样内置对图形
处理
的支持,但它仍然是构建游戏引擎的基础,尤其对于低级系统
控制
和性能优化至关重要。开发者可能使用了开源库如SDL(Simple DirectMedia Layer)或Allegro来
处理
...
Cocos
2d
-x3.0游戏实例《别救我》源码
Cocos
2d
-x3.0提供了丰富的图形绘制、动画
处理
、物理引擎、音频播放等功能,以及事件系统和场景管理,使得开发者可以专注于游戏逻辑,而不是底层技术实现。 2. **tmx文件**:tg1.tmx是一个Tile Map XML文件,通常...
Java
小游戏
之愤怒的小鸟
《Java
小游戏
之愤怒的小鸟》是一款基于Java编程语言开发的休闲娱乐游戏,旨在提供一个学习和交流编程技术的平台。这款游戏的实现充分展示了Java在图形用户界面(GUI)设计、事件
处理
、对象动画以及游戏逻辑等方面的...
cocos
2d
-x中模态对话框的简单实现
在cocos
2d
-x游戏开发框架中,模态对话框(Modal Dialog)是一种常见的用户界面元素,用于在用户与游戏交互时提供临时信息或者需要用户做出决定的情况。模态对话框会暂停当前游戏流程,直到用户与其交互后才能继续。...
cocos
2d
x使用TiledMap创建斜45度地图场景
在Cocos
2d
-x游戏开发中,TiledMap是一个强大的工具,用于创建复杂的游戏场景,尤其是对于需要精细
控制
的地图设计,如斜45度视角的游戏。本篇文章将深入探讨如何利用Cocos
2d
-x的TiledMap功能创建斜45度地图场景。 ...
GAME,图形处理/多媒体
1,185
社区成员
14,330
社区内容
发帖
与我相关
我的任务
GAME,图形处理/多媒体
Delphi GAME,图形处理/多媒体
复制链接
扫一扫
分享
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章