读《游戏编程指南》

简介: 趁着空闲读彭博的《游戏编程指南》。 一、语言 1、定义多维数组 int **p;p = new int*[40];for(int i = 0; i < 40; ++i) p[i] = new int [60]; // 为p数组中的每一指针分配内存 2、定义字符串 char* str = "alexmy"; // "alexmy"是在常量区,无需手动释放

趁着空闲读彭博的《游戏编程指南》。

一、语言

1、定义多维数组

int **p;
p = new int*[40];
for(int i = 0; i < 40; ++i)
	  p[i] = new int [60]; // 为p数组中的每一指针分配内存

2、定义字符串

char* str = "alexmy"; // "alexmy"是在常量区,无需手动释放
		 	

3、常用函数

int rand()								// 返回一个随机整数
void srand(int) 					// 根据参数重新初始化随机数产生器
int/float abs(int/float)  // 返回数的绝对值
min/max(a,b)							// 返回a和b中较小/大的值
int atoi(char* s)					// 返回由s字符串转换成的整数
double atof(char* s)			// 返回由s字符串转换成的浮点数

char *strcpy(char *dest, char *src);,该函数使dest=src并返回新的dest。使用它还可以实现字符串和字符数组之间的转换。
char *strncpy(char *dest, char *src, int size);,和strcpy的唯一区别是只拷贝size个字符。记得补上尾部的’/0’!
char* strcat(char *dest, char *src);,将src连接到dest的后面,并返回新的dest。
char* strstr(char *s1, char *s2);,返回指向s2在s1中第一次出现的位置的指针。
char* strchr(char *s1, char c);,返回指向c在s1中第一次出现的位置的指针。
char* strlwr(char *s);,将s中的所有大写字母转为小写。
char* strset(char *s, char c);,将s内所有字符替换为字符c。
int strcmp(const char*s1, const char* s2);,判断如按字典顺序s1是否在s2之前。是则返回1,否则返回-1,若两字符串相等,返回0。
int strlen(char *s);,返回字符串的长度。

4、文件读写

	#include <fstream>
	using namespace std;
	int a;
	……
	fstream file;
	file.open("abc.dat"); //使用file.open("abc.dat", ios::binary);可指定为二进制模式
	file>>a; //就像cin
	file<<"abcdefg"; //就像cout
	……
	file.close(); //关闭文件

二、内嵌汇编

1、处理器大部分指令不能直接施用在内存中的变量上,需要借助寄存器这个中间存储单元(可以看成是一个变量),Pentium级处理器有八个32位的通用寄存器。

分别为:EAX,EBX,ECX,EDX,EBP,ESP,EDI,ESI,每一个通用寄存器的低16位又分别被称为AX,BX,CX,DX,BP,SP,DI,SI。其中AX,BX,CX,DX的高8位称为AH,BH,CH,

DH,低8位被称为AL,BL,CL,DL,注意内嵌汇编中不应施用EBP,ESP他们存储着重要的堆栈信息。

还有一个非常重要的寄存器,叫做标志寄存器(EFLAGS),标注了运算结果的各个属性,不恩能够直接读取或修改它。这些属性有:不溢出/溢出(OF),正/负(SF),

非零/零(ZF),偶/奇(PF),不进位/进位(CF)

2、实例:两个正整数相加

void main()
	{
		int a = 1, b = 2;
		int* c = &a;
		_asm		// 开始内嵌汇编
		{
			mov eax,c;
			mov eax,[eax];
			mov ebx,b;
			lea eax,[eax+ebx];
			mov a,eax;
		}			 	// 内嵌汇编结束
	}
JMP				无条件转移                          
	JE / JZ				ZF=1时转移
	JNE / JNZ			ZF=0时转移

JS					SF=1时转移
JNS					SF=0时转移		
JO					OF=1时转移
JNO 				OF=0时转移
JP / JPE			PF=1时转移
JNP / JPO 			PF=0时转移

根据两无符号数关系转移:
	JA / JNBE			大于时转移 (CF或ZF=0)
	JBE / JNA			不大于时转移 (CF或ZF=1)
	JB / JNAE / JC		小于时转移 (CF=1)
	JNB / JAE / JNC 	不小于时转移 (CF=0)

根据两有符号数关系转移:
JNLE / JG			大于时转移 ((SF异或OF)或ZF)=0 )
JLE / JNG			不大于时转移 ((SF异或OF)或ZF)=1 )
JL / JNGE     		小于时转移 (SF异或OF=1)
	JNL / JGE			不小于时转移 (SF异或OF=0)
	
	特殊转移语句:
	JECXZ				CX=0时转移






相关文章
|
Dart 安全 开发者
带你读《深入浅出Dart》二十、空安全
带你读《深入浅出Dart》二十、空安全
|
存储 小程序 容器
想做个答题类的微信小游戏?读这篇文章就够了
本文重要内容包含答题类小游戏的制作原理和制作方法,在掌握实现原理和方法后,你也能够根据自己的需要,制作自己的答题类小游戏。 如果你没有任何的游戏开发经验,欢迎阅读我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
214 0
|
小程序 开发工具 UED
实现各种效果和功能的按钮,读这篇文章就够了
本文主要内容包含各种效果和功能的按钮的实现方法,以及应用场景。 如果你没有任何的游戏开发经验,欢迎阅读我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
153 0
|
存储 C语言
【C语言】飞机大战游戏还原,源码在文末,应用“循环”与“数组”实现游戏开发,一起玩一下经典小游戏吧
众所周知昂,飞机大战,重在大战嘛,你这一颗子弹一架敌机,打的那是一点儿激情也没有。所以我们这章内容,就来对前文做修改,运用上数组手法,给它盘圆咯 在二维数组中存储游戏画面数据,元素为0时输出“ (空格)”,元素为1时输出大灰机“ * ”,元素为2输出子弹“¥”元素为3时输出敌机“@”定义二维数组存储游戏画面中元素的数组暂且定为4.基础功能的实现在飞机大战中,用人类语言来描述相关内容,则有以下这些,积分计算(包括击毁敌机,未击毁,飞机升级子弹,多架敌机产生……)这些我们都要一一实现 多架敌机产生这块儿,
【C语言】飞机大战游戏还原,源码在文末,应用“循环”与“数组”实现游戏开发,一起玩一下经典小游戏吧
|
Linux
linux系统编程(十一)线程同步(完结)(下)
linux系统编程(十一)线程同步(完结)
196 0
linux系统编程(十一)线程同步(完结)(下)
|
Linux 调度 数据库
linux系统编程(十一)线程同步(完结)(上)
linux系统编程(十一)线程同步(完结)
171 0
linux系统编程(十一)线程同步(完结)(上)
|
C++
爱上c++的第十二天:文件流的概念(详细版本)
c++的程序运行是要以类对象为操作单位的,要以磁盘文件为对象进行输入输出时,必须定义一个文件流的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。
121 0
二十、经典同步问题-读者写者问题
二十、经典同步问题-读者写者问题
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | Unity退出游戏代码
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】 ☀️ | Unity退出游戏代码
|
图形学
带你读《Unity游戏开发(原书第3版)》之二:游戏对象
本书主要介绍Unity2018的使用和游戏开发流程中涉及的各种知识。每一章的结构特别清晰,先综述该章要介绍的内容,然后一步步深入讲解,中间穿插着很多动手做的实践操作,可以让读者加深对某个概念、方法的理解,每章的最后还有一个小测验和一个稍微大一点的实践练习,用于巩固该章的学习内容。