线程同步没有做好我最近做个2D的射击类小游戏, 采用的是观察者的设计模式. 1个绘图线程, 1个计算线程, 当我操纵射击或者来会跑动, 瞄准的时候,这个单位出现残像 有的时候却没有. 怎么回事啊,那位大侠做过,给个 明示吧.想的头发都只剩下3根了. - ken继续学习
- 三毛你好,帮你顶下
- 曾经可能有机会做新手
- 用的什么引擎啊
delphiX还是Asphype啊 - 才接触游戏,还不会那些的.
就是GDI+多线程 这一步走好了在弄dx或者openGL什么的. - 不会帮顶
- 眼看10.1过去了,还没有解决,郁闷.
- 没几人用Delphi做游戏吧,我估计,我不会
- 10.1过了,还是没有人来
- 一意孤行
- 瞄准的时候,这个单位出现残像
有的时候却没有. - 怪物,子弹,可控单元的数据存放在结构数组里.
结构体 . posPre:Tpoint;//原位置 posNow:Tpoint;//当前位置 . 计算线程每隔10MS计算下单元的位置,然后把这个位置 写到posNow,将原当前位置移动到pospre; 绘图线程 在当前位置bitblt上单元图象,在posPre上贴上背景图. 现象如下: 开始游戏后不管,那么游戏一直正常运行, 使用键盘控制单元射击,一段时间后出现残像, 使用鼠标点击From,也会出现. 我用的就是TFrom,override了wndproc,提升了进程优先级为HIGH_PRIORITY_CLASS - 估计是你控制fps出的问题
好好看看关于fps控制的思想 - 这样肯定是有问题了
计算线程每隔10MS计算下单元的位置,然后把这个位置 写到posNow,将原当前位置移动到pospre; 完成这个过程之后,必须马上重绘,才能进行下一次计算画面不花才怪 - Delphi开发游戏的多了怎么能说没有人用delphi开发网游呢?
- 把Demo弄出来大家看看玩玩啊
- 我原来也认为是这个问题,但经过检验不是.
因为错误是在一段时间后发生的 - DMEO正在弄,
正在+声音, delphi的DxSound资料不多, 混音还没有过去. - delphi还能开发游戏?
呵呵,我是新手上路,还不懂 有什么网游是Delphi写的啊 - 我不明白为什么要弄多线程…
你的问题只有看过Demo才能继续讨论下去 - 刚弄好声音,全弄好了上传到空间,大家帮忙看看分析下.
用多线程的原因是我用的TFROM,没有CreateWindow - 呵呵,TForm完全可用于所有类型的游戏,而且让游戏编程异常便捷.
LZ可以去GameRes参考我写过的几个帖子,GameRes上的ID和我在CSDN的ID是一样的. - //将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 0then 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; - 函数名称编译后怎么变了呢,真是郁闷!
- 线程有好多的细节,多多查资料
(责任编辑:admin) |