《Windows游戏编程》读书笔记

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
  • 窗口的定义,注册,创建,显示流程。事件处理器,即WinProcLRESULT CALLBACK WindowProc(窗口句柄,消息标识,左参数,右参数)。WM_PAINT:对于DirectX可以30-60帧/秒重画窗口,但对于Windows程序就切力了。

基本windows应用程序框架

主事件循环:

while(GetMessage(&msg, NULL, 0, 0))  { 
  TranslateMessage(&msg);  //虚拟加速键翻译器,输入工具
  DispatchMessage(&msg); //调用WinProc()
}

截屏(2011-08-28 10_03_21).jpg

 主程序入口:定义窗口类→注册窗口→创建窗口→主事件循环;且每个Windows程序都有独立的事件句柄WinProc

 

一个实时事件循环:加入测试消息队列机制,PeekMessage(),使用PM_REMOVE

 

对应同一个窗口类的多个窗口的消息

截屏(2011-08-28 10_22_11).jpg

截屏(2011-08-28 10_45_54).jpg

     动态加载菜单资源。在加载资源时,需要注意字符串形式还是符号常量MAKEINTRESOURCE()
      传入的消息,wparam从技术安全考虑取低位LODWORD(wparam)
 
      在屏幕上渲染是编写一个视频游戏最重要的部分。一般Windows程序用GDI,GDI+,而DirectX则是更专业的DirectDraw,Direct3D
截屏(2011-08-29 10_20_36).jpg 
使用GetDc()函数总可以获得一个窗口的图像描述表hdc
GetDC()-ReleaseDc()→BeginPaint()-EndPaint()  vs ValidateRect()
区别Windows Coords和Client Coords
手动使一个窗口无效:InvalidateRect()
图形&色彩术语
      像素Pixel
      分辨率Resolution
      色深Color depth
      隔行扫描/逐行扫描Interlaced/noninterlaced
      刷新速率Refresh rate (用Hz或fps表示)
      2D/3D加速 2D/3D acceleration
颜色查找表的工作原理
窗口事件
       输出文本:TextOut(Coords); DrawText(Area)
       不透明和透明(SetBkMode)的打印模式
        WM_PAINT,改变窗口大小,移动等情况下产生
键盘事件 →DirectInput
       Win32库,GetAsynKeyState()跟踪状态表中该键的最后已知状态(好处:可跟事件循环无关)
鼠标事件
自我传递消息
       PostMessage() 传递消息序列,异步
       SendMessage() 直接传消息,同步
      
第四章_WindowsGDI,控件和突发奇想     
     >图形设备描述表
             当访问一个图形设备描述表或句柄时,实际上就表示安装在计算机系统上的视频卡具体描述及其分辨率和色彩容量
     >色彩、画笔和画刷
             GDI一般一次只使用一个画笔和一个画刷
     >使用画笔
             创建CreatePen(), 获取默认GetStockObject()
             将任何GDI对象选择到图形设备描述表SelectObject(), 用完DeleteObject()
     >使用画刷
             GDI画刷为2类:纯色的和阴影的←MS愚蠢的规定(?)
             创建纯色填充画刷CreateSoildBrush()
             ....带阴影线的.........CreateHatchBrush()
     >直接绘点 SetPixel()
     >绘制线条 MoveToEx(), LineTo()
   >绘制矩形 Rectangle()
             填充矩形 FillRect()
             右边界的中空矩形FrameRect()
       **对于任何一个实例,必须都要一个窗口hWnd,HDC
      >绘制椭圆 Ellipse()
      >绘制多边形 Polygon()
      >字体 CreateFont()
      >WM_TIMER
            设置定时器 SetTimer,GetTickCount() 一般30fps
      >碰撞逻辑
     > 使用控件
      > 获取消息   GetSystemInfo()  SYSTEM_INFO结构指针
                          GetSystemMetrics()  通用的检索Windows和Desktop所有信息
                          GetTextMetrics()  检索文本规格函数
      > 一个字符的构成  《VC++技术内幕》p75
      > T3D游戏控制程序

 

第五章_ DirectX基础和COM 

> COM  所有的DirectX组件都是由COM构成的
     > HEL(硬件模拟层) 硬件不支持时用软件算法模拟出硬件功能,效率降低,但至少能实现
         HAL(硬件抽象层) 硬件支持需要的性能
     >DirectX基础类v6.0
        DirectDraw:控制视频显示的基本着色和2D图形引擎
        DirectSound:声音组件
        DirectSound3D:3D声音组件
        DirectMusic
        DirectInput:所有输入设备
        DirectPlay:网络方面内容
        Direct3DRM:Direct3D保留模式(用途:编写预排程序,模拟显示,速度极慢的演示)
