| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4229 人关注过本帖, 2 人收藏
标题:求助!!!
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
http://www.

授人以渔,不授人以鱼。
2012-05-15 23:49
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
说下 我现在的思路 大家帮看下

定义一个棋子位图句柄数组 HBITMAP hBmpChessman[25] // 对应8 - 14 16 - 22 下标对应14个不同的棋子位图
初始化一个棋盘数组  static const BYTE ChessBoard[256]; 对应棋盘 更确切的说要比棋盘范围更大 因为棋盘是 9 * 10的 只有90格 256对应BYTE类型。 0 - 255 每个数组元素都赋值 为0表示这个棋格没棋子 大于 0表示有棋子 而这个大于0的值对应于相应的 棋子位图句柄的下标。这样位图与棋格就产生了联系

OnLButtonDown里获取鼠标的坐标 POINT ptMouse;  rect是棋盘内框矩形 棋格宽为SW
( ptMouse.x - rect.left ) / SW = x
( ptMouse.y - rect.top) / SW  = y  <x, y>在经过一系列转换成棋盘数组的下标值 i
 
hBmpChessman[ChessBoard[i]]就是需要的那个棋子。

不知道怎么样。

梅尚程荀
马谭杨奚







                                                       
2012-05-16 00:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 51楼 TonyDeng
谢谢老大给的图片网址 很不错 我当初搜了N久没找到 就去PS了好半天啊

梅尚程荀
马谭杨奚







                                                       
2012-05-16 00:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你弄好素材再说吧,做GUI,没有素材,什么都假。我上次跟你说的,看起来你一直没领会,现在才叫摸点边,但还是不清晰。

授人以渔,不授人以鱼。
2012-05-16 00:25
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 54楼 TonyDeng
这样,你所要做的,就是设计一个Image Control,它是一个60*60像素的方框,属性有诸如Top、Left、Width、Height(棋格位置和尺寸)、BackImageUrl(棋格背景图)、ChessPieces(棋子代码用于提取棋子)、Actived等等一切需要用到的东西,想到什么就加什么。用这个类创建Grid[10,9]共90个实例,初始化成一张棋盘。注意这时棋格的位置是非常有规律的,鼠标活动事件函数极容易知道自己落在哪个格子上,一落下去,就可以设置对应格子的Grid[i,j].Actived = True。处理的过程,就由鼠标移动事件来控制,只要鼠标所在的棋格有棋子,有可以被提起、改变棋子,这个棋格自己改变棋子的图案,用自己的位置尺寸来显示,根本不用管它实际上是棋盘上的哪一个格子,也不需要知道自己的尺寸到底有多大,只要显示棋子的函数把读入的图像BitMap缩放到属性标注的Width*Height就可以了。

你说的这个 思维有高度 就是将以整块棋盘(带边框的部分)切割成90份 做成90个Grid实例 也就是说有些格子的背景是有差别的 也就是说我不光要找棋子的位图素材还要找棋盘分割后的小块素材?比如这个
图片附件: 游客没有浏览图片的权限,请 登录注册
如果用一整块棋盘做背景 那么当以后棋子的大小改变时 棋盘就无法配合了吧 是不是这样啊

[ 本帖最后由 有容就大 于 2012-5-16 00:44 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-16 00:40
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
哇卡卡 衣击玛兹!!!
哈哈哈哈

[ 本帖最后由 有容就大 于 2012-5-16 01:04 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-16 00:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
棋盘当然也要素材,可以用现成的棋盘图案裁切,也可以自己画(大多数格子是相同的,只有个别特殊的),提炼出来,很有限的几个图案而已。如果将就的做法,用整张棋盘做底图,很多东西会被这个尺寸局限住,到时想做窗口缩放,就不那么容易了。万一将来要做点什么特效,你就知道这种设计的好处。总之,从对象的角度来思考,分析象棋这个具体的对象需要具备什么属性、方法,而不是从技术出发。需要什么,就做什么,不是懂什么做什么。

做这个程序,关键的地方是找到类似JavaScript中onmousemove和onmouseout那样的事件消息机制。有了这个,格子就能知道鼠标进入和离开、按键等动作,一切都归结在这个格子对象中处理。至于你担忧的“挂钩”,完全是没有问题的,到时一点你就明白。

注意:这个项目,起码用C++的class做,不管你用Win32 API也好,MFC也罢,都要用class。类和对象的概念,不是MFC专有的。只要你一做好这个,将来会发现用任何语言写同样的程序,其实都是一样的原理,不过你现在选用了最复杂、繁琐的语言来做而已。

授人以渔,不授人以鱼。
2012-05-16 01:01
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 57楼 TonyDeng
哈哈 C++下了三本书 都是翻了个大概 没有实际的程序经验 c我还写过个粗糙的学生成绩系统。
我想用struct 来代替可以吗?

梅尚程荀
马谭杨奚







                                                       
2012-05-16 01:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不单是缩放,你还可能想到要在棋子移动的地方留下点什么痕迹,标识棋子从哪里到哪里,或者做走棋提示,马的跳跃范围,都要对格子操作,整张棋盘是做不了的。

授人以渔,不授人以鱼。
2012-05-16 01:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不用struct也可以,但思想仍然是一样的。用struct传递函数指针,不过是比class多一个参数。随着系统的复杂度增加,参数会越来越多,你看到API函数那些参数就知道了,至少要带个句柄,用class写,起码不用敲那么多字符,代码也好管理得多。

编程,说到底就是管理,把代码管理好。

授人以渔,不授人以鱼。
2012-05-16 01:12
快速回复:求助!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027639 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved