游戏中的基础碰撞检测算法

在游戏中,经常需要进行碰撞检测的实现,例如判断前面是否有障碍以及判断子弹是否击中飞机,都是检测两个物体是否发生碰撞,然后根据检测的结果做出不同的处理。

进行碰撞检测的物体可能有些的形状和复杂,这些需要进行组合碰撞检测,就是将复杂的物体处理成一个一个的基本形状的组合,然后分别进行不同的检测。

下面简单介绍一下两种最基本的形状进行碰撞的时候进行的处理。

1、矩形和矩形进行碰撞

一般规则的物体碰撞都可以处理成矩形碰撞,实现的原理就是检测两个矩形是否重叠。我们假设矩形1的参数是:左上角的坐标是(x1,y1),宽度是w1,高度是h1;矩形2的参数是:左上角的坐标是(x2,y2),宽度是w2,高度是h2。

在检测时,数学上可以处理成比较中心点的坐标在x和y方向上的距离和宽度的关系。即两个矩形中心点在x方向的距离的绝对值小于等于矩形宽度和的二分之一,同时y方向的距离的绝对值小于等于矩形高度和的二分之一。下面是数学表达式:

x方向:| (x1 + w1 / 2) – (x2 + w2/2) | < |(w1 + w2) / 2|

y方向:| (y1 + h1 / 2) – (y2 + h2/2) | < |(h1 + h2) / 2|

在程序中,只需要将上面的条件转换成代码就可以实现了。

但是矩形碰撞只是一种比较粗糙的碰撞检测方法,因为很多实际的物体可能不是一个规则的矩形。

下面介绍一下圆形碰撞。

2、圆形和圆形的碰撞

圆形和圆形的碰撞应该说是一种最简单的碰撞,因为在数学上对于两个圆形是否发生重叠,有计算两个圆心之间的距离的公式。那么条件就变为:计算两个圆心之间的距离是否小于两个圆的半径和。

假设圆形1的左上角坐标是(x1,y1),半径是r1,圆形2的左上角的坐标是(x2,y2),半径是r2。

因为MIDP1.0中没有浮点数,而且浮点数的运算比较慢,所以我们将条件做一个简单的变换:对于条件的两边都进行平方,这样就去掉了开方的运算步骤。

下面是数学表达式:

(x1 – x2)2 + (y1 – y2)2 < (r1 + r2)2

在程序中,只需要将上面的条件转换成代码就可以了。

上面介绍的只是最基本的碰撞检测算法的实现,而实际的编程过程中遇到的碰撞检测问题要比这些复杂很多,还需要其他形式的检测,还需要进行更加深入的学习。

ETS named_table

new(Name, Options) -> tid() | atom()

  • Name = atom()
  • Options = [Option]
  •  Option = Type | Access | named_table | {keypos,Pos} | {heir,pid(),HeirData} | {heir,none} | {write_concurrency,bool()}
  •   Type = set | ordered_set | bag | duplicate_bag
  •   Access = public | protected | private
  •   Pos = int()
  •   HeirData = term()
Creates a new table and returns a table identifier which can be used in subsequent operations. The table identifier can be sent to other processes so that a table can be shared between different processes within a node.
The parameter Options is a list of atoms which specifies table type, access rights, key position and if the table is named or not. If one or more options are left out, the default values are used. This means that not specifying any options ([]) is the same as specifying [set,protected,{keypos,1},{heir,none},{write_concurrency,false}].
  • set The table is a set table – one key, one object, no order among objects. This is the default table type.
  • ordered_set The table is a ordered_set table – one key, one object, ordered in Erlang term order, which is the order implied by the < and > operators. Tables of this type have a somewhat different behavior in some situations than tables of the other types. Most notably the ordered_set tables regard keys as equal when they compare equal, not only when they match. This means that to an ordered_set, the integer()1 and the float()1.0 are regarded as equal. This also means that the key used to lookup an element not necessarily matches the key in the elements returned, if float()‘s and integer()‘s are mixed in keys of a table.
  • bag The table is a bag table which can have many objects, but only one instance of each object, per key.
  • duplicate_bag The table is a duplicate_bag table which can have many objects, including multiple copies of the same object, per key.
  • public Any process may read or write to the table.
  • protected The owner process can read and write to the table. Other processes can only read the table. This is the default setting for the access rights.
  • private Only the owner process can read or write to the table.
  • named_table If this option is present, the name Name is associated with the table identifier. The name can then be used instead of the table identifier in subsequent operations.
  • {keypos,Pos} Specfies which element in the stored tuples should be used as key. By default, it is the first element, i.e. Pos=1. However, this is not always appropriate. In particular, we do not want the first element to be the key if we want to store Erlang records in a table.
    Note that any tuple stored in the table must have at least Pos number of elements.
  • {heir,Pid,HeirData} | {heir,none}
    Set a process as heir. The heir will inherit the table if the owner terminates. The message {'ETS-TRANSFER',tid(),FromPid,HeirData} will be sent to the heir when that happens. The heir must be a local process. Default heir is none, which will destroy the table when the owner terminates.
  • {write_concurrency,bool()} Performance tuning. Default is false, which means that the table is optimized towards concurrent read access. An operation that mutates (writes to) the table will obtain exclusive access, blocking any concurrent access of the same table until finished. If set to true, the table is optimized towards concurrent write access. Different objects of the same table can be mutated (and read) by concurrent processes. This is achieved to some degree at the expense of single access and concurrent reader performance. Note that this option does not change any guarantees about atomicy and isolation. Functions that makes such promises over several objects (like insert/2) will gain less (or nothing) from this option.
    Table type ordered_set is not affected by this option in current implementation.

xmerl_scan


xmerl_scan

模块 MODULE
xmerl_scan
 
模块摘要 MODULE SUMMARY
This module is the interface to the XML parser, it handles XML 1.0.
 
描述 DESCRIPTION
This module is the interface to the XML parser, it handles XML 1.0. The XML parser is activated through xmerl_scan:string/[1,2] or xmerl_scan:file/[1,2]. It returns records of the type defined in xmerl.hrl. 参考:tutorial on customization functions.

数据类型 DATA TYPES

global_state()
The global state of the scanner, represented by the #xmerl_scanner{} record.
option_list()
Options allow to customize the behaviour of the scanner. 参考:tutorial on customization functions.
Possible options are:

{acc_fun, Fun}
Call back function to accumulate contents of entity.
{continuation_fun, Fun} | {continuation_fun, Fun, ContinuationState}
Call back function to decide what to do if the scanner runs into EOF before the document is complete.
{event_fun, Fun} | {event_fun, Fun, EventState}
Call back function to handle scanner events.
{fetch_fun, Fun} | {fetch_fun, Fun, FetchState}
Call back function to fetch an external resource.
{hook_fun, Fun} | {hook_fun, Fun, HookState}
Call back function to process the document entities once identified.
{close_fun, Fun}
Called when document has been completely parsed.
{rules, ReadFun, WriteFun, RulesState} | {rules, Rules}
Handles storing of scanner information when parsing.
{user_state, UserState}
Global state variable accessible from all customization functions
{fetch_path, PathList}
PathList is a list of directories to search when fetching files. If the file in question is not in the fetch_path, the URI will be used as a file name.
{space, Flag}
‘preserve’ (default) to preserve spaces, ‘normalize’ to accumulate consecutive whitespace and replace it with one space.
{line, Line}
To specify starting line for scanning in document which contains fragments of XML.
{namespace_conformant, Flag}
Controls whether to behave as a namespace conformant XML parser, ‘false’ (default) to not otherwise ‘true’.
{validation, Flag}
Controls whether to process as a validating XML parser: ‘off’ (default) no validation, or validation ‘dtd’ by DTD or ‘schema’ by XML Schema. ‘false’ and ‘true’ options are obsolete (i.e. they may be removed in a future release), if used ‘false’ equals ‘off’ and ‘true’ equals ‘dtd’.
{schemaLocation, [{Namespace,Link}|…]}
Tells explicitly which XML Schema documents to use to validate the XML document. Used together with the {validation,schema} option.
{quiet, Flag}
Set to ‘true’ if xmerl should behave quietly and not output any information to standard output (default ‘false’).
{doctype_DTD, DTD}
Allows to specify DTD name when it isn’t available in the XML document. This option has effect only together with {validation,’dtd’ option.
{xmlbase, Dir}
XML Base directory. If using string/1 default is current directory. If using file/1 default is directory of given file.
{encoding, Enc}
Set default character set used (default UTF-8). This character set is used only if not explicitly given by the XML declaration.

导出函数 EXPORTS

Function to accumulate and normalize whitespace.
 
For controlling the ContinuationState, to be used in a continuation function, and called when the parser encounters the end of the byte stream. 查看 tutorial on customization functions.
 
Equivalent to event_state(EventState, S).
 
For controlling the EventState, to be used in an event function, and called at the beginning and at the end of a parsed entity. 查看 tutorial on customization functions.
 
Equivalent to fetch_state(FetchState, S).
 
For controlling the FetchState, to be used in a fetch function, and called when the parser fetch an external resource (eg. a DTD). 查看 tutorial on customization functions.
 
类型说明:
Rest = list()
Equivalent to file(Filename, []).
类型说明:
Rest = list()
Parse file containing an XML document
 
Equivalent to hook_state(HookState, S).
 
For controlling the HookState, to be used in a hook function, and called when the parser has parsed a complete entity. 查看 tutorial on customization functions.
 
Equivalent to rules_state(RulesState, S).
 
For controlling the RulesState, to be used in a rules function, and called when the parser store scanner information in a rules database. 查看 tutorial on customization functions.
 
类型说明:
Rest = list()
Equivalent to string(Test, []).
 
类型说明:
Rest = list()
Parse string containing an XML document
 
Equivalent to user_state(UserState, S).
 
For controlling the UserState, to be used in a user function. 查看 tutorial on customization functions.

MySQL分钟数据类型的区别

char、varchar、text、ntext、 bigint、int、smallint、tinyint和bit的区别及数据库的数据类型

Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节
char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。
由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处 理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!
ntext
可变长度 Unicode 数据的最大长度为 230 – 1 (1,073,741,823) 个字符。存储大小是所输入字符个数的两倍(以字节为单位)。ntext 在 SQL-92 中的同义词是 national text。
text
服务器代码页中的可变长度非 Unicode 数据的最大长度为 231-1 (2,147,483,647) 个字符。当服务器代码页使用双字节字符时,存储量仍是 2,147,483,647 字节。存储大小可能小于 2,147,483,647 字节(取决于字符串)。
bigint:从-2^63(-9223372036854775808)到 2^63-1(9223372036854775807)的整型数据,存储大小为 8 个字节。
int:从 -2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据,存储大小为 4 个字节。
smallint:从 -2^15(-32,768)到2^15-1(32,767)的整数数据,存储大小为 2 个字节。
tinyint:从0到255的整数数据,存储大 小为 1 字节。
bit:1或0的整数数据,存储大小为 1 字节。

Unicode 数据
在 Microsoft&reg; SQL Server&#8482; 2000 中,传统上非 Unicode 数据类型允许使用由特定字符集定义的字符。字符集是在安装 SQL Server 时选择的,不能更改。使用 Unicode 数据类型,列可存储由 Unicode 标准定义的任何字符,包含由不同字符集定义的所有字符。Unicode 数据类型需要相当于非 Unicode 数据类型两倍的存储空间。
Unicode 数据使用 SQL Server 中的 nchar、varchar 和 ntext 数据类型进行存储。对于存储来源于多种字符集的字符的列,可采用这些数据类型。当列中各项所包含的 Unicode 字符数不同时(至多为 4000),使用 nvarchar 类型。当列中各项为同一固定长度时(至多为 4000 个 Unicode 字符),使用 nchar 类型。当列中任意项超过 4000 个 Unicode字符时,使用 ntext 类型。
说明    SQL Server 的 Unicode 数据类型是基于 SQL-92 标准中的国家字符数据类型。SQL-92 使用前缀字符 n 标识这些数据类型及其值。

1.数据类型
数据类弄是数据的一种属 性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多 或少有些不同。SQL Server 提供了 25 种数据类型:
·Binary [(N)]
·Varbinary [(N)]
·Char [(N)]
·Varchar[(N)]
·Nchar[(N)]
·Nvarchar[(N)]
·Datetime
·Smalldatetime
·Decimal[(p[,s])]
·Numeric[(p[,s])]
·Float[(N)]
·Real
·Int
·Smallint
·Tinyint
·Money
·Smallmoney
·Bit
·Cursor
·Sysname
·Timestamp
·Uniqueidentifier
·Text
·Image
·Ntext

(1)二进制数据类型
二进制数据包括 Binary、Varbinary 和 Image.
Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。
Binary[(N)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。
       Varbinary[(N)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是 n 个字节。
      在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用 BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。

(2) 字符数据类型
         字符数据的类型包括 Char,Varchar 和 Text。
         字符数据是由任何字母、符号和数字任意组合而成的数据。
       Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text 数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在 SQL Server 中。

(3)Unicode 数据类型
        Unicode 数据类型包括 Nchar,Nvarchar 和Ntext。
在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server 安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode 数据类型,所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。
在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用 Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储 4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。

(4)日期和时间数据类型
        日期和时间数据类型包括 Datetime 和 Smalldatetime 两种类型。
日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包 括"4/01/98 12:15:00:00:00 PM"和"1:28:29:15:01 AM 8/17/98"。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server 中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到 9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900 年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。
日期的格式可以设定。设置 日期格式的命令如下:
Set DateFormat {format | @format _var|
其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为 MDY。
例 如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为 日 月有年 形式

(5)数字数据类型
       数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数 。
整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是 Int,Smallint 和 Tinyint。Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于 Tinyint 数据类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求 4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用 Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。
精确小娄数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。
在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一 样。
(6)货币数据表示正的或者负的货币数量 。
        在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney。Money 数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。

(7)特殊数据类型
        特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即 Timestamp、Bit 和 Uniqueidentifier。
       Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。
Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。