Liberators
!!!
!!!!!!
!!!《算法(第4版)》笔记
归并排序基于“归并”这个简单的操作,即将两个有序的数组归并成一个更大的有序数组。
要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。
1 | // c++ |
《算法(第4版)》笔记
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
选择排序的缺点:一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然一样长。
1 | // c++ |
坐标系
原点:左上角
SDL扩展
SDL_image
支持多种格式图片加载:BMP GIF PNG TGA PCX …
SDL_net
跨平台网络库
SDL_mixer
audio mixer library. 支持MP3 MIDI OGG
SDL_ttf
支持TrueType字体
SDL_rtf
support the rendering of the Rich Text Format (RTF).
SDL_Init()
初始化标识
1 | SDL_INIT_HAPTIC Force feedback subsystem 力反馈 |
查看一个子系统是否已被初始化:
1 | if (SDL_WasInit(SDL_INIT_VIDEO) != 0) |
1 | SDL_CreateRenderer() |
游戏程序结构
初始化
游戏循环:获取输入 物理运算 渲染
退出
window flags
1 | SDL_WINDOW_FULLSCREEN Make the window fullscreen |
程序基本结构
1 | #include <SDL.h> |
绘制图片过程
SDL使用两种数据结构渲染到屏幕
SDL_Surface 像素集 使用软件渲染(not GPU)
SDL_Texture 使用硬件加速
1 | SDL_Texture* m_pTexture |
源矩形 目标矩形 参数传入0 将整个纹理渲染到整个窗口。
SDL_GetTicks() 毫秒
SDL_RenderCopyEx() 支持旋转和翻转Flip
SDL_image
sdl2_image.lib
1 | #include <sdl_image.h> |
Fixed frames per second (FPS) is
not necessarily always a good option, especially when your game includes more
advanced physics. It is worth bearing this in mind when you move on from this
book and start developing your own games. Fixed FPS will, however, be fine for
the small 2D games, which we will work towards in this book.
固定帧频
1 | const int FPS = 60; |
1 | SDL joystick event |
不同的游戏控制器 按钮和轴可能有不同的值 比如Xbox360 controller, PS3 controller
Xbox360 controller:
Two analog sticks
Analog sticks press as buttons
Start and Select buttons
Four face buttons: A, B, X, and Y
Four triggers: two digital and two analog
A digital directional pad
1 | if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0) |
分辨是哪个控制器的事件
1 | if (event.type == SDL_JOYAXISMOTION) |
控制器按钮
SDL_JoystickNumButtons
event.jbutton.button // 按钮ID
鼠标事件
1 | SDL Mouse Event Purpose |
1 | // 鼠标按钮 |
event.type SDL_MOUSEMOTION
event.motion.x
event.motion.y
// 键盘
1 表示按下 0 表示没有按下
SDL_GetKeyboardState(int* numkeys)
Uint8* m_keystates;
m_keystates = SDL_GetKeyboardState(0);
SDL_Scancode key;
if (m_keysttes[key] == 1)
有限状态机
需要能够处理以下情况:
Removing one state and adding another
Adding one state without removing the previous state
Removing one state without adding another
Game
GameObject
TextureManager // 负责加载图片文件,负责绘制,纹理ID
InputHandler
GameState
GameStateMachine
GameObjectFactory
StateParser
Distributed Factory
class GameObjectFactory
std::map<std::string, BaseCreator*> m_creators;
registerType(std::string typeID, BaseCreator* pCreator);
https://github.com/ReneNyffenegger/development_misc/tree/master/base64.
The base64.h and base64.cpp files can be added directly to the project.
1 | SDL_Mixer |
SDL_SetTextureAlphaMod()
http://tjumyk.github.io/sdl-tutorial-cn/contents.html
VS 新建项目选择控制台程序,链接属性中选择子系统“/SUBSYSTEM:WINDOWS”。
1 | #include <SDL/SDL.h> |
以下摘自《敏捷软件开发:原则、模式与实践》。
可持续的开发速度:
软件项目不是全速短跑,它是马拉松长跑。那些一跃过起跑线就开始尽力狂奔的团队将会在远离终点前就筋疲力尽。为了快速地完成开发,团队必须要以一种可持续的速度前进。团队必须保持旺盛的精力和敏锐的警觉。团队必须要有意识地保持稳定、适中的速度。
XP(极限编程)的规则不允许团队加班工作。在版本发布前的一个星期是该规则的唯一例外。如果发布目标就在眼前并且能够一蹴而就,则允许加班。
以下摘自《人月神话》,讨论了开发团队的组建以及运作。
在计算机领域的会议中,常常听到年轻的软件经理声称,他们喜欢由一流人才组成的小型、精干的队伍,而不是那些几百人的大型团队,这里的“人”当然暗指平庸的程序员。其实我们也经常有相同的看法。
软件经理很早就认识到优秀程序员和较差程序员之间生产率的差异。
我常常重复这样一个观点,需要协作沟通的人员数量影响着开发成本,因为成本的主要组成部分是相互的沟通和交流,以及更正沟通不当引起的不良结果(系统调试)。这一点,也暗示系统应该由尽可能少的人员来开发。
如果在一个200人的项目中,有25个最能干和最有开发经验的项目经理,那么开除剩下的175名程序员,让项目经理来编程开发。
从前,有位咨询顾问造访客户调研其开发项目。系统核心是个类继承体系,顾问看了开发人员所写的一些代码。他发现整个体系相当凌乱,上层超类对于系统的运作做了一些假设,下层子类实现这些假设。但是这些假设并不适合所有子类,导致覆写(override)工作非常繁重。只要在超类做点修改,就可以减少许多覆写工作。在另一些地方,超类的某些意图并未被良好理解,因此其中某些行为在子类内重复出现。还有一些地方,好几个子类做相同的事情,其实可以把它们搬到继承体系的上层去做。
这位顾问于是建议项目经理看看这些代码,把它们整理一下,但是经理并不热衷于此,毕竟程序看上去还可以运行,而且项目面临很大的进度压力。于是经理说,晚些时候再抽时间做这些整理工作。
顾问也把他的想法告诉了在这个继承体系上工作的程序员,告诉他们可能发生的事情。程序员都很敏锐,马上就看出问题的严重性。他们知道这并不全是他们的错,有时候的确需要借助外力才能发现问题。程序员立刻用了一两天的时间整理好这个继承体系,并删掉了其中一半代码,功能毫发无损。他们对此十分满意,而且发现在继承体系中加入新的类或使用系统中的其他类都更快、更容易了。
项目经理并不高兴。进度排得很紧,有许多工作要做。系统必须在几个月之后发布,而这些程序员却白白耗费了两天时间,干的工作与要交付的多数功能毫无关系。原先的代码运行起来还算正常,他们的新设计看来有点过于追求完美。项目要交付给客户的,是可以有效运行的代码,不是用以取悦学究的完美东西。顾问接下来又建议应该在系统的其他核心部分进行这样的整理工作,这会使整个项目停顿一至二个星期。所有这些工作只是为了让代码看起来更漂亮,并不能给系统添加任何新功能。