Direct3DIM:Direct3D即时模式
   DirectSetup/AutoPlay:准DirectX组件
> COM升级的便利性
          COM对象:实际上就是实现大量界面的一个C++类或一套C++类
          COM对象的分布或包含,如何实现即插即用特性
      > GUID(全局单值标识符),或称IID(界面标识符) ← 可以利用微软的GUIDGEN.EXE生成
      > 创建COM
                 1,定义界面: struct  IGraphics : IUnknown {  }
                 2,创建界面容器类(核心) class COM_OBJECT : public  IGraphics, ISound, IInput {  }
      > DLL才是COM对象
      > COM和函数指针
           原型:int (*SetPixel) (int x, int y, int color);
                     int SetPixel_ATI (int x, int y, int color);
                     int SetPixel_VOODOO (int x, int y, int color);
                     int SetPixel_SIII (int x, int y, int color);
                     SetPixel = SetPixel_ATI ; // assigning a function pointer
           C++和虚函数都是建立在函数指针的基础上的,虚函数只是被很好地内置到了编程语言中,加强了功能,实际上就是这么一回事
     > 创建和使用DirectX接口 
        理解COM对象其实就是接口集,该接口集也就是函数指针(VTABLE)
          用DirectX COM对象来工作,只要创建COM对象,获得一个接口指针,然后正确调用该接口即可。
                1,安装SDK时,安装程序会自动对DLL进行装载并注册
                2,Win32 App中必须包含DDRAW.LIB
                3,#include “DDRAW.H”
        本质上讲,任何DirectX的调用都采用的方式: interface_pointer -> method_name (parameter list);
    > 接口查询
               所有的DirectX各个版本里的号码都是不同步的! (命名混乱
               确保使用最新版本的接口:1使用底层COM函数; 2使用QueryInterface()函数
                      LPDIRECTDRAW lpdd;   // version1.0
                      LPDIRECTDRAW lpdd7;  //version7.0
                      DircectDrawCreate(NULL, &lpdd, NULL);  // create version 1.0 DirectDraw object interface
                      lpdd->QueryInterface(IID_IDirectDraw7, &lpdd7); //find IDIRECTDRAW7 interface ID and use it to query for the interface
                      lpdd->Release();  
                      lpdd = NULL;
               
                      DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL);
    > COM / COM++ / DCOM

 

第六章_初次邂逅DirectDraw

>DirectDraw接口
             IUnknown 基本接口
             IDirectDraw 必须创建的主接口对象,支持MMS
             IDirectDrawSurface 用DirectDraw创建,控制和显示的实际显示表面
             IDirectDrawPalette 
             IDirectDrawClipper 帮助剪切DirectDraw光栅和位图操作到一些可见显示表面的子集
     > 组合使用接口
             1,创建主DirectDraw对象,并使用QueryInterface()来得到一个IDirectDraw7接口,或直接DirectDrawCreateEx()创建
             2,IDirectDrawSurface7接口至少创建一个主显示表面用以绘图
             3,IDirectDrawPalette接口创建一个调色板,用RGB三元组初始化并配置到相关显示表面中
             4,至少需要创建一个剪裁器并将尺寸设置为可见窗口的范围
             5,主显示表面上绘图
     > 创建DirectDraw对象 (昨天的内容)
     > DirectDraw的错误处理
              2个宏:FAILED() SUCCEEDED() 一般使用前者
   > DirectDrawCreateEx(NULL,(void**)&lpdd,IDD_IDirectDraw7,NULL);
      > 视频显示设备:
                 全屏模式(容易),直接写到视频设备里。没有其他应用程序能接触到该设备
                 窗口模式(更难掌握),其他应用程序的介入
      >设置DirectDraw的协作级别,IDirectDraw7::SetCooperativeLevel()
> 创建一个显示画面
                  屏幕上所显示的图像只不过是内存的某种形式,调色板或RGB彩色像素矩阵
                  1,写一个DDSURFACEDESC2数据结构
                  2,调用CreateSurface()
      > 选用调色板 SetPalette()
      > 绘图像素
                 所有DirectDraw视频模式和画面都是线性的,内存从上到下,从左到右线性增加
      > 锁定
                或解锁显存,顺序很重要 ::Lock()
      > 屏幕上绘制随机像素的全部过程
                1,// first create base IDirectDraw 7.0 interface
                     DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL);
                2, lpdd->SetCooperativeLevel // set the cooperative level for full-screen mode
                3,  lpdd->SetDisplayMode  // set the display mode   
                4,memset(&ddsd,0,sizeof(ddsd));
                     ddsd.dwSize = sizeof(ddsd); // clear ddsd and set size
                     ddsd.dwFlags = DDSD_CAPS; 
                     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
                5,lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL);// create the primary surface
                6,// build up the palette data array,fill in entry 0 and 255 with black and white
                7,lpdd->CreatePalette// create the palette object
                8,lpddsprimary->SetPalette// finally attach the palette to the primary surface
                9,lpddsprimary->Lock
                10,//TODO
                11,lpddsprimary->Unlock(NULL);// now unlock the primary surface
 

