易码技术论坛

 找回密码
 加入易码
搜索
查看: 600511|回复: 14

[教程] [连载]游戏开发之旅(一点五)——轻松上手

[复制链接]
发表于 2006-10-23 17:21:19 | 显示全部楼层
抢了沙发再看
 楼主| 发表于 2006-10-23 17:23:08 | 显示全部楼层
你可以不用看……
发表于 2006-10-23 17:27:59 | 显示全部楼层
我还是看啦~这次讲GDI哦~
要不我把我用GDI做的迷宫也放上来~
发表于 2006-10-23 17:32:05 | 显示全部楼层
最实用的还是介绍下怎样绘制BMP图片把
发表于 2006-10-23 17:34:32 | 显示全部楼层
LS说的绘制BMP图片是什么意思哦~
在窗口上绘图都是用GDI,要不然就是DX或OpenGL等等。
LS说的是怎么保存图像到BMP么?
发表于 2006-10-23 18:56:47 | 显示全部楼层
占个位置先。。。。。。
发表于 2006-10-24 11:32:12 | 显示全部楼层
读取BMP在windows里很简单,直接就可以读成句柄 然后用bitblt就可以拷贝到设备上下文里去了
多数图片格式都可以使用其他人写好的库来进行操作  界面也很友善~在C++中引入新加的库以及添加相关的头文件就可以使用这些功能了

也可以将bmp图片保存在程序的resource里 但总的来说 这些图象在C++中已经变成了对象

PS:我不太会PC编程哦 说的不对请谅解
发表于 2006-10-24 12:30:39 | 显示全部楼层
bitblt支持透明色和图片的裁减么?
发表于 2006-10-24 12:54:59 | 显示全部楼层
我认为那些还是用DirectX处理比较快也比较方便
发表于 2006-10-24 12:58:58 | 显示全部楼层
DirectX貌似很麻烦
在VB环境下用那种比较好呢?
发表于 2006-10-24 13:28:52 | 显示全部楼层
VB的API里有大量绘图函数,但是不知道怎么用,谁能给我个详细教程
 楼主| 发表于 2006-10-24 13:45:45 | 显示全部楼层
引用第9楼laugj2006-10-24 12:54发表的“”:
我认为那些还是用DirectX处理比较快也比较方便

来个教程吧
发表于 2006-10-24 15:29:25 | 显示全部楼层
引用第8楼Cadina2006-10-24 12:30发表的“”:
bitblt支持透明色和图片的裁减么?

关于GDI的图象API:
ColorKey不支持,AlphaBlend不支持,但是在Win2k之后的Windows环境下可以控制整体的透明度。要想实现局部透明,可以用古老的Mask,即图象掩膜来实现。

图片的剪裁是什么意思?只Blt一部分图片么?那是可以的啊~~否则这个API太弱了。另外也有支持缩放剪裁的Blt。但是图片旋转不支持。

如果是DirectX的话,最简单是用DDraw,但是同样不支持AlphaBlend。旋转也不支持。ColorKey倒是支持的。同时,DDraw的Blt要比GDI的快一些。

如果用D3D,推荐使用D3DXSprite来绘制2D,上手比较容易,而且什么都支持。过几天我帖个教程-.-
发表于 2006-10-25 00:47:02 | 显示全部楼层
呵呵  我只是说说 我连GDI都基本不会用 何谈DirectDraw?
 楼主| 发表于 2006-10-23 16:51:49 | 显示全部楼层 |阅读模式
教程发出来,自己才发现起点设的稍稍有些高了,所以赶紧加了一篇上手介绍,配以简单的实例,给大家一个对我的那个框架的比较直观的认识。

大家只要把下面的代码覆盖掉原来的main.cpp中的代码就可以执行了

1.简单图形

下面列举了几个常见的画图函数
  1. #include "Window.h"
  2. #include "time.h"
  3. #include "Frame.h"
  4. void Main(HWND hWnd)
  5. {
  6.    //先获得一个dc,就当他是画布好了
  7.    HDC hDC=::GetDC(hWnd);
  8.    //1.画线,这个api比较奇怪,需要先moveto
  9.    ::MoveToEx(hDC,10,10,NULL);
  10.    ::LineTo(hDC,100,100);
  11.    //2.画方块
  12.    ::Rectangle(hDC,110,10,210,110);
  13.    //3.画椭圆,四个参数是外接四边形的四个顶点
  14.    ::Ellipse(hDC,320,10,420,110);
  15.    //4.实心方块
  16.    //先创建一个红色的刷子,RGB里面的三个参数是红,绿,蓝三种颜色的成分,255最大。
  17.    HBRUSH brush=::CreateSolidBrush(RGB(255,0,0));
  18.    //再创建一个RECT类型的变量
  19.    RECT rect;
  20.    rect.left =100;
  21.    rect.top=300;
  22.    rect.right=200;
  23.    rect.bottom =400;
  24.    //可以画了,第二个参数中的&表示把rect这个变量的地址传进去,第三个参数就是刚才那个刷子
  25.    ::FillRect(hDC,&rect,brush);
  26.    //删掉创建的brush
  27.    ::DeleteObject(brush);
  28.    //5.写字
  29.    ::TextOut(hDC,200,200,"Hello Windows!",14);
  30.    //6.实心圆,和实心方块不太相同,因为实心方块提供了FillRect函数,而圆则没有,还是要靠Ellipse函数
  31.    //先创建一个绿色的刷子,RGB里面的三个参数是红,绿,蓝三种颜色的成分,255最大。
  32.    HBRUSH brush2=::CreateSolidBrush(RGB(0,255,0));
  33.    //在把这个刷子设置成当前刷子
  34.    HGDIOBJ oldBrush=::SelectObject(hDC,brush2);
  35.    //画一个圆
  36.    ::Ellipse(hDC,100,400,200,500);
  37.    //再把原来的刷子恢复了
  38.    ::SelectObject(hDC,oldBrush);
  39.    //删掉创建的brush
  40.    ::DeleteObject(brush2);
  41.    //7.彩色的线
  42.    //先创建一个黄色的花笔,PS_SOLID表示实线,你可以试试PS_DASH,2表示线宽
  43.    HPEN pen=::CreatePen(PS_SOLID,2,RGB(0,0,255));
  44.    //把这个画笔设置成当前画笔
  45.    HGDIOBJ oldPen=::SelectObject(hDC,pen);
  46.    //画线
  47.    ::MoveToEx(hDC,200,400,NULL);
  48.    ::LineTo(hDC,300,500);
  49.    //恢复原来的画笔
  50.    SelectObject(hDC,oldPen);
  51.    //删掉创建的pen
  52.    ::DeleteObject(pen);
  53. }
  54. void Render(HWND hWnd)
  55. {
  56.       
  57. }
