zoukankan      html  css  js  c++  java
  • [游戏模版19] Win32 物理引擎 匀速运动

    >_<:Learning the physical engine

    >_<:resource

    >_<:code

      1 #include <windows.h>
      2 // C 运行时头文件
      3 #include <stdlib.h>
      4 #include <cstdio>
      5 #include <malloc.h>
      6 #include <memory.h>
      7 #include <tchar.h>
      8 #include <time.h>
      9 #include <string>
     10 #include <cmath>
     11 
     12 // 全局变量:
     13 HINSTANCE hInst;                                // 当前实例
     14 HBITMAP bg , ball[2];
     15 HDC hdc,mdc,bufdc;
     16 HWND hWnd;
     17 DWORD tPre,tNow,tCheck;
     18 RECT rect;//窗口矩形
     19 int x[2];
     20 int y[2];
     21 int vx[2];
     22 int vy[2];
     23 
     24 // 此代码模块中包含的函数的前向声明:
     25 ATOM                MyRegisterClass(HINSTANCE hInstance);
     26 BOOL                InitInstance(HINSTANCE, int);
     27 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
     28 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
     29 void                MyPaint(HDC hdc);
     30 
     31 
     32 int APIENTRY _tWinMain(HINSTANCE hInstance,
     33                      HINSTANCE hPrevInstance,
     34                      LPTSTR    lpCmdLine,
     35                      int       nCmdShow){
     36 
     37     MSG msg;
     38     MyRegisterClass(hInstance);
     39     // 执行应用程序初始化:
     40     if (!InitInstance (hInstance, nCmdShow)){
     41         return FALSE;
     42     }
     43     // 主消息循环:
     44     while (GetMessage(&msg, NULL, 0, 0)){
     45         TranslateMessage(&msg);
     46         DispatchMessage(&msg);
     47     }
     48     return (int) msg.wParam;
     49 }
     50 
     51 //  函数: MyRegisterClass()
     52 //
     53 //  目的: 注册窗口类。
     54 ATOM MyRegisterClass(HINSTANCE hInstance){
     55     WNDCLASSEX wcex;
     56 
     57     wcex.cbSize = sizeof(WNDCLASSEX);
     58 
     59     wcex.style            = CS_HREDRAW | CS_VREDRAW;
     60     wcex.lpfnWndProc    = WndProc;
     61     wcex.cbClsExtra        = 0;
     62     wcex.cbWndExtra        = 0;
     63     wcex.hInstance        = hInstance;
     64     wcex.hIcon            = NULL;
     65     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
     66     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
     67     wcex.lpszMenuName    = "Beautifulzzzz";
     68     wcex.lpszClassName    = "Beautifulzzzz";
     69     wcex.hIconSm        = NULL;
     70 
     71     return RegisterClassEx(&wcex);
     72 }
     73 
     74 //
     75 //   函数: InitInstance(HINSTANCE, int)
     76 //
     77 //   目的: 保存实例句柄并创建主窗口
     78 //
     79 //   注释:
     80 //
     81 //        在此函数中,我们在全局变量中保存实例句柄并
     82 //        创建和显示主程序窗口。
     83 //        棋盘拼接以及调用InitGame()开始棋局
     84 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
     85    HBITMAP bmp;
     86    hInst = hInstance; // 将实例句柄存储在全局变量中
     87 
     88    hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,
     89       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
     90 
     91    if (!hWnd)
     92    {
     93       return FALSE;
     94    }
     95 
     96    MoveWindow(hWnd,10,10,600,450,true);
     97    ShowWindow(hWnd, nCmdShow);
     98    UpdateWindow(hWnd);
     99 
    100    hdc=GetDC(hWnd);
    101    mdc=CreateCompatibleDC(hdc);
    102    bufdc=CreateCompatibleDC(hdc);
    103 
    104    bmp=CreateCompatibleBitmap(hdc,600,480);
    105    SelectObject(mdc,bmp);
    106 
    107    bg=(HBITMAP)LoadImageA(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
    108    ball[0]=(HBITMAP)LoadImageA(NULL,"ball0.bmp",IMAGE_BITMAP,52,26,LR_LOADFROMFILE);
    109    ball[1]=(HBITMAP)LoadImageA(NULL,"ball1.bmp",IMAGE_BITMAP,52,26,LR_LOADFROMFILE);
    110 
    111    GetClientRect(hWnd,&rect);//取得内部窗口区域的大小;
    112 
    113    x[0]=50;y[0]=50;vx[0]=4;vy[0]=4;
    114    x[1]=380;y[1]=380;vx[1]=-4;vy[1]=-4;
    115 
    116    SetTimer(hWnd,1,10,NULL);
    117    MyPaint(hdc);
    118 
    119    return TRUE;
    120 }
    121 
    122 //
    123 //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
    124 //
    125 //  目的: 处理主窗口的消息。
    126 //
    127 //  WM_COMMAND    - 处理应用程序菜单
    128 //  WM_PAINT    - 绘制主窗口
    129 //  WM_DESTROY    - 发送退出消息并返回
    130 //
    131 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    132     int wmId, wmEvent;
    133     PAINTSTRUCT ps;
    134 
    135     switch (message){
    136     case WM_TIMER:
    137         A:MyPaint(hdc);
    138         break;
    139     case WM_PAINT:
    140         hdc = BeginPaint(hWnd, &ps);
    141         goto A;// TODO: 在此添加任意绘图代码...
    142         EndPaint(hWnd, &ps);
    143         break;
    144     case WM_DESTROY:
    145         DeleteDC(mdc);
    146         DeleteDC(bufdc);
    147         DeleteObject(bg);
    148         DeleteObject(ball[0]);
    149         DeleteObject(ball[1]);
    150 
    151         KillTimer(hWnd,1);
    152         ReleaseDC(hWnd,hdc);
    153 
    154         PostQuitMessage(0);
    155         break;
    156     default:
    157         return DefWindowProc(hWnd, message, wParam, lParam);
    158     }
    159     return 0;
    160 }
    161 
    162 //MyPaint()
    163 //1、窗口贴图
    164 //2、计算小球贴图坐标并判断小球是否碰撞窗口边缘
    165 void MyPaint(HDC hdc){
    166     SelectObject(bufdc,bg);
    167     BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);
    168 
    169     SelectObject(bufdc,ball[0]);
    170     BitBlt(mdc,x[0],y[0],26,26,bufdc,26,0,SRCAND);
    171     BitBlt(mdc,x[0],y[0],26,26,bufdc,0,0,SRCPAINT);
    172 
    173     SelectObject(bufdc,ball[1]);
    174     BitBlt(mdc,x[1],y[1],26,26,bufdc,26,0,SRCAND);
    175     BitBlt(mdc,x[1],y[1],26,26,bufdc,0,0,SRCPAINT);
    176 
    177     BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
    178 
    179     for(int i=0;i<2;i++){
    180     //计算x轴方向贴图坐标与速度
    181         x[i]+=vx[i];
    182         if(x[i]<=0){
    183             x[i]=0;
    184             vx[i]=-vx[i];
    185         }else if(x[i]>=rect.right-26){
    186             x[i]=rect.right-26;
    187             vx[i]=-vx[i];
    188         }
    189 
    190         //计算y轴方向坐标及速度
    191         y[i]+=vy[i];
    192         if(y[i]<=0){
    193             y[i]=0;
    194             vy[i]=-vy[i];
    195         }else if(y[i]>=rect.bottom-26){
    196             y[i]=rect.bottom-26;
    197             vy[i]=-vy[i];
    198         }
    199     }
    200 
    201     if((x[0]-x[1])*(x[0]-x[1])+(y[0]-y[1])*(y[0]-y[1])<=1000){
    202         vx[0]=-vx[0];vy[0]=-vy[0];
    203         vx[1]=-vx[1];vy[1]=-vy[1];
    204     }
    205 }
  • 相关阅读:
    Nilearn教程系列(2)-3D和4D niimgs:处理和可视化
    Python-EEG工具库MNE中文教程(9)-参考电极应用
    EEMD算法原理与python实现
    Python-EEG工具库MNE中文教程(8)-参考电极简介
    联想笔记本 thinkpad BIOS 超级密码 Supervisor Password 清除 破解 亲测有效 转载地址https://blog.csdn.net/ot512csdn/article/details/72571674
    C Primer Plus 学习 第四章
    C Primer Plus 学习 第三章
    六 BASH 高级变量
    五 shell 变量与字符串操作
    四 shell基本命令
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3735163.html
Copyright © 2011-2022 走看看