第七章_高级DirectDraw和位图图形

    IDIRECTDRAWSURFACE7::Blt()

    IDIRECTDRAWSURFACE7::BltFast()  需要剪裁时用前者,不需要时用后者

    基础裁剪知识(像素裁剪、位图裁剪),3D裁剪将会十分复杂

        像素按视口裁剪

        位图裁剪技巧

    使用IDirectDrawClipper进行DirectDraw裁剪

        步骤1,创建DirectDraw裁剪器对象,CreateClipper()

            2, 创建Clipper序列 //最麻烦,需要填写RGNDATA结构

            3,用IDIRECTDRAWCLIPPER::SetClipList

            4,用IDIRECTDRAWSURFACE7::SetClipper

    使用位图

        载入.bmp文件 (位图头文件,位图信息段(有调色板的话),位图数据段)

        载入8bit位图 SetEntries

        载入16bit位图 (24bit转16bit)

        载入24bit位图

    离屏表面

        创建的表面跟主表面是兼容的,具有一致的色深


    在离屏表面上进行blitting

      装载位图,创建表面,使用blitting

    色彩键

      源色彩键 DDCOLORKEY Object优先于background

      目标色彩键,方法跟源色彩键相同SetColorKey,需要改变2个标志位

      源叠加色彩键

      目标叠加色彩键


    如何更新DirectDraw调色板项

    256色模式下的色彩旋转(Color Roation)

       模拟水或液体的流动效果

    使用RGB模式的技巧

       1,利用手动色彩变换或查询表

       2,采用新的DirectX彩色和Gamma补偿,实时地在主表面上执行色彩操作


    手动色彩变换及查询表

       透明·alpha混合·光照·暗化处理

    DirectX新的色彩和Gamma控制接口

       IDirectDrawColorControl可以控制高度,对比度,色调,饱和度,锐度和Gamma值

       各种效果:如水下感觉,屏幕闪烁,灯光,黑暗

    将GDI和DirectX联用

       只需在DirectDraw中找到一个兼容DC

       在独占模式下,Windows不能够用GDI在任何DirectDraw表面绘制

    主DirectDraw对象

       GetCaps获得HEL,HAL,用于获取任意表面能力

       GetPixelFormat或GetSurfaceDesc结构DDSURFACEDESC2::ddpfPixelFormat

    在窗口模式下使用DirectDraw

       必须考虑使用者可能在任意分辨率和任意色彩深度模式下启动游戏

    在窗口中绘制像素

       1,主表面是整个屏幕,GetWindowRect()实际上获得的是整个窗口

       2,不知道色深,GetPixelFormat()以决定色彩的深度

    查找实际客户区

       AdjustWindowRectEx 计算不同样式的窗口尺寸

    剪裁DirectX窗口

       裁剪只对blitter起作用

       CreateClipper()

       SetHWnd() 将裁剪器同窗口相关联

       SetCClipper() 裁剪器同想要裁剪的表面相连

    本章总结:

              高彩模式,blitter,裁剪,彩色键,采样理论,窗口方式的DirectDraw



