• Win32Api游戏编程记录


    Win32Api游戏编程记录

    1.播放声音

    PlaySound(L"FirstBlood.wav", NULL, SND_FILENAME | SND_ASYNC |SND_LOOP);//循环播放背景音乐
    

    2.获取设备环境句柄HDC

    1.一般在WM_PAINT消息循环中使用。
    HDC BeginPaint(HWND,LPPAINTSTRUCT)
    bool EndPaint(HWND,LPPAINTSTRUCT)
    
    2.常用
    HDC GetDC(HWND) //获取设置环境句柄
    int ReleaseDC(HWND,HDC) //释放环境句柄
    

    3.GDI基本几何绘图

    1.画笔
    HPEN = CreatePen(int penStyle,int width,COLORREF color);
    COLORREF RGB(byte red,byte green,byte blue);
    
    2.画刷
    HBRUSH = CreateSolibBrush(COLORREF color) //创建实心画刷
    HBRUSH = CreateHatchBrush(int style,COLORREF color) //创建阴影画刷
    
    3.选择图形对象

    图形对象包括画刷/画笔之类的

    HGDIOBJ SelectObject(HDC,HGDIOBJ) //返回之前的图形对象,并设置现在的图形对象  
    bool DeleteObject(HGDIOBJ) //删除画刷对象
    
    4.绘制线条
    bool LineTo(HDC,x,y) //从当前坐标画线到终点坐标(x,y)
    bool MoveToEx(HDC,x,y,LPPOINT) //从当前坐标移动到(x,y),保存之前坐标
    
    5.随机数
    srand((unsigned)time(NULL)) //初始化随机数种子
    srand(timeGetTime()) 
    
    x = random(100) 0-99的随机数
    
    6.文字输出函数TextOut
    bool TextOut(HDC,int xStart,int yStart,char*,int len)
    
    int DrawText(HDC,char*,len,LPRECT,UINT format)//以矩形区域输出文字
    

    format常用标识

    image-20220413194303297

    7.设置文字颜色
    COLORREF SetTextColor(HDC,COLORREF) //设置以后,再输出文字就是这个颜色了
    
    8.设置文字背景透明
    int SetBkMode(HDC,int mode) 
    mode:OPAQUE 用背景画刷的颜色输出到文字的背景
    mode:TRANSPARENT 透明背景
    
    9.创建字体

    image-20220413194224358

    10.文字显示功能API

    image-20220413194353796

    image-20220413194431025

    4.位图绘制

    1.加载位图
    HANDLE LoadImage(HINSTANCE,char* picName,UINT type,int xWidth,int yHeight,UINT loadtype)
    

    image-20220413201645373

    loadType:LR_LOADFROMFILE 从文件加载图像

    2.建立兼容DC
    HDC CreateCompatibleDC(HDC) //参数为与之兼容目的DC的句柄
    
    bool DeleteDC(HDC) //撤销指定的设备环境
    
    3.选用位图对象
    HGDIOBJ SelectObject(HDC,HGDIOBJ)
    
    4.贴图

    image-20220413202322472

    6.透明贴图

    1.透明遮罩法
    SelectObject(g_mdc,g_hBackGround);
    	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);    //采用BitBlt函数在g_hdc中先贴上背景图
    
    	//用透明遮罩法绘制出第一个人物
    	SelectObject(g_mdc,g_hCharacter1);
    	BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,320,0,SRCAND);//透明遮罩法第一步,即将屏蔽图与背景图做"AND"运算 
    	BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,0,0,SRCPAINT);//透明遮罩法第二步,即将前景图与背景图做"OR"运算
    
    2.透明色彩法

    image-20220413204551514

    image-20220413204601322

    //先贴上背景图
    	SelectObject(g_mdc,g_hBackGround);
    	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);    //采用BitBlt函数在g_hdc中先贴上背景图
    
    	//贴第一张人物图
    	SelectObject(g_mdc,g_hCharacter1);
    	TransparentBlt(g_hdc,0,WINDOW_HEIGHT-650,535,650,g_mdc,0,0,535,650,RGB(0,0,0));//透明色为RGB(0,0,0)
    

    7.定时器

    1.创建定时器

    image-20220413205447908

    2.响应。

    指定回调函数,或者在窗口的消息处理函数中处理WM_TIMER消息

    3.删除定时器
    bool WINAPI KillTimer(HWND,int timerID) //删除指定ID的定时器
    
    4.获取程序运行时间
    DWORD WINAPI GetTickcount(void) //返回运行了多少毫秒
    
    5.游戏循环
    MSG msg = { 0 };				//定义并初始化msg
    	while( msg.message != WM_QUIT )		//使用while循环,如果消息不是WM_QUIT消息,就继续循环
    	{
    		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
    		{
    			TranslateMessage( &msg );		//将虚拟键消息转换为字符消息
    			DispatchMessage( &msg );			//分发一个消息给窗口程序。
    		}
    		else
    		{
    			g_tNow = GetTickCount();   //获取当前系统时间
    			if(g_tNow-g_tPre >= 100)        //当此次循环运行与上次绘图时间相差0.1秒时再进行重绘操作
    				Game_Paint(hwnd);
    		}
    
    	}
    

    本来是想总结一下,有时间也写个小游戏的,不过也没时间一直弄这个,只能说是未完待续吧。

  • 相关阅读:
    泛型与非泛型
    C# 调用CMD,执行DOS命令
    数据库设计随笔(ZZ)
    关于三层开发(zz)
    三层架构学习(转)
    Node.js & child_process All In One
    HTML5 Canvas Tag Cloud All In One
    macOS & VSCode terminal show current git branch All In One
    飞书 excel 固定列 All In One
    git diff one of committed file All In One
  • 原文地址:https://www.cnblogs.com/dayq/p/16322366.html
Copyright © 2020-2023  润新知