学习七十一雾央MFC游戏心得,初体验(四)



看了七十一雾央的博客后深有感触,决定学习一下,跟着操作,写下自己的心得。

初体验。

2015/06/14/

///by xbw

编译器 visual studio 2013 MFC应用程序


贴图美化

先说一个要点,想了一下才发现,为什么要用相对路径(什么是相对路径参考本人其他文章),做好的工程最终是要发布给别人的,如果用绝对路径,

如: F:\\images\\me.png。这样会很蛋疼,程序在别人电脑运行,就会显示文件丢失,这个图片根本找不到,这样的话,相对路径就可以了。

把要添加的图片在工程文件中的工程子文件新建一个例如images文件夹,把图片拖入,只需m_hero.Load(_T("images\\me12.png"));这样,ok了;


接下来,重点来了。

//先说说雾央老师的方法吧;

不管哪种方法,都要在CChildView.h文件中加入变量定义,public中加入 CImage   m_hero;

这里呢,雾央老师为我们封装了一个函数,

void TransparentPNG(CImage *png)
{
	for (int i = 0; i <png->GetWidth(); i++)
	{
		for (int j = 0; j <png->GetHeight(); j++)
		{
			unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i, j));
			pucColor[0] = pucColor[0] * pucColor[3] / 255;
			pucColor[1] = pucColor[1] * pucColor[3] / 255;
			pucColor[2] = pucColor[2] * pucColor[3] / 255;
		}
	}
}

将此段代码放在CChileView.cpp文件中。我们找到 void CChildView::OnPaint()

加入 代码

	m_hero.Load(_T("images\\me12.png"));
	//m_hero.SetTransparentColor(RGB(0, 0, 255));
	
	TransparentPNG(&m_hero);
	m_hero.Draw(*cDC, 200, 300, 60, 60);

这里我要说一下,雾央老师这个局限性比较大,首先,你需要用Photoshop 把图片的背景扣掉,这样才可以,加入图片为蓝色,他的十进制RGB为(0,0,255),这就比较蛋疼,雾央老师封装的函数我们可以看到都除以255了,很明显这是白色, 如果是蓝色,就要除以0;这样显然会出错的;

还有个地方,之前没运行对,就是代码顺序问题,对于初学者何难将代码插对,要先透明处理,然后再绘图,上边的代码顺序就对了;;;;;

/接下来说个简单的方法,个人觉得比较实用,真心方便,不需要ps,只需要一个//拾色器工具

其他不变,我用的是蓝色背景的图片,这次我不需要ps抠图了,用拾色器知道蓝色RGB(0,0,255),上代码

	m_hero.Load(_T("images\\me.png"));
	m_hero.SetTransparentColor(RGB(0, 0, 255));
	
	//TransparentPNG(&m_hero);
	m_hero.Draw(*cDC, 200, 300, 60, 60);

这样就好了,是不是很开心,就这么简单;


上完整代码片段

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	CDC *cDC = this->GetDC();   //获得当前窗口的DC   
	GetClientRect(&m_client);   //获得窗口的尺寸
	//加入我们要绘制的代码。。。。。。
	m_bgcDC.CreateCompatibleDC(NULL);
	m_bgBitmap.LoadBitmap(IDB_BITMAP1);
	m_bgcDC.SelectObject(&m_bgBitmap);
	cDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_bgcDC, 0, 0, SRCCOPY);
	m_hero.Load(_T("images\\me.png"));
	m_hero.SetTransparentColor(RGB(0, 0, 255));
	//TransparentPNG(&m_hero);
	m_hero.Draw(*cDC, 200, 300, 60, 60);
	ReleaseDC(cDC); //释放DC   
	// TODO:  在此处添加消息处理程序代码
	
	// 不要为绘制消息而调用 CWnd::OnPaint()
}

本节结束,开心吧。。。。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值