第八章_矢量光栅化及2D变换

   绘制线条

     问题1,计算机屏幕是一个由整数坐标表示的2D网格,如何显示浮点型坐标

     Bresenham算法

     解决实际问题:把像素以最接近实际直线的位置从点p1到点p2进行填充的这个过程成为光栅化。

               1,计算斜率K

               2,画点(x0,y0)

               3, 在x方向上每前进1.0个单位,在y方向上就前进K个单位,把这两个值加到(x0,y0)上

   基础2D图形裁剪知识

     图像空间级(像素级)裁剪,对象空间级裁剪

     两直线之交点

       利用矩阵式求逆阵

     裁剪直线

     Cohen-Sntherland算法

       判断线段跟矩形(剪裁区域)的情况

   线框多边形

     在游戏中,集中注意一件事,那就是速度!

     为了画多边形,所要做的就是对顶点循环,并连接点与点


   2D平面里的变换

     平移

     旋转(计算机中sin、cos采用弧度而不是角度)

     坐标变换很像极坐标向笛卡尔坐标的转变

     旋转时,逆时针θ为正,顺时针θ为负。在显示屏上,y轴是相反方向,正负也相反

     实时程序中使用三角函数很糟糕,需要建立一个查询表,将算好的0-360度的sin、cos值保存在查询表内

     关于精度,选择int还是float还是double

     缩放,每个坐标乘以缩放因子

     矩阵引论

       基础的矩阵知识已经在《3D数学基础》内补完,这里学起来就异常轻松了。

       使用矩阵进行各种变换(平移,缩放,旋转)

    

   填充实心多边形

     第一个约束条件,多边形必须为凸多边形

     第二个约束条件,确定所要画的多边形到底有多复杂


            

   绘制三角形和四边形

     每个端点变成整数之前加0.5

   四边形光栅化的一般情况

   多边形的三角化

     递归分割思想

     通用凸N边形渲染算法


   多边形碰撞检测

     边界球/圆

       对象具有一个平均半径,然后检测半径是否重叠(会有漏判)

       开方函数sqrt会消耗大量CPU周期,想办法优化

         1,只计算一次float差

         2,泰勒级数展开

     边界盒、边界箱

       Find_Bounding_Box_Poly2D

     点包含

       测试一个点是否被包含在一个矩形内部

       ↓如何判断一个点是否被包含在任意凸多边形之内

       半空间检测(Halfspace Test)需要运用到向量点积

   

   深入定时和同步

     基于Win32函数GetTickCount()

   卷轴和摇镜头

     页面卷轴Page Scrolling

     均匀平铺显示引擎

       采用基于tile的数据结构表示场景卷动

     稀疏位图平铺显示引擎(适合太空射击游戏)

     伪3D等轴测引擎

       等轴测Isometric,即采用一定倾斜视角的游戏

       方法一,基于单元,全2D

       方法二,基于全屏,具有一些2D或3D的碰撞网络

       方法三,采用全3D数学运算,使用一个固定的视角

         采用工具画碰撞对象非常消耗时间,且对画面的任何变动都意味着返工


   T3DLIB1函数库

     2D引擎架构,可以先全屏再调整窗口大小到窗口程序

     基本定义

     可用宏

     数据类型和结构

       BOB(Billter Object Engine)

     全局定义

     DirectDraw接口

       DDraw_Init

       DDraw_Shutdown

       DDraw_Attach_Clipper

       DDraw_Create_Surface

       DDraw_Flip

       DDraw_Wait_For_Vsync

       DDraw_Fill_Surface

       DDraw_Lock_Surface

       DDraw_UnLock_Surface

     2D多边形函数

       Draw_Triangle_2D

       Draw_TriangleFP_2D

       Draw_QuadFP_2D

       Draw_Filled_Polygon2D

       Translate_Polygon2D

       Rotate_Polygon2D

       Draw_Line

       Draw_Pixel

       Draw_Rectangle

       Draw_HLine

       Draw_VLine

       Screen_Transitions

       Draw_Text_GDI

     数学和误差函数

       Fast_Distance_2D //3.5% error

       Fast_Distance_3D //11% error

       Find_Bounding_Box_Poly2D

       Open_Error_File

       Close_Error_File

       Write_Error

     位图函数

       Load_Bitmap_File

       UnLoad_Bitmap_File

       Create_Bitmap_File

       Destroy_Bitmap

       Load_Image_Bitmap

       Flip_Bitmap

       Scroll_Bitmap

       Copy_Bitmap

     调色板函数

       Set_Palette_Entry

       Get_Palette_Entry

       Save_Palette_To_File

       Load_Palette_From_File

       Rotate_Colors

      *Blink_Colors

     实用工具函数

       Get_Clock

       Start_Clock

       Wait_Clock

       Collision_Test

       Color_Scan //另一种碰撞检测法

     BOB引擎

       BOB基本上是由一个或多个DirectDraw表面(最大到64个)

       BOB是由当前的DirectDraw裁剪器裁剪

       Create_BOB

       Destroy_BOB

       Draw_BOB

       Draw_Scaled_BOB

       Load_Frame_BOB

       Load_Animation_BOB

       Set_Pos_BOB

       Set_Vel_BOB

       Set_Animation_BOB

       Set_Anim_Speed

       Animation_BOB

       Move_BOB

       Hide_BOB

       Show_BOB

       Collision_BOB //检测2个BOB重叠


  本章总结:

            光栅化、裁剪、直线绘制、矩阵、碰撞检测、定时、卷动、等轴测引擎、完整的位图&多边形库



