返回首页
当前位置: 999游戏网 > 冒险小游戏 >

2d小游戏:2D小游戏的控制处理

时间:2010-02-09 06:34来源:unknown 作者:1 点击:

线程同步没有做好我最近做个2D的射击类小游戏,
采用的是观察者的设计模式.
1个绘图线程,
1个计算线程,
当我操纵射击或者来会跑动

线程同步没有做好我最近做个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)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐内容