一、基本思路

1.追逐移动的实现与飞机追随鼠标光标原理类似;

2.现在小鸟作为追逐者,设定其贴图坐标为(nowX-25,nowY-16),其中(nowX,nowY)是飞机的贴图坐标;

3.通过判断小鸟贴图坐标的X坐标与nowX-25谁大谁小,来决定小鸟在飞机左边还是右边,从而决定贴哪张图;

二、效果

三、代码实现


#include "stdafx.h"
#include <stdio.h>HINSTANCE hInst;
HBITMAP bg,ship,bird;
HDC     hdc,mdc,bufdc;
HWND    hWnd;
DWORD   tPre,tNow;
int     x,y,nowX,nowY;
int     w=0;
POINT   p[3];ATOM               MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
void                MyPaint(HDC hdc);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{MSG msg;MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow)) {return FALSE;}while( msg.message!=WM_QUIT ){if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) ){TranslateMessage( &msg );DispatchMessage( &msg );}else{tNow = GetTickCount();if(tNow-tPre >= 40)MyPaint(hdc);}}return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;wcex.lpfnWndProc    = (WNDPROC)WndProc;wcex.cbClsExtra     = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = NULL;wcex.hCursor        = NULL;wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = NULL;wcex.lpszClassName  = "canvas";wcex.hIconSm      = NULL;return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{HBITMAP bmp;POINT pt,lt,rb;RECT    rect;hInst = hInstance;hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}MoveWindow(hWnd,100,100,640,480,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc);bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(mdc,bmp);bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,648,480,LR_LOADFROMFILE);ship = (HBITMAP)LoadImage(NULL,"ship.bmp",IMAGE_BITMAP,100,148,LR_LOADFROMFILE);bird = (HBITMAP)LoadImage(NULL,"bird.bmp",IMAGE_BITMAP,122,122,LR_LOADFROMFILE);x = 300;y = 300;nowX = 300;nowY = 300;pt.x = 300;pt.y = 300;ClientToScreen(hWnd,&pt);//窗口坐标转换成屏幕坐标SetCursorPos(pt.x,pt.y);//设置鼠标光标位置ShowCursor(false);//隐藏鼠标光标     GetClientRect(hWnd,&rect);//获取窗口区域内矩形lt.x = rect.left;lt.y = rect.top;rb.x = rect.right;rb.y = rect.bottom;//获取左上角和右下角的坐标ClientToScreen(hWnd,&lt);ClientToScreen(hWnd,&rb);rect.left = lt.x;rect.top = lt.y;rect.right = rb.x;rect.bottom = rb.y;ClipCursor(&rect);//限制鼠标光标的移动区域,该函数参数是相对屏幕坐标而言的//设置3只小鸟的贴图坐标p[0].x = 30;p[0].y = 100;p[1].x = 250;p[1].y = 250;p[2].x = 500;p[2].y = 400;MyPaint(hdc);return TRUE;
}void MyPaint(HDC hdc)
{int i;SelectObject(bufdc,bg);BitBlt(mdc,0,0,w,480,bufdc,640-w,0,SRCCOPY);BitBlt(mdc,w,0,640-w,480,bufdc,0,0,SRCCOPY);if(nowX < x){nowX += 10;if(nowX > x)nowX = x;}else{nowX -=10;if(nowX < x)nowX = x;}if(nowY < y){nowY += 10;if(nowY > y)nowY = y;}else{nowY -= 10;if(nowY < y)nowY = y;}SelectObject(bufdc,ship);BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND);BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT);SelectObject(bufdc,bird);for(i=0;i<3;i++){if(rand()%3 != 1)     {if(p[i].y > nowY-16)     p[i].y -= 5;elsep[i].y += 5;if(p[i].x > nowX-25)//鸟的贴图坐标为(nowX+25,nowY+16)p[i].x -= 5;elsep[i].x += 5;}if(p[i].x > nowX-25)    //飞机在小鸟的左边,贴方向向左的小鸟图片{BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,61,SRCAND);BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,61,SRCPAINT);}else{BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,0,SRCAND);//贴方向向右的小鸟图片BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,0,SRCPAINT);}}BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);tPre = GetTickCount();w += 10;if(w==640)w = 0;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_KEYDOWN:              if(wParam==VK_ESCAPE)     PostQuitMessage(0);break;case WM_MOUSEMOVE:x = LOWORD(lParam);         if(x > 530)x = 530;else if(x < 0)x = 0;y = HIWORD(lParam);         if(y > 380)y = 380;else if(y < 0)y = 0;break;case WM_DESTROY:               ClipCursor(NULL);           DeleteDC(mdc);DeleteDC(bufdc);DeleteObject(bg);DeleteObject(ship);DeleteObject(bird);ReleaseDC(hWnd,hdc);PostQuitMessage(0);break;default:                      return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

Visual C++游戏编程基础之追逐移动相关推荐

  1. Visual C++游戏编程基础之透明半透明效果

    一.基本思路 1.半透明的原理 一张位图由许多像素组成,而每一像素包含R.G.B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图    和背景图彼此对应的像素颜色按某一比例进行调配, ...

  2. Visual C++游戏编程基础之多背景循环动画

    一.基本思路 1.现在有三张背景图:天空和草地.山峦.房屋: 2.天空在最远处,其次是草地和山峦(因为山峦在草地上),最后是房屋: 3.背景的循环速度是天空最慢.然后是山峦.最后是草地和房屋: 4.恐 ...

  3. Visual C++游戏编程基础之摩擦力、加速度、重力

    一.基本思路 1.假设小球在空中只受到重力作用,一开始给它一个水平的速度,就像是平抛运动一样: 2.当小球碰到地面时,受到摩擦力作用,分为x方向和y方向: 3.在摩擦力作用下,1.减少水平方向的速度, ...

  4. Visual C++游戏编程基础之利用鼠标消息实现贴图

    一.鼠标键入消息 1.WM_LBUTTONDBLCLK       双击鼠标左键: 2.WM_LBUTTONDOWN         单击鼠标左键: 3.WM_LBUTTONUP            ...

  5. Visual C++游戏编程基础之景物贴图

    一.基本思路 1.首实现斜角贴图,需要显示菱形图块,使用矩形图块贴图,但是要将它的周围进行透明处理,只显示菱形部分 2.计算图块索引值的公式: 列编号 = 索引值 / 每一列的图块个数: 行编号 =  ...

  6. Visual C++游戏编程基础之键盘消息

    一.键盘 1.虚拟键码:Windows系统下所有的按键被视为虚拟键(包含鼠标在内),每一个虚拟键都有其对应的虚拟键码: 2.键盘消息 (1)VM_KEWDOWN:按下按键消息: (2)VM_KEYUP ...

  7. VC++游戏编程基础无法找到“d3d9.h”问题

    经反复查阅是缺少Direct X SDK导致的,我用的是VC++6.0,支持Direct X SDK 9.0b及之前的版本,最新版DX SDK(JUNE)VC6驾驭不了...下面是我解决问题的思路(只 ...

  8. 游戏编程基础(五)背景地图滚动显示

    在游戏过程中,背景地图需要跟着人物的移动而动态的滚动变换.C++游戏编程基础中介绍了2D游戏中常用的3种动态背景表现手法.其原理和实现技巧分析如下: 方法一:单一背景滚动         原理是:利用 ...

  9. 游戏编程基础之(一):实现物体在窗口上的往返运动

    近期在学习<C++游戏与图形编程基础>第2版  地址是:http://transbot.blog.163.com/blog/static/5421396120145108282739/ 里 ...

最新文章

  1. hbuildx打包成apk_HBuilder打包webapp为apk的方法
  2. SCI论文的时态、主动语句和被动语句总结
  3. OpenCASCADE:适用于 iOS 的 OCCT 示例
  4. createprocess重启程序_C++_VC程序设计中CreateProcess用法注意事项,对于windows程序设计来说,启动 - phpStudy...
  5. Rtsp之rtp包解析
  6. 象牙大钢琴II压缩版-Synthogy Ivory by JR Samples II Kontakt
  7. android 安装卸载应用提醒_Android监听应用程序安装和卸载
  8. VUE-waterfall瀑布流组件使用
  9. MySQL根据当前日期获取具体某一天或者某些天的数据
  10. 超级无敌小小迷你宝宝小可爱大仙女芊老婆~
  11. 『玩转Mybatis』Mybatis超强大的动态SQL大全
  12. 凝思系统服务器系统版本,凝思操作系统Custom Linx安装教程
  13. mysql 存储过程 总结_Mysql存储过程总结
  14. 微信域名防封技术,微信域名总是被屏蔽要怎么解决
  15. 各大有名库的介绍(转)
  16. You can‘t specify target table ‘Person‘ for update in FROM clause
  17. spring-xxx-xxx-0.0.1-SNAPSHOT.jar中没有主清单属性完美解决
  18. np.array与np.ndarray的区别
  19. python全栈需要学习什么_python全栈是什么意思
  20. 门店管理|火锅店数字化系统转型

热门文章

  1. spring mybatis 事务不生效
  2. 9月热钱流入环比加速 多为投机性资金
  3. 小米手机安装应用失败 解决办法
  4. django-simple-captcha验证码的验证问题
  5. CS+ FDL库函数相关
  6. 环境安全卫士实物搭建
  7. 3D软件教程:浩辰3D软件中如何进行个性化设置?
  8. redis/dubbo/poi/quartz笔记
  9. 如何写好数学建模论文
  10. PoS淘金热潮,全节点对于分布式网络到底意味着什么?