第九章_DirectInput输入和力反馈

  HEL(Hardware Emulation Layer) 硬件仿真层

  HAL(Hardware Abstraction Layer)硬件抽象层


  DirectInput组件

   DirectInput8Create

   DirectInputDevice8,从DirectInput8创建,和设备(...)通信的渠道

  设置DirectInput步骤

    1,通过DirectInput8Create创建DirectInput8接口

    2,查询设备GUID

    3,调用CreateDevice传递一个GUID

    4,DirectInputDevice8::SetCooperativeLevel 设置协作等级

    5,DirectInputDevice8::SetDataFormat 设置每个设备的数据格式

    6,DirectInputDevice8::SetProperty 设置设备性能

    7,DirectInputDevice8::Acquire 获得设备

    8,(可选)DirectInputDevice8::Poll 轮询设备

    9,DirectInputDirectDevice8::GetDeviceState 从设备获取数据

    用DirectInput的好处就是能与设备驱动无关的方式操作任何输入设备

    总是以创建顺序相反的顺序调用Release

  数据采集模式

    直接数据模式(默认)

    缓存数据模式

  创建主DirectInput对象

    键盘

      协作等级 DISCL_BACKGROUND | DISCL_NONEXCLUSIVE

      复杂的数据结构格式,允许如何格式化从输入设备得来的数据

      通用数据结构 SetDataFormat(&c_dfDIKeyboard)

      GetDeviceState,要在每次游戏循环中读取键盘,时机:循环顶部,在任何处理开始之前

      用完释放 Unacquire

    捕捉鼠标

      绝对模式(移动前后2个点)

      相对模式(移动过程中点的连续)

    使用游戏手柄(略)

    输入消息化

      所有的输入设备数据合并在一起,在根据这个结构做出决定

      Merge_Input(合并后事件的数据,键盘数据指针,鼠标数据指针,手柄数据指针)

    力反馈

    输入系统 T3DLIB2

 本章总结:

          DirectInput、键盘、鼠标、游戏手柄、输入数据消息化、力反馈、完整T3DLIB2库

      

第十章_用DirectSound和DirectMusic演奏乐曲

  DirectSound用于音效,跟单声道配合最好,立体声没有意义

  DirectMusic用于音乐

  一定使用长文件名!

  初始化DirectSound

    DirectSoundCreate

  理解协作等级

    可控制主声音缓冲的设定

    不可控制主声音缓冲的设定

  设定协作级别

    lpds->SetCooperativeLevel

  主声音缓冲与辅助声音缓冲

  创建辅助声音缓冲

    先创建DirectSoundBuffer描述性结构DSBUFFERDESC dsbd  

                                     WAVEFORMATEX pcmwf

    lpds->CreateSoundBuffer(&dsbd, &lpdsbuffer, NULL)

    若函数成功调用,则一个新的声音缓冲就建立了,并传给lpdsbuffer,该缓冲就是准备播放的

  把数据写入辅助声音缓冲

    辅助声音缓冲是循环的

    锁Lock 缓存 lpdsbuffer->lock

    写入数据,需长度

    解锁Unlock lpdsbuffer->Unlock

    释放 lpdsbuffer->Release

  播放声音

    播放缓冲区中的声音数据

      lpdsbuffer->play(0,0,DSBPLAY_LOOPING)

  停止播放

      lpdsbuffer->Stop

  控制音量

    SetVolume 非增大或减小增幅,而是播放的衰减

    配合宏 #define DSVOLUME_TO_DB(volume) ((DWORD)(-30*(100-volume)))

  调整频率

    SetFrequency 即改变音调

  调整声道平衡

    通过左右声道的调节(平移 Panning) 可做局部3D音效

    SetPan(LONG Pan)   0代表中间位置

  用DirectSound反馈信息

    GetCaps 大部分音频信息

    GetStatus 检查正在播放声音缓冲的状态

  从HDD读取声音数据

    DirectSound不支持声音文件的加载,需要自行编写

    读取.wav文件

  

  初始化DirectMusic

    是一个完全COM化组件,需自己COM库来创建COM对象

    因此每个应用程序仅仅需要DirectMusic

      dmksctrl.h

      dmusici.h

      dmusicc.h

      dmusicf.h

  初始化COM

    CoInitialize(NULL) 在任何直接COM调用之前写一次

  创建一个演奏对象,即DirectMusic对象

  调用完之后,dm_perf可以使用

  Init() 如果需要同时使用DirectSound和DirectMusic则需把pDirectSound传入,否则传NULL

  给演奏对象增加端口

    dm_perf->addPort(NULL)

  加载一个MIDI段

    IDirectMusicLoader* dm_loader = NULL

  加载MIDI文件

    DirectMusic称数据块chunk为段segments

  操作MIDI段

    播放MIDI段

    停止

    检查状态

    释放MIDI段

    关闭DirectMusic

  T3DLIB3库

    对DirectSound&DirectMusic API的封装


  本章总结:

            初步了解DirectSound,DirectMusic;

            了解制作(2D)游戏的每一件事情



