• [游戏模版21] Win32 物理引擎 能量守恒


    >_<:Only a little change in the function of MyPaint(...),besides the initial value have some changes.

    >_<: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 RECT rect;//窗口矩形
     18 int x[2] , y[2];//位置
     19 int vx[2] , vy[2];//速度
     20 int ax[2] , ay[2];//加速度
     21 int t=1 , num=0;//时间
     22 
     23 // 此代码模块中包含的函数的前向声明:
     24 ATOM                MyRegisterClass(HINSTANCE hInstance);
     25 BOOL                InitInstance(HINSTANCE, int);
     26 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
     27 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
     28 void                MyPaint(HDC hdc);
     29 
     30 
     31 int APIENTRY _tWinMain(HINSTANCE hInstance,
     32                      HINSTANCE hPrevInstance,
     33                      LPTSTR    lpCmdLine,
     34                      int       nCmdShow){
     35 
     36     MSG msg;
     37     MyRegisterClass(hInstance);
     38     // 执行应用程序初始化:
     39     if (!InitInstance (hInstance, nCmdShow)){
     40         return FALSE;
     41     }
     42     // 主消息循环:
     43     while (GetMessage(&msg, NULL, 0, 0)){
     44         TranslateMessage(&msg);
     45         DispatchMessage(&msg);
     46     }
     47     return (int) msg.wParam;
     48 }
     49 
     50 //  函数: MyRegisterClass()
     51 //
     52 //  目的: 注册窗口类。
     53 ATOM MyRegisterClass(HINSTANCE hInstance){
     54     WNDCLASSEX wcex;
     55 
     56     wcex.cbSize = sizeof(WNDCLASSEX);
     57 
     58     wcex.style            = CS_HREDRAW | CS_VREDRAW;
     59     wcex.lpfnWndProc    = WndProc;
     60     wcex.cbClsExtra        = 0;
     61     wcex.cbWndExtra        = 0;
     62     wcex.hInstance        = hInstance;
     63     wcex.hIcon            = NULL;
     64     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
     65     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
     66     wcex.lpszMenuName    = "Beautifulzzzz";
     67     wcex.lpszClassName    = "Beautifulzzzz";
     68     wcex.hIconSm        = NULL;
     69 
     70     return RegisterClassEx(&wcex);
     71 }
     72 
     73 //
     74 //   函数: InitInstance(HINSTANCE, int)
     75 //
     76 //   目的: 保存实例句柄并创建主窗口
     77 //
     78 //   注释:
     79 //
     80 //        在此函数中,我们在全局变量中保存实例句柄并
     81 //        创建和显示主程序窗口。
     82 //        棋盘拼接以及调用InitGame()开始棋局
     83 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
     84    HBITMAP bmp;
     85    hInst = hInstance; // 将实例句柄存储在全局变量中
     86 
     87    hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,
     88       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
     89 
     90    if (!hWnd)
     91    {
     92       return FALSE;
     93    }
     94 
     95    MoveWindow(hWnd,10,10,600,450,true);
     96    ShowWindow(hWnd, nCmdShow);
     97    UpdateWindow(hWnd);
     98 
     99    hdc=GetDC(hWnd);
    100    mdc=CreateCompatibleDC(hdc);
    101    bufdc=CreateCompatibleDC(hdc);
    102 
    103    bmp=CreateCompatibleBitmap(hdc,600,480);
    104    SelectObject(mdc,bmp);
    105 
    106    bg=(HBITMAP)LoadImageA(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
    107    ball[0]=(HBITMAP)LoadImageA(NULL,"ball0.bmp",IMAGE_BITMAP,52,26,LR_LOADFROMFILE);
    108    ball[1]=(HBITMAP)LoadImageA(NULL,"ball1.bmp",IMAGE_BITMAP,52,26,LR_LOADFROMFILE);
    109 
    110    GetClientRect(hWnd,&rect);//取得内部窗口区域的大小;
    111 
    112    x[0]=0;y[0]=100;vx[0]=5;vy[0]=0;ax[0]=0;ay[0]=1;
    113 
    114    SetTimer(hWnd,1,10,NULL);
    115    MyPaint(hdc);
    116 
    117    return TRUE;
    118 }
    119 
    120 //
    121 //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
    122 //
    123 //  目的: 处理主窗口的消息。
    124 //
    125 //  WM_COMMAND    - 处理应用程序菜单
    126 //  WM_PAINT    - 绘制主窗口
    127 //  WM_DESTROY    - 发送退出消息并返回
    128 //
    129 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    130     int wmId, wmEvent;
    131     PAINTSTRUCT ps;
    132 
    133     switch (message){
    134     case WM_TIMER:
    135         A:MyPaint(hdc);
    136         break;
    137     case WM_PAINT:
    138         hdc = BeginPaint(hWnd, &ps);
    139         goto A;// TODO: 在此添加任意绘图代码...
    140         EndPaint(hWnd, &ps);
    141         break;
    142     case WM_DESTROY:
    143         DeleteDC(mdc);
    144         DeleteDC(bufdc);
    145         DeleteObject(bg);
    146         DeleteObject(ball[0]);
    147         DeleteObject(ball[1]);
    148 
    149         KillTimer(hWnd,1);
    150         ReleaseDC(hWnd,hdc);
    151 
    152         PostQuitMessage(0);
    153         break;
    154     default:
    155         return DefWindowProc(hWnd, message, wParam, lParam);
    156     }
    157     return 0;
    158 }
    159 
    160 //MyPaint()
    161 //1、窗口贴图
    162 //2、计算小球贴图坐标并判断小球是否碰撞窗口边缘
    163 void MyPaint(HDC hdc){
    164     SelectObject(bufdc,bg);
    165     BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);
    166 
    167     SelectObject(bufdc,ball[0]);
    168     BitBlt(mdc,x[0],y[0],26,26,bufdc,26,0,SRCAND);
    169     BitBlt(mdc,x[0],y[0],26,26,bufdc,0,0,SRCPAINT);
    170 
    171     BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
    172 
    173     for(int i=0;i<1;i++){
    174         //计算x轴方向坐标及速度
    175         vx[i]+=ax[i];
    176         x[i]+=vx[i];
    177 
    178         if(x[i]<=0){
    179             x[i]=0;
    180             vx[i]=-vx[i];
    181         }else if(x[i]>=rect.right-26){
    182             x[i]=rect.right-26;
    183             vx[i]=-vx[i];
    184         }
    185         //计算y轴方向坐标及速度
    186         vy[i]+=ay[i];
    187         y[i]+=vy[i];
    188 
    189         if(y[i]<=0){
    190             y[i]=0;
    191             vy[i]=-vy[i]-1;
    192         }else if(y[i]>=rect.bottom-26){
    193             y[i]=rect.bottom-26;
    194             vy[i]=-vy[i]-1;
    195         }
    196     }
    197 }
  • 相关阅读:
    thinkphp5自定义sql排序
    php版雪花算法生产唯一ID 分库分表专用
    java和php保持一致的md5加密
    rabbitmq新版本使用
    pentaho-kettle+eclipse 搭建本地源码
    《我们好像在哪见过》
    《邂逅》-----徐志摩
    Oracle数据库查询和取出表中重复记录
    Kettle提取数据,数据库中文字符乱码问题
    kettle报错收集- java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@160750a6 is still active
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3735185.html
Copyright © 2020-2023  润新知