复制代码

2.小动画

并附有循环和判断语句的简介
  1. #include "Window.h"
  2. #include "time.h"
  3. #include "Frame.h"
  4. void Main(HWND hWnd)
  5. {
  6.    //先获得一个dc,就当他是画布好了
  7.    HDC hDC=::GetDC(hWnd);
  8.    //1.画个移动的方块
  9.    //创建一个使用背景色的画笔,GetBkColor可以获得当前画布(dc)的背景色;
  10.    HPEN bkPen=::CreatePen(PS_SOLID,1,::GetBkColor(hDC));
  11.    //这个是c/c++中的循环语句
  12.    //i是循环变量,这句表示i从0循环到30,循环要执行的内容用画括号括起来
  13.    //int是i的类型,一般这里就用int型的变量就可以了
  14.    //i=0表示一开始i的值为0
  15.    //i<30表示当i小于30的时候才继续循环,否则就跳出花括号继续
  16.    //i++表示每次执行完循环体(就是花括号里面的东西),i都要加一(++表示把自己加一)
  17.    for(int i=0;i<30;i++)
  18.    {
  19.       //先画一个方块
  20.       ::Rectangle(hDC,110+i*5,10,210+i*5,110);
  21.       //休息100毫秒,让大家能看一下
  22.       ::Sleep(100);
  23.       //选出来那个背景色的画笔
  24.       HGDIOBJ oldPen=::SelectObject(hDC,bkPen);
  25.       //用背景画一下,就擦掉了
  26.       ::Rectangle(hDC,110+i*5,10,210+i*5,110);
  27.       //恢复原来的笔
  28.       ::SelectObject(hDC,oldPen);
  29.    }      
  30.    //这里循环结束
  31.    
  32.    //删除创建的画笔
  33.    ::DeleteObject(bkPen);
  34.    
  35.    //2.来串花的
  36.    //循环画一串点,这里循环400次
  37.    for(int i=0;i<400;i++)
  38.    {
  39.       //i%10表示求i除以5的余数,==表示判断是否相等。 i % 5 == 0表示i除以5余0,就是i是5的倍数
  40.       //if()是c/c++的判断语句,这句表示,如果i是5的倍数,那么执行if下面那个花括号中的语句
  41.       //否则执行else下面花括号中的语句(当然,else和下面那个花括号是可以省略的,那么就继续执行)
  42.       if(i % 5 == 0)
  43.       {
  44.         //如果i是5的倍数,那么画个紫色的点(红加蓝=紫)
  45.         //这个是画点函数,最后可以带一个颜色
  46.         ::SetPixel(hDC,100+i*2,300,RGB(255,0,255));
  47.       }
  48.       else
  49.       {
  50.         //如果不是,那么画个绿色的点
  51.         ::SetPixel(hDC,100+i*2,300,RGB(0,255,0));
  52.       }
  53.    }
  54. }
  55. //这里定义的变量是全局变量,在定义的时候给他一个初始值为0。
  56. int j=0;
  57. void Render(HWND hWnd)
  58. {
  59.    //3.这里使用Render函数,这个函数在Main结束后不停的执行
  60.    //获得一个dc
  61.    HDC hDC=::GetDC(hWnd);
  62.    //画个椭圆,这次没有擦,所以会留在屏幕上
  63.    ::Ellipse(hDC,10+j*3,10,50+j*3,70);
  64.    //把j的值加一
  65.    j++;
  66.    //如果j的值大于300,那么执行花括号中的东西
  67.    if(j>300)
  68.    {
  69.       //把j重新变成0,注意这里是=,而判断是否相等用==
  70.       j=0;
  71.    }
  72.    //GetKey()是我写的一个函数,大家可以当api来用,表示检测按键,如果没有按键,则返回-1;
  73.    //如果有按键,则返回按键的值
  74.    //!=表示不等于,这句话表示先执行GetKey(),然后看他的返回值,如果这个值不等于-1,也就是说有按键,则执行花括号中内容
  75.    if(::GetKey() != -1)
  76.    {
  77.       //退出程序,这个也是我写的,注意大小写
  78.       ::Exit(hWnd);
  79.    }
  80.    //否则会继续执行
  81.       
  82. }
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-8-24 04:12 , Processed in 0.015881 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表