第十一章_算法,数据结构,内存管理和多线程

  数据结构

    静态结构和数组

    链表

    树 (B树,二分查找树BST)

      3D场景建模,以数百颗树表示空间中的各个房间

      树结构构造二分空间解决渲染问题

  算法分析 

    算法好>>汇编,优化器

    算法分析技术(渐近分析Asymptotic Analysis),基于微积分

    !调用函数比直接绘图用时多,考虑宏或者内联

  递归 Recursion

    函数不能溢出堆栈,且要有终止条件

  优化理论

    内存对齐

  数学技巧

    游戏编程的实质上是数学问题

    位移 product = (n<<7)+(n<<9); //n*128+n*512=n*640

    一个大float数组清零:memset((void*)float_array, 0,0 sizeof(float)*num_floats)

    定点运算

  循环体展开

  查找表

  汇编语言


  多线程编程技术

    SMP(对称多处理,Symmetrical Multiprocessing)利用多处理器分担工作量

    多任务/抢先式操作系统(任何任务,进程,线程,都不能完全控制计算机)

    线程的所有变量都在属于自己的堆栈中创建

    结束线程

        向该线程发送消息通知其结束(√)

        使用内核级的调用强行结束该线程(×)

    在一个封闭的循环中,等待一个变量,会给多任务内核带来繁重的负担并严重占用CPU

  多线程和DirectX

  本章总结:

            数据结构,内存管理,递归,分析,定点数运算,多线程



第十二章_人工智能

  人工智能初步

    人工神经网络

    遗传算法

    模糊逻辑

  3D游戏里的东西长得很真实,但行动起来却很傻

  没有所谓的对错,只有是否有效

  

  确定性AI算法

    第一类AI —— 简单,可预知,可编程

  跟踪算法

    向量,比例缩放因子

  反跟踪·闪避算法

  模拟以及基本控制脚本编写

    [指令,操作数]格式编码

  条件逻辑处理的模式

  建模行为状态系统

  更多表现个性的行为

  用软件对记忆和学习进行建模

    AI由(状态机,条件逻辑,模式,随机数,概率分析)控制

  计划树和决策树

    编程语言对计划建模

  寻路 pathfinding

    试探路(Trial and Error)

    轮廓跟踪(Control Tracing)看起来蠢,没有走最短路径

    碰撞规避跟踪

    路点寻路 通常被采用,可是会增加人工

    寻找p1到p2路径,有很多算法可以做到。但没有一个是实时的


第十三章_基本物理建模

    质量

    时间,算法更多地与帧速率相关,而不是实际时间

    位置,不规则物→质心

    速率

    加速度

    力,力就是单位时间内动量的变化率

    动量,无论什么物体突然停止,例撞上什么的时候,这个物体会承受所有的力

    线性动量的物理性质:守恒与传递

    模拟万有引力效果

    模拟重力井 Gravity Well

    摩擦力

      μs 静态摩擦系数

      μk 动态摩擦系数

      摩擦力模型和重力模型很相似

    斜面上的摩擦力

    基本的特殊碰撞反应

      弹性碰撞 动量,动能守恒

      非弹性碰撞  不守恒

    计算任意方向上的平面碰撞反应

    矢量反射示例

    线段的交点

    简单运动学

        正向运动学

        方向运动学

    粒子系统

        一颗粒子的一般特征:位置,速度,颜色/动画,生命周期,重力,风力

        一个粒子系统:1,粒子数据结构

                      2,处理每个粒子的粒子引擎

                      3,产生特定粒子初始条件的函数

        水汽尾迹算法

        模拟爆炸效果

    基于帧的模拟与基于时间的模拟



第十四章_文字时代

第十五章_综合运用

《我是一只IT小小鸟》读书笔记 朋友推荐的一本书,《我是一只IT小小鸟》。名字和封面都很有新意,当然,内容更是有新意。本书的作者并不是一些业界大牛活着专业作者,而是一群刚刚走出校园,进入工作岗位的毕业生新员工。他们中有的人从小就对计算机感兴趣,一路走来最终进入知名IT公司,有的人甚至是干了几年的化验员,重新考研,进入计算机行业的。但是他们都有一个共同的特点,就是对IT行业有着极大的热情,兴趣是第一要素,但是同样重要的是不断追求, 阅读详情

