AEGLOVE AEGLOVE
人生之路,简单却不容易!
关注数: 20 粉丝数: 130 发帖数: 857 关注贴吧数: 84
【转】数学和编程   好些人来信问我,要成为一个好的程序员,数学基础要达到什么样的程度?十八年前,当我成为大学计算机系新生的时候,也为同样的问题所困扰。面对学数学,物理等学科的同学,我感到自卑。经常有人说那些专业的知识更加精华一些,难度更高一些,那些专业的人毕业之后如果做编程工作,水平其实比计算机系毕业的还要高。直到几年前深入研究程序语言之后,对这个问题我才得到了答案和解脱。由于好多编程新手遇到同样的困扰,所以我想在这里把这个问题详细的阐述一下。   数学并不是计算机科学的基础   很多人都错误的认为,计算机科学是数学的一个分支,数学是计算机科学的基础,数学是更加博大精深的科学。这些人以为只要学会了数学,编程的事情全都不在话下,然而事实却并非如此。   事实其实是这样的: 计算机科学其实根本不是数学,它只不过借用了非常少、非常基础的数学,比高中数学还要容易一点。所谓“高等数学”,在计算机科学里面基本用不上。 计算机是比数学更加基础的工具,就像纸和笔一样。计算机可以用来解决数学的问题,也可以用来解决不是数学的问题,比如工程的问题,艺术的问题,经济的问题,社会的问题等等。 计算机科学是完全独立的学科。学习了数学和物理,并不能代替对计算机科学的学习。你必须针对计算机科学进行学习,才有可能成为好的程序员。 数学家所用的语言,比起常见的程序语言(比如C++,Java)来说,其实是非常落后而糟糕的设计。所谓“数学的美感”,其实大部分是夜郎自大。 99%的数学家都写不出像样的代码。   数学是异常糟糕的语言   这并不是危言耸听。如果你深入研究过程序语言的理论,就会发现其实数学家们使用的那些符号,只不过是一种非常糟糕的程序语言。数学的理论有些是有用的,然而数学家门用于描述这些理论所用的语言,却是纷繁复杂,缺乏一致性,可组合性(composability),简单性,可用性。这也就是为什么大部分人看到数学就头痛。这不是他们不够聪明,而是数学语言的“设计”有问题。人们学习数学的时候,其实只有少部分时间在思考它的精髓,而大部分时间是在折腾它的语法。   举一个非常简单的例子。如果你说x-1表示x的-1次方(x的倒数),那么f-1表示什么?f的-1次方,f的倒数?别被数学老师们的教条和借口欺骗啦,他们总是告诉你:“你应该记住这些!” 可是你想过吗:“凭什么!” x-1表示x的-1次方,而f-1,明明是一模一样的形式,表示的却是函数f的反函数。一个是求幂,一个是反函数,风马不及,却写成一个样子。这样的语言设计混淆不堪,却喜欢以“约定俗成”作为借口。   如果你再多看一些数学书,就会发现这只是数学语言几百年累积下来的糟粕的冰山一角。数学书里尽是各种上标下标,带括号的上标下标,x,y,z,a,b,c,f,g,h,各种扭来扭去的希腊字母,希伯来字母…… 斜体,黑体,花体,双影体,……用不同的字体来表示不同的“类型”。很多符号的含义,在不同的子领域里面都不一样。有些人上一门数学课,到最后还没明白那些符号是什么意思。   很多人学习微积分都觉得困难,其实问题不在他们,而在于莱布尼兹(Leibniz)。莱布尼兹设计来描述微积分的语言(∫,dx, dy, ...),从现代语言设计的角度来看,其实非常之糟糕,可以说是一塌糊涂。我不能怪莱布尼兹,他毕竟是几百年前的人了,他不知道我们现在知道的很多东西。然而古人的设计,现在还不考虑改进,反而当成教条灌输给学生,那就是不思进取了。   数学的语言不像程序语言,它的历史太久,没有经过系统的,考虑周全的,统一的设计。各种数学符号的出现,往往是历史上某个数学家有天在黑板上随手画出一些古怪的符号,说这代表什么,那代表什么,…… 然后就定下来了。很多数学家只关心自己那块狭窄的子领域,为自己的理论随便设计出一套符号,完全不管这些是否跟其它子领域的符号相冲突。这就是为什么不同的数学子领域里写出同样的符号,却可以表示完全不同的涵义。在这种意义上,数学的语言跟Perl(一种非常糟糕的程序语言)有些类似。Perl把各种人需要的各种功能,不加选择地加进了语言里面,造成语言繁复不堪,甚至连Perl的创造者自己都不能理解它所有的功能。   数学的证明,使用的其实也是极其不严格的语言——古怪的符号,加上含糊不清,容易误解的人类语言。如果你知道什么是 Curry-Howard Correspondence 就会明白,其实每一个数学证明都不过是一段代码。同样的定理,可以有许多不同版本的证明(代码)。这些证明有的简短优雅,有的却冗长繁复,像面条一样绕来绕去,没法看懂。你经常在数学证明里面看到“未定义的变量”,证明的逻辑也包含着各种隐含知识,思维跳跃,非常难以理解。很多数学证明,从程序的观点来看,连编译都不会通过,就别提运行了。   数学家们往往不在乎证明的优雅性。他们认为只要能证明出定理,你管我的证明简不简单,容不容易看懂呢。你越是看不懂,就越是觉得我高深莫测!这种思潮到了编程的时候就显出弊端了。数学家写代码,往往忽视代码的优雅性,简单性,模块化,可读性,性能,数据结构等重要因素,认为代码只要能算出结果就行。他们把代码当成跟证明一样,一次性的东西,所以他们的代码往往不能满足实际工程的严格要求。   编程是一门艺术   从上面你也许已经明白了,普通程序员使用的编程语言,就算是C++这样毛病众多的语言,其实也已经比数学家使用的语言高明很多。计算机科学并不是数学的一个分支,它在很大程度上是优于数学,高于数学的。有些数学的基本理论可以被计算机科学所用,然而计算机科学并不是数学的一部分。数学在语言方面带有太多的历史遗留糟粕,它其实是泥菩萨过河,自身难保,它根本解决不了编程中遇到的实际问题。   编程真的是一门艺术,因为它符合艺术的各种特征。艺术可以利用科学提供的工具,然而它却不是科学的一部分,它的地位也并不低于科学。和所有的艺术一样,编程能解决科学没法解决的问题,满足人们新的需求,开拓新的世界。所以亲爱的程序员们,别再为自己不懂很多数学而烦恼了。数学并不能帮助你写出好的程序,然而能写出好程序的人,却能更好的理解数学。我建议你们先学编程,再去看数学。
【转】思维方式,决定你能走多远 刚刚看了一个帖子,讲述从玩家到策划的蜕变,感触良多。 小弟从游戏玩家进化成策划也只是这2年而已,个人感觉游戏行业需要更加专业化的方向。 游戏产业并不像会计、美术、工程师等久远的行业一样有着明确的框架和方向,游戏行业中9成9都是狂热的游戏爱好者蜕变而成,所以大多数从业者都缺少系统的游戏制作方面的学习经历(我指的是纯粹的游戏业者,策划这类),一切都是像旧社会老师傅式的传承方式传递知识,虽然各种知识可以融合到行业中,但是真正的核心还是来自于经验传承。 2年时间看到过无数新人抱怨的前景渺茫,其实混了两年客服、测试、运营、策划都干过,最大的感受就是当你站在不一样的位置时,你是如何思考问题的,游戏行业同比其他行业,他的发展方式是横向大于纵向,你可以从客服到测试再到策划,这个过程并没有改变你在团队中的位置只是改变了职能,至少称不上升职,这就是长有人抱怨的,要知道游戏行业能提供给你的空间有多少,策划不论是数值还是剧情等等,你在团队中的重要程度不同,但是职位的级别却是相同的,再向上是什么?主策划,然后了,有些组织严密一点的会有经理,小一点的直接就是制作人,如果没有过强的综合能力,是不容易升职的。 聊到了综合能力,程序、数值这类技术性的岗位不提,如何提升,最重要的是改变思考方式,同样的问题换一个方向去理解,要时刻思考为什么,举个例子:需要你设计一款游戏, 游戏设计师:游戏的机制,游戏的数值,游戏的受众 主策划:游戏的玩点,游戏的功能 执行策划:某某游戏的某个功能做的好 精英玩家:某某游戏好玩 普通玩家:某某游戏有名 这是一种面对同一课题时不同的反映(举例子对与错不要深究),普通玩家没有相应的只是和经验很容易大开脑懂去抄袭和构思游戏,他们的根据只是“特立独行”,我们都是从这个阶段成长起来不难回忆道那个时候。 随着时间推移,慢慢的变成了游戏中的老油条,这个时候面对一款游戏,我们会更加愿意去注意他的功能,但是还很少有人去理解功能的用意。 当我们有一天站在了策划的位置上,才真的能够直到作者为何要这样设计,而我们自然而然的将研究的方向放在了其他游戏的制作上,但是不要忘记一点,纵使模仿的再好又如何才能超越。 当有一天我们悟到了产品的真谛,我们就会滑向不同的方向,不论你执着于创新,还是时时紧盯市场,你的成功已经就在眼前。 但是只有摒弃一切杂念,一心埋头思考原理的人才能最终走到事外看到本质,他们可能未必比你赚的更多,但是他们的思想却更细腻,更能够透析根本。 我们就停留在某一阶段,思想无法变通,终究只能停滞不前,成功和失败的根本区别在于思想根源。
【OPENGL学习02】显示位图 位图就是.bmp格式的文件。 如何在OGL中显示位图呢?大致步骤如下: 1.设置2D视图模式 2.加载并解析位图文件 3.调用OGL函数显示位图 我使用的素材如下:main函数和包含文件 #include <GL/glew.h> #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include "SBMP.h" #pragma comment(lib, "glew32.lib") //函数声明 void display(); void init(); void initGlew(); void getVersion(); void reshape(int, int); int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);//GLUT_SINGLE GLUT_DOUBLE glutInitWindowSize(640, 480); glutInitWindowPosition(1000, 100); glutCreateWindow("你好"); init(); initGlew();//放在窗口和OGL初始化完成之后 getVersion(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); getchar(); return 0; } 设置2D视图模式 //OGL初始化 void init(){ glClearColor(0.0, 0.0, 0.0, 0.0); SSet2DMode(640, 480);//参见SBMP.h } //窗口大小改变后的回调函数 void reshape(int w, int h) { SSet2DMode(w, h);//参见SBMP.h } 加载并解析位图文件 你要对位图格式有所了解,详情可度娘。 我写了一个结构和三个函数,主要用于OGL中显示位图。 SBMP结构 用于存储位图的一些有用信息。 SBMP* SLoadBMP(const wchar* filename) 从文件中加载位图,并返回一个SBMP结构 void SDrawBMP(SBMP *bmp, int x, int y) OGL中在位置(x,y)中显示位图bmp void SFreeBMP(SBMP *bmp) 当位图不使用时,释放位图内存。 void SSetColor(GLubyte red, GLubyte green, GLubyte blue) 设置颜色,用于显示双色位图,当然,也可以用于绘制几何图元。 详情参见下面的SBMP.h源代码 调用OGL函数显示位图 主要是调用 SDrawBMP函数,它封装了OGL相关位图像素函数,详情可见红宝书第8章。其实图形库有很多,比如SDL中的SDL2_image,Dev IL,FreeImage这三个库。用现成的也是个很好的选择。 //在这里绘制和显示 void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3ub(125,245,14); glBegin(GL_POLYGON); glVertex3i(25, 25, 0); glVertex3i(75, 25, 0); glVertex3i(75, 75, 0); glVertex3i(25, 75, 0); glEnd(); //声明3个位图 SBMP* logo[3]; logo[0] = SLoadBMP(L"C:\\Users\\aeglove\\Pictures\\SDL_logo1.bmp");//双色位图 logo[1] = SLoadBMP(L"C:\\Users\\aeglove\\Pictures\\SDL_logo8.bmp");//256色位图 logo[2] = SLoadBMP(L"C:\\Users\\aeglove\\Pictures\\SDL_logo.bmp");//全彩色位图 SSetColor(35, 62, 232);//用于设置双色位图的显示颜色 //显示位图 SDrawBMP(logo[0], 250, 250); SDrawBMP(logo[1], 10, 10); SDrawBMP(logo[2], 10, 250); glFlush(); //释放位图内存 SFreeBMP(logo[0]); SFreeBMP(logo[1]); SFreeBMP(logo[2]); } -----------------------------END----------------------------------------------------------- 其实图形库有很多,比如SDL中的SDL2_image,Dev IL,FreeImage这三个库。 用现成的也是个很好的选择。 不过我还是想自己写一下。 接下来,我可能会写写PNG格式的,不过似乎比BMP格式的复杂。 附上运行图:
【OPENGL学习01】第一个程序 #include <GL/glew.h> #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #pragma comment(lib, "glew32.lib") void display(); void init(); void initGlew(); void getVersion(); int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(640, 480); glutInitWindowPosition(500, 100); glutCreateWindow("hellow"); init(); initGlew();//放在窗口和OGL初始化完成之后 getVersion(); glutDisplayFunc(display); glutMainLoop(); getchar(); return 0; } void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3f(0.25, 0.25, 0.0); glVertex3f(0.75, 0.25, 0.0); glVertex3f(0.75, 0.75, 0.0); glVertex3f(0.25, 0.75, 0.0); glEnd(); glFlush(); } void init(){ glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); } void initGlew(){ GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); } fprintf(stdout, "GLEW 版本: \t\tGLEW %s\n", glewGetString(GLEW_VERSION)); } void getVersion(){ //const Glubyte* glVerson = glGetString(GL_VERSION); fprintf(stdout, "OpenGL 支持版本: \t%s\n", glGetString(GL_VERSION)); fprintf(stdout, "OpenGL 供应商: \t\t%s\n", glGetString(GL_VENDOR)); fprintf(stdout, "OpenGL 着色语言版本: \t%s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); } 运行图
【转】张艺谋御用美术师遭网游挖角 或加盟《江湖》 近日,关于张艺谋和巨人合作开发网游的消息在网上炒得沸沸扬扬。不过有消息人士爆料称,张艺谋只是起到牵桥搭线的作用,这次与巨人网络旗下游戏《江湖》合作其实另有其人,极有可能是张艺谋御用美术师霍廷霄或易振洲中一人。霍廷霄   据了解,张艺谋旗下御用电影美术师有两位,分别是霍廷霄或易振洲。其中霍廷霄自2001年开始就跟张艺谋合作,先后创造出《英雄》、《十面埋伏》、《满城尽带黄金甲》等充满视觉震撼力的作品,他也是中国在国内外获得奖项最多的电影美术设计师,曾获得法国戛纳电影节技术大奖和金鸡奖、金像奖等重量级大奖。易振洲   与霍廷霄相比,易振洲跟张艺谋的关系被大家熟知的还是停留在当年的电影《英雄》上,不过他的代表作如《荆轲刺秦王》、《投名状》、《墨攻》、《木乃伊3》等作品也无不让人耳熟能详。江湖   不过有知情人士透露,相对易振洲这个善于倾心勾勒最美线条的大片绘制者相比,霍廷霄这个擅长将中国元素糅合到电影画面中去的人,或更容易得到巨人网络方面的青睐。据悉,霍氏电影最大特色之一就是在选景上的广泛取材和严苛甄选,将中国的大好河山都浓缩电影这一立体有声画卷中。   值得一提是,虽然目前《江湖》项目组方面没正式对此事进行任何回应,但是把电影的“色彩艺术”引入到游戏中,这对大多数玩家而言,无疑是在享受一场视觉的盛宴。
【转】不靠谱VC的10个细节 原文地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.gameres.com%2Fmsg_250295.html&urlrefer=d9ec814de765a262b98a89ca6a6b215d   本文为作者上一篇文章《不靠谱创业者的15个细节》的续篇。昨天,作者公号刚刚盘点完十五种不靠谱创业者,今天就有创业者忍不住来吐槽VC了。作者宋玮对这名创业者的背景介绍:   公司已经成功拿到了B轮融资,目前公司300人左右规模。不是官二代,年龄没有超过35,也不是海龟,不带手串不打耳钉,而且,懂数据懂技术,很好交流,在某些方面略显偏执。昨天文章中不靠谱创业者的15个细节他通通没有,好吧,就让这位看起来非常靠谱的创业者来谈谈他眼中的不靠谱VC吧。   看了你的公号的上一篇文章:不靠谱创业者的 15 个细节。作为创业者我也有话说,我也见过形形色色的 VC 和天使投资人,不靠谱的其实还是大多数。投资人看创业者的细节,创业者也看投资人的细节。这里,列举一些创业者在乎的细节,一旦这些细节出现两次以上,最好还是离这些投资人远一点。   硅谷著名投资人 Paul Graham 说过:Competitors punch you in the jaw, but investors have you by the balls.   这句话有点那啥,我就不翻译了。文中所说的投资人,包括天使投资人和 VC。   1、动不动就说创业者不靠谱的。创业其实本来就是个不靠谱的事情,失败的概率远比成功大,大家都是在拼一个可能。动不动就说我们创业者不靠谱,那你靠谱过几回? 有多少成功案例能分享呢? 可惜,动不动说我们创业人不靠谱的投资人,大部分都是在陈述一些老黄历,什么「跟腾讯擦肩而过」「错过了Google 的投资机会」什么的。   2、不守时。这是几乎所有投资人的坏习惯。真正能守时的投资人其实是少数。投资人不守时,我也可以理解,找他们的创业者太多了嘛。但他们说抱歉时多数不怎么真诚,那幅「我这么忙你知道的」的样子很讨厌。不真诚其实也没什么,最怕的就是坐下来还没谈几分钟,就随便找个借口说「我还有个董事会,先走了」。其实如果真的觉得几分钟能把创业者看透,就直接告诉对方的缺陷和不足也好,随便找个借口多少有些不尊重人。   3、不做功课。作为创业者,每次跟投资人见面之前,我都会做一下调查,了解一下该投资人的背景,投过什么好项目,以节省双方的时间。但我却很少遇到投资人跟创业者见面前做足功课的。有的投资人电话跟我约了十几次,见面还问:你是做什么的来着? 我当时差点拍桌走人。对创业者来说,有少数投资人其实是做足调查也会问你,主要是验证跟他收到的信息是否一致。遇到这样的投资人,作为创业者也会很高兴。   4、架子挺大的。不少投资人,一上来开会就板着债主的脸,简直跟下面说的「没头脑」,可以凑成一部动画片《没头脑与不高兴》。其实创业者也基本都知道,投资圈的人,从分析师到投资经理到投资总监再到副总裁,真正有投资权的非常的少。我这么说不是瞧不起这些人,因为能否拿到投资还是跟这些人直接相关的。问题是,有那么一些投资人架子不是一般的大,动不动要创业者派车接送什么的,或者要创业者几十里地赶过去见他,都把自己当成什么人了啊? 你时间宝贵,我们创业者时间不是更宝贵?替我们创业者也考虑一下能死啊?   5、有前科喜欢干预创业者公司事务的。不少投资人喜欢插手创业者公司内部事务,创业者不是万能的,肯定有某种能力上的缺陷,如果投资人能帮我们解决这类短板,这是好事情。最怕就是有控制欲的投资者,公司本来没太大问题,却安插进来不少自己人,逐渐架空创业者。这种事情过去可不少见。我们创业者其实也不傻,一旦发现某些 VC 有过这样的「案底」,跟我们打交道我们当然会多个心眼儿。   6、替竞争对手来刺探军情的。这种事情我就遇到过,后来不少朋友跟我说他们也遇到类似的事情。某 VC 已经悄悄投了跟我们类似的项目,秘而不宣,然后到我们这里询问我的业务情况,询问各种细节和运营策略,幸亏我当时有所保留。否则的话,估计我自己都能后悔死。   7、在投资条款上设置陷阱。很多没有经验的投资者一般都会吃投资人投资条款的亏,比如隐含的对赌条件,比如一票否决权的设置问题。没办法,这事情即使你仔细看了也可能不明白,你不如人家专业,你不懂啊。合同签完,后悔也没用。所以,我经常建议创业者在签署合同的时候付费请一下可靠的律师帮看一下。   8、喜欢跟概念自己又没头脑的。大数据火了,就到处打听哪儿有大数据项目,O2O 流行,就满大街找 O2O 项目。看到个硬件项目就问「你们跟小米的差距在哪儿?」。这样的 VC 一般也要敬而远之。   9、喜欢说「海龟我不投」、「年龄大于35不投」之类的话的。这些话其实就是投资者的成见。海龟里优秀的成功者很多,年龄大于35的创业者并且把事情做成的也太多了。你是投资人,你关注的是团队能力和项目前景就行了,不要那么喜欢臧否人物,更别当着创业者的面大肆说别的创业者不靠谱,还要让我们陪笑听着。当然,我不是海龟,年龄也没超过35,但我真的很不喜欢投资人的各种成见。   10、不爱买单的、动不动就提投委会不同意的、居高临下的、不做自我介绍的、不带名片的、谈了一年还说要继续观察的、满嘴跑产业理想的、爱说我跟马化腾马云很熟的……   暂时就列举这些吧,我就不凑齐 15 个细节了。投资人投给我们的是钱,我们是拿命在拼啊。其实双方都是平等的,没必要你是投资人就在心里觉得自己高高在上,一幅救世主的心态。作为创业者,别人投给我们钱,我们自然要拼尽全力去赢的一个最好的结果,对得起投资人,也对得起自己。最后,这篇稿子请匿名吧,我以后还要去融资呢。
[DX]创建一个DX窗口 #include <d3d9.h> //#include <d3dx9d.h> //----------------------------------------------------------------------------- //全局变量 //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; // 用于创建D3D设备 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //我们所使用的渲染设备 //----------------------------------------------------------------------------- // Name: InitD3D() // Desc: 初始化Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D(HWND hWnd) { //创建D3D对象【用于创建D3D设备】 if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; // Set up the structure used to create the D3DDevice. Most parameters are // zeroed out. We set Windowed to TRUE, since we want to do D3D in a // window, and then set the SwapEffect to "discard", which is the most // efficient method of presenting the back buffer to the display. And // we request a back buffer format that matches the current desktop display // format. //设置D3DPRESENT_PARAMETERS结构,用于创建D3D设备 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Create the Direct3D device. Here we are using the default adapter (most // systems only have one, unless they have multiple graphics hardware cards // installed) and requesting the HAL (which is saying we want the hardware // device rather than a software one). Software vertex processing is // specified since we know it will work on all cards. On cards that support // hardware vertex processing, though, we would see a big performance gain // by specifying hardware vertex processing. if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice))) { return E_FAIL; } // Device state would normally be set here return S_OK; } //----------------------------------------------------------------------------- // Name: Cleanup() // Desc: 释放先前定义的所有对象 //----------------------------------------------------------------------------- VOID Cleanup() { if (g_pd3dDevice != NULL) g_pd3dDevice->Release(); if (g_pD3D != NULL) g_pD3D->Release(); } //----------------------------------------------------------------------------- // Name: Render() // Desc: 绘制屏幕 //----------------------------------------------------------------------------- VOID Render() { if (NULL == g_pd3dDevice) return; // 使用蓝色清空后台缓冲区 g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); // 开始场景绘制 if (SUCCEEDED(g_pd3dDevice->BeginScene())) { // Rendering of scene objects can happen here //结束场景绘制 g_pd3dDevice->EndScene(); } // 提交后台缓冲并显示 g_pd3dDevice->Present(NULL, NULL, NULL, NULL); } //----------------------------------------------------------------------------- // Name: MsgProc() // Desc: 窗口信息管理 //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: Cleanup(); PostQuitMessage(0); return 0; case WM_PAINT: Render(); ValidateRect(hWnd, NULL); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); } //----------------------------------------------------------------------------- // Name: wWinMain() // Desc: 应用的入口 //----------------------------------------------------------------------------- INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT) { UNREFERENCED_PARAMETER(hInst); // 注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL }; RegisterClassEx(&wc); // 创建应用窗口 HWND hWnd = CreateWindow(L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, wc.hInstance, NULL); // 初始化Direct3D if (SUCCEEDED(InitD3D(hWnd))) { // 显示窗口 ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); // 输入信息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } UnregisterClass(L"D3D Tutorial", wc.hInstance); return 0; }
SDL系列-1简介 SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒 体库,以用于直接控制底层的多媒体硬件的接口。这些多媒体功能包括了音频、键盘和鼠标 (事件)、游戏摇杆等。当然,最为重要的是提供了2D图形帧缓冲(framebuffer)的接口, 以及为OpenGL与各种操作系统之间提供了统一的标准接口以实现3D图形。从这些属性我 们可以看出,SDL基本上可以认为是为以电脑游戏为核心开发的多媒体库。 SDL支持主流的操作系统,包括Windows和Linux。在官方的介绍中,我们可以找到 它所支持的其他平台。(SDL supports Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. )。SDL本身从C语言开发, 并且能很好的在C++等高级语言中使用。在官方可以看到SDL所支持的语言很多。(Including Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk, and Tcl. ) SDL在GNU LGPL version 2下发布,这意味着你可以免费的使用。并且可以免费的用 于商业软件的制作(只要你直接使用SDL的动态链接库,Windows下的SDL.dll)。如果你 将SDL库编译进了自己的二进制代码中,你需要指明你所使用的SDL库的版本以及包括你 自己修改的源代码,并说明这些代码的原始出处。这是很宽松的法律,你可以用如此强大的 多媒体库完全合法的免费开发商业游戏。
游戏人物~司马懿 帝内忌而外宽,猜忌多权变。魏武察帝有雄豪志,闻有狼顾相。欲验之。乃召使前行,令反顾,面正向后而身不动。又尝梦三马同食一槽,甚恶焉。因谓太子丕曰:“司马懿非人臣也,必预汝家事。”太子素与帝善,每相全佑,故免。帝于是勤于吏职,夜以忘寝,至于刍牧之间,悉皆临履,由是魏武意遂安。及平公孙文懿,大行杀戮。诛曹爽之际,支党皆夷及三族,男女无少长,姑姊妹女子之适人者皆杀之,既而竟迁魏鼎云。明帝时,王导侍坐。帝问前世所以得天下,导乃陈帝创业之始,用文帝末高贵乡公事。明帝以面覆床曰:“若如公言,晋祚复安得长远!”迹其猜忍,盖有符于狼顾也。 制曰:夫天地之大,黎元为本。邦国之贵,元首为先。治乱无常,兴亡有运。是故五帝之上,居万乘以为忧;三王已来,处其忧而为乐。竞智力,争利害,大小相吞,强弱相袭。逮乎魏室,三方鼎峙,干戈不息,氛雾交飞。宣皇以天挺之姿,应期佐命,文以缵治,武以棱威。用人如在己,求贤若不及;情深阻而莫测,性宽绰而能容,和光同尘,与时舒卷,戢鳞潜翼,思属风云。饰忠于已诈之心,延安于将危之命。观其雄略内断,英猷外决,殄公孙于百日,擒孟达于盈旬,自以兵动若神,谋无再计矣。既而拥众西举,与诸葛相持。抑其甲兵,本无斗志,遗其巾帼,方发愤心。杖节当门,雄图顿屈,请战千里,诈欲示威。且秦蜀之人,勇懦非敌,夷险之路,劳逸不同,以此争功,其利可见。而返闭军固垒,莫敢争锋,生怯实而未前,死疑虚而犹遁,良将之道,失在斯乎!文帝之世,辅翼权重,许昌同萧何之委,崇华甚霍光之寄。当谓竭诚尽节,伊傅可齐。及明帝将终,栋梁是属,受遗二主,佐命三朝,既承忍死之托,曾无殉生之报。天子在外,内起甲兵,陵土未乾,遽相诛戮,贞臣之体,宁若此乎!尽善之方,以斯为惑。夫征讨之策,岂东智而西愚?辅佐之心,何前忠而后乱?故晋明掩面,耻欺伪以成功;石勒肆言,笑奸回以定业。古人有云:“积善三年,知之者少,为恶一日,闻于天下。”可不谓然乎!虽自隐过当年,而终见嗤后代。亦犹窃钟掩耳,以众人为不闻;锐意盗金,谓市中为莫睹。故知贪于近者则遗远,溺于利者则伤名;若不损己以益人,则当祸人而福己。顺理而举易为力,背时而动难为功。况以未成之晋基,逼有余之魏祚?虽复道格区宇,德被苍生,而天未启时,宝位犹阻,非可以智竞,不可以力争,虽则庆流后昆,而身终于北面矣。
俺了不想活了。。。。。 天,Freetype2怎么这么难?百度SOU了一下,教程都是语焉不详,我都要怀疑自己的智商了。大家有用过吗?有运行成功的吗? 尤其是矩阵转换,自己的数学真的不够用了。。 还有怎么搞都无法渲染成双色位图,,,啊, 卡了我好几个月了,, 附上源码: #include <ft2build.h> #include FT_FREETYPE_H #include FT_GLYPH_H #pragma comment(lib,"freetype250MT") class FT2Obj{ private: FT_Library lib; FT_Face face; FT_GlyphSlot slot; FT_BitmapGlyph glyph_bitmap; int h; public: void init(const char* fname,unsigned int h); void free(); void draw(wchar_t); }; void FT2Obj::init(const char* fname,unsigned int h){ FT_Init_FreeType(&lib); FT_New_Face(lib,fname,0,&face); FT_Set_Char_Size(face,h<<6,0,96,96); /**/ FT_Matrix mat; //FT_UInt index; FT_Vector pen; FT_Fixed x_scale = 0x10000L; FT_Fixed y_scale = 0x10000L; float angle = 180*3.14;//绕原点旋转angle度 mat.xx = (FT_Fixed)(cos(angle)+x_scale );//* 0x10000L mat.xy = (FT_Fixed)(-sin(angle)); mat.yx = (FT_Fixed)(sin(angle)); mat.yy = (FT_Fixed)(cos(angle)+y_scale); /* float angle = -25*360*3.14; mat.xx = (FT_Fixed)( cos( angle )* 0x05000L );//* 数字为x轴的绽放 mat.xy = (FT_Fixed)(-sin( angle )* 0x10000L ); mat.yx = (FT_Fixed)( sin( angle ) * 0x10000L ); mat.yy = (FT_Fixed)( cos( angle ) * 0x05000L ); */ FT_Set_Transform(face,&mat,&pen); } void FT2Obj::draw(wchar_t ch){ //加载字形 slot=face->glyph; FT_Bitmap bitmap=slot->bitmap; FT_Load_Char(face,ch,FT_LOAD_RENDER );//渲染成单色位图| FT_LOAD_MONOCHROME RENDER cout<<"字形数目:"<<face->num_glyphs<<endl; cout<<"face数目:"<<face->num_faces<<endl; cout<<"映射数目:"<<face->num_charmaps<<endl; cout<<"像素格式:"<<bitmap.pixel_mode<<endl; cout<<"位图高度:"<<bitmap.rows<<endl; cout<<"位图宽度:"<<bitmap.width<<endl; cout<<"位图跨度:"<<bitmap.pitch<<endl; //使用OGL绘制 glRasterPos2i(100,100); glColor3ub(233,0,0); glDrawPixels(bitmap.width,bitmap.rows,GL_LUMINANCE,GL_UNSIGNED_BYTE,bitmap.buffer); //glDrawPixels(128,128,GL_RGB,GL_UNSIGNED_BYTE,&bmp_glyph->bitmap.buffer); //glBitmap((GLsizei)62,(GLsizei)62,5,5,0,0,(BYTE*)PixelData); } void FT2Obj::free(){ FT_Done_Face(face); FT_Done_FreeType(lib); } ---------------------------以上是FT2.h--------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- #include <stdio.h> #include <iostream> #include <math.h> // sin(), cos() #include <Windows.h> using namespace std; #include <GL/glew.h>//必须在包含glut.h之前 #include <GL/glut.h> #include "FT2.h" #pragma comment(lib,"freeglut") #define WIDTH 640 #define HEIGHT 480 /**/ FT2Obj font; void init(void) { //初始化GLEW库 GLenum err = glewInit(); if (GLEW_OK != err) printf("GLEW无法初始化\n"); else printf("GLEW成功初始化\n\n\n"); glClearColor(1.0, 1.0, 1.0, 0.0); glShadeModel(GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3ub(255,0,0); //glBegin(GL_POINTS);//(GL_LINE_STRIP); //glEnd(); font.draw(L'神'); glFlush(); glutSwapBuffers(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, h,0,0, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (WIDTH, HEIGHT); glutInitWindowPosition (500, 100); glutCreateWindow ("AG"); // argv[0] font.init("F:/su/simhei.ttf",64);//simhei msyh init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc (keyboard); glutMainLoop(); getchar(); font.free(); return 0; } -----------------------------------以上是主函数文件---------------------------------------------------- 大家有空帮忙瞅瞅吧,,,,,,,,,,,
AG指南 1、本吧着力为爱好人工智能和游戏开发的吧友打造一个技术讨论的氛围 2、本吧面向游戏程序开发,游戏美术,游戏音乐,游戏策划,游戏测试等一切与游戏开发相关方向 3、本吧鼓励讨论人工智能的具体实现 4、鼓励所有人发布其擅长领域的作品以及教程 5、对于程序员:鼓励其发布游戏程序(包括游戏引擎),支持其发布与游戏无关的绿色原创软件,支持其发布理论教程(例如算法、数据结构),根据贡献程度决定是否加精 6、对于美工:鼓励其发布游戏美术作品(例如游戏CG),支持其发布素描、动漫临摹、漫画,支持其发布美术教程,完整地上传一幅美术作品(要求上色,尺寸够大)或教程可以申精 7、对于音效师:鼓励其发布游戏音乐作品(例如BGM,游戏声效),支持其发布乐器solo、声乐教程,完整上传一首原创游戏音乐、乐器solo、声乐教程可以申精 8、本吧鼓励进行游戏策划和游戏测试的讨论,由吧友反响程度决定是否加精 9、本吧禁止发表诸如暴力、色情、广告、反动、辱骂他人、金钱交易、黑客技术等一切破环贴吧和谐讨论环境的帖子,违者第一次删帖警告,第二次封禁IP 10、本吧禁止无端挑拨吧务,无事生非,破环贴吧和谐,违者直接封禁IP 11、吧务不能无故删帖,删帖时应先给楼主留下删帖理由 12、吧务需要定期在线,长期不在线的吧务自动申请辞职或由吧主辞退 13、小吧主申请条件:1、会员达到300+ 2、贴吧等级到达9级
1 下一页