相关推荐

windows游戏编程的2DRPG人物行走程序及源代码

windows游戏编程的简单2DRPG人物行走程序及源代码 通过鼠标左右键实现 人物的走与跑。人物素材为轩辕剑三的素材 完全只用Windows函数实现。没有directx 仅供学习参考。

游戏编程之二 windows编程基础

第二章 windows编程基础 第一节 引言 为了跟上潮流,我们抛弃了已快被淘汰的DOS操作系统,所有的讲解和例程都是基于微 软的Windows操作系统的。考虑到很多的用户并没有Windows编程基础,所以我们设置了这 一专门讲述、讨论Windows的术语、概念的部分,以使这部分用户能较快地理解和掌握我们 所讲述、讨论的编程思想和编程方法。这一部分中主要讲述的是Windo

张晨光老师的播客 2544

windows游戏编程

该资源是一个基于win32的游戏引擎做出的游戏实例,属于windows编程,运行环境vc++6.0,无需其他插件。

《逐梦旅程——windows游戏编程之从零开始》笔记

游戏开发面面观游戏产业的分类——六大游戏市场游戏类型 游戏开发面面观 游戏产业的分类——六大游戏市场 AAA级游戏开发领域 AAA级(游戏业界通常称其为“Triple-A”,即 3A)游戏是我们经常在评价一款游戏是否为大作的衡量标准,是游戏业界“酷”的代名词。 通常指的是游戏平台像XBOX360/Play Station或者 PC上的游戏作品。 通常团队规模50人以上,开发周期在2~5年之间,有着不菲的开发预算。 是成熟的商业作品,通常都有着精美的画质,好莱坞电影风格的过场CG动画,能将艺术与技术进行.

qq_52317884的博客 9312

Windows机制下的游戏编程实例一

稍微接触一下Windows游戏编程基础,虽然不大喜欢游戏,但是为了扩大知识面,为以后的创新与启发打下基础,还是稍微了解一下: 先来看一个实例吧: 这是程序的文件目录: 里面包含背景音乐与背景图像模板 程序运行效果如下,当然在这里是听不到背景音乐啦,只有你动手亲自去实践,才能懂得编程的乐趣。 主要代码如下: //-----------------------------------

明镜止水的博客 2386

从零开始的Windows游戏编程入门(一) ---- 初入游戏编程 逐梦筑梦第一篇

【代码】从零开始的Windows游戏编程入门(一) ---- 初入游戏编程 逐梦筑梦第一篇。

Love 6's Private Blog 1036

从零开始的Windows游戏编程入门(二) ---- 起航游戏编程 初识窗口创建过程函数 第三章旅程收尾~

本文记录了作者在2025年5月9日进行Windows游戏编程学习的过程。作者首先完成了第三章的学习,并计划编写一个带窗口过程函数的实践代码。随后,作者在前往深圳的班车上完成了一个初具雏形的游戏处理框架,并计划撰写相关博客。文章详细介绍了Windows窗口创建的过程,包括窗口类(WNDCLASSEX)的定义、窗口注册与创建、窗口的移动、显示与更新,以及主消息循环体系(GetMessage和PeekMessage)的使用。作者通过代码示例展示了如何初始化窗口、注册窗口类、创建窗口,并处理消息循环。文章旨在帮助初

Love 6's Private Blog 1416

[读书笔记]《Windows游戏编程之从零开始》(零)

逐梦旅程:Windows游戏编程之从零开始 正如这本书的书名所提到的这是一本讲解Windows游戏开发的入门图书。同时应该也是我第一本完整看完的游戏开发的书籍。在这里我主要是,秉着把书读薄的观点,对书中的知识点进行总结,以便自己之后能快速回忆起来,同时还对书中我比较困惑的地方进行补充。 本书的构成 下面这段话是作者经过多年的摸索,总结出来的从零开始的学习路线。这个路线可以分为如下几个阶段: 第1...

xy_cpp的博客 1048

读书笔记】《Windows游戏编程之从零开始》(一)

Windows编程入门 HelloVisualStudio这个项目介绍了,Windows程序的“心脏”——WinMain函数,以及MessageBox函数的详细用法。 FirstBlood!这个项目介绍了,PlaySound函数,以及如何连接库文件。 GameCore这个项目详细介绍如何完整的创建一个窗口,后面两部分都会这个窗口框架。】 HelloVisualStudio 这个项目就是认识一下...

xy_cpp的博客 3759

windows 游戏编程大师 读书笔记

一、杂记 1、自动显示窗口的标识符:WS_VISIBLE。若无此标识符,则需用ShowWindow()手动显示所创的窗口。 2、UpdateWindow()产生一个WM_PAINT消息。 3、消息处理函数WinProc()中的参数hwnd只有当使用同一个窗口类创建的多个窗口时才起作用,此时,它表明消息来自哪个窗口。 4、WM_DESTROY在关闭窗口时产生,此消息并不终止应用程序,仅仅关闭...

weixin_30607029的博客 109

windows游戏编程大师技巧读书笔记(一)

第一部分、windows编程基础       1、一个windows窗体       #include LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);//声明一个回调函数 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevintace ,LPSTR lpCmdLine

Rocky 593

windows游戏编程大师技巧--读书笔记2

要使用PlaySound()播放一个WAVE声音资源,一般需要下面四个步骤:  1.创建.WAV文件并存储在磁盘上。  2.创建.RC资源脚本程序以及相关的头文件。  3.编译该资源和程序代码。  4.使用MAKEINTRESOURCE()宏,通过WAVE资源名或者是通过WAVE资源标识符在程序中设定一个PlaySound()的调用。  让我们看几个例子。首先是有两种声音的常规RC文件:一个是字符

orichisonic的专栏 1199

Windows游戏编程之旅(一)

描述:用代码勾勒出游戏开发所需的程序框架。 窗口创建四步曲之一:开始设计一个完整的窗口类

Windows游戏编程

作者: 罗林 出版社: 华南理工大学出版社 ISBN: 9787562352464 出版时间: 2017-07 版次: 1 装帧: 平装 开本: 32开 纸张: 铜版纸

windows游戏编程大师技巧--读书笔记1

图形环境就是描述视频系统和正在绘制表面的数据结构。奇妙的是,如果你需要绘制图形的话,只要获得一个指向图形环境的句柄即可。这便是关于WM_PAINT消息内容。  WM_DESTROY消息实际上非常有意思。WM_DESTROY在用户关闭窗口时被发送。当然仅仅是关闭窗口,而不是关闭应用程序。应用程序继续运行,但是没有窗口。对此要进行一些处理。大多数情况下,当用户关闭主要窗口时,也就意味着要关闭该应用程序

orichisonic的专栏 1078

windows图形编程读书笔记——第2章

基于win2k写的,又是一本古老的书,甚至书上好多例子使用的库已经改头换面了,调试也没法做了。不过,在市面上还真找不到其他深入讲述系统图形内部原理的书,真是鸡肋。书中内容很多,而且相对抽象,学习了差不多一个月,只学了几章,苦于很多东西没法调试——书上讲的和系统已经搭配不上了。现在只是把一些重点梳理一下,打下一点理论基础。       操作系统的图形和多媒体系统是分层的系统,最上面的应用程序通过W

行者无疆的专栏 1600

读书笔记编程之美 - 1.17 俄罗斯方块游戏

<br />很经典的经典游戏,也是我最喜欢的游戏之一。下一步学习Windows编程后,一定要自己实现一个。<br />具体到这一节,首先是一个游戏的实现问题,另外还有一个人工智能的问题。<br />第一个问题很多VC++游戏编程的书上都有实现,今后参考一下。<br />第二个问题会被应用在外挂上,在QQ游戏中就经常遇到这样的外挂。除了书中给出的策略,还有比较重要的就是在底层保持各种接口,有平的,有阶梯的,但最不好的就是锯齿形的,那样很容易搞出“洞”来。

山高月小 1083

读书笔记编程之美 - 1.14 连连看游戏设计

这几节开始了游戏程序设计,都是Windows编程。这部分没有学好,什么设备、资源、消息队列都不清楚。不过其实也没有什么技术含量,熟练工而已,涉及到算法更没啥意思了。书中给出的广度优先算法有点复杂了,其实只要考虑3种情况就可以了:直连、一个折点和两个折点的情况。直接搜索这几种情况就行,而不用像迷宫那用先搜索出路径再判断折点。

山高月小 1514

游戏编程中的人工智能技术读书笔记(1)

第1篇 Windows编程第1章 Windows概述1.1     历史一瞥(A Little Bit of History)1.1.1           Windows1.01.1.2           Windows2.01.1.3           Windows3.0和3.11.1.4           Windows951.1.5          

默然说话 2521
上一篇: 项目中加入Error Log日志
下一篇: 用粒子系统模拟烟花效果
chainyu
博客等级 码龄17年 406粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值