gamemaker函数中文帮助 .doc

gamemaker函数中文帮助 .doc
gamemaker函数中文帮助 .doc

常数

true等同于1.

false等同于 0.

pi等同于 3.1415...

实数函数

random(x)返回一个随机的实数,范围从 0 到 x 。数值总小于 x 。

choose(val1,val2,val3,...)随机返回其中一个参数。最多可以有16个参数。

abs(x)返回 x 的绝对值。

sign(x)返回 x 的符号(-1,0,或1)。

round(x)返回与 x 最接近的整数。

floor(x)返回比 x 小的最大整数。

ceil(x)返回比 x 大的最小整数。

frac(x)返回 x 的小数点以后的部分。

sqrt(x)返回 x 的开方。 x 不能是负数。

sqr(x)返回 x 的平方。

power(x,n)返回 x 的 n 次方。

exp(x)返回 x 的冥方指数 e 。

ln(x)返回 x 的自然对数。

log2(x)返回 x 的2的对数。

log10(x)返回 x 的10的对数。

logn(n,x)返回 x 的 n 的对数。

sin(x)返回 x 的正弦(x 单位为弧度)。

cos(x)返回 x 的余弦(x 单位为弧度)。

tan(x)返回 x 的正切(x 单位为弧度)。

arcsin(x)返回 x 的反正弦。

arccos(x)返回 x 的反余弦。

arctan(x)返回 x 的反正切。

arctan2(y,x)计算 arctan( y / x ) ,然后返回结果在正确象限内的角度值。

degtorad(x)转换角度到弧度。

radtodeg(x)转换弧度到角度。

min(val1,val2,val3,...)返回参数中的最小值。最高支持16个参数。必须全部是实数或全部是字符串。

max(val1,val2,val3,...)返回参数中的最大值。最高支持16个参数。必须全部是实数或全部是字符串。

mean(val1,val2,val3,...)返回所有参数的平均值。最高支持16个参数。必须全部是实数数值。

median(val1,val2,val3,...)返回参数的中间数(如果参数数目为偶数,则两个中间数中最小的那个作为返回值)。最高支持16个参数。必须全部是实数数值

point_distance(x1,y1,x2,y2)返回位置1(x1,y1)到位置2(x2,y2)的距离。

point_direction(x1,y1,x2,y2)返回从位置1(x1,y1)到位置2(x2,y2)的方向角度。lengthdir_x(len,dir)返回指定长度及方向的矢量线在 x 轴上的投影长度。

lengthdir_y(len,dir)返回指定长度及方向的矢量线在 y 轴上的投影长度。

is_real(x)返回 x 是否为真实数值(否则就是字符串)。

is_string(x)返回 x 是否是一个字符串(否则就是一个真实数值)。

字符串处理函数

chr(val)返回字符串中包含参数指定的 ASCII码字符的字符串。

ord(str)返回字符串中第一个字符的 ASCII 码。

real(str)将字符串转换为真实数值。字符串可包含负号,小数点甚至是指数部分。string(val)将真实数值转换为标准格式的字符串(整数时没有小数点位置,否则在小数点后留两位)。

string_format(val,tot,dec)将 val 以你自己的格式转换为字符串:tot 指定总的数字位置,dec 指定小数点后有几位数字。

string_length(str)返回字符串中字符的个数。

string_pos(substr,str)返回字符串 substr 在字符串 str 中的位置(0 代表完全不符)。

string_copy(str,index,count)返回字符串 str 的一部分,从 index 指定的位置开始,长度为 count 。

string_char_at(str,index)返回字符串 str 中索引为 index 的字符。

string_delete(str,index,count)返回删除了部分内容的字符串 str,从 index 开始,长度为 count 。

string_insert(substr,str,index)返回在位置 index 处添加子串 substr 后的字符串str。

string_replace(str,substr,newstr)返回字符串 str 的一份拷贝,为字符串中子串substr 第一次出现的地方开始被字符串 newstr 替换后的内容。

string_replace_all(str,substr,newstr)返回字符串 str 的一份拷贝,为字符串中子串 substr 所有出现的地方开始被字符串 newstr 替换后的内容。

string_count(substr,str)返回子串 substr 在字符串 str中出现的次数。

string_lower(str)返回小写格式的字符串 str。

string_upper(str)返回大写格式的字符串 str。

string_repeat(str,count)返回由 count 个字符串 str 组成的新字符串 str。

string_letters(str)返回只包含字母的字符串 str。

string_digits(str)返回只包含数字的字符串 str。

string_lettersdigits(str)返回包含字母和数字的字符串 str。

以下为处理系统粘贴板内容的相关函数。

clipboard_has_text()返回粘贴板中是否存在任何文本。

clipboard_get_text()返回当前粘贴板内文本内容。

clipboard_set_text(str)将字符串 str 送入粘贴板。

日期及时间处理

在Game Maker中有许多函数是专门处理日期和时间的。一个日期-时间格式是一组实数。整数部分代表日期,最早到12/30/1899。小数点后的部分代表一天之中的24小时。现有有以下函数 :

date_current_datetime()返回当前系统日期-时间。

date_current_date()返回当前系统日期(不包括时间)。

date_current_time()返回当前系统时间(不包括日期)。

date_create_datetime(year,month,day,hour,minute,second)建立一个指定的日期-时间数据。

date_create_date(year,month,day)建立一个指定的日期数据。

date_create_time(hour,minute,second)建立一个指定的时间数据。

date_valid_datetime(year,month,day,hour,minute,second)返回给定的日期-时间是否正确。

date_valid_date(year,month,day)返回给定的日期是否正确。

date_valid_time(hour,minute,second)返回给定的时间是否正确。

date_inc_year(date,amount)返回指定日期后 amount 年的新日期。amount 必须为整数date_inc_month(date,amount)返回指定日期后 amount 月的新日期。amount 必须为整数。

date_inc_week(date,amount)返回指定日期后 amount 星期的新日期。amount 必须为整数

date_inc_day(date,amount)返回指定日期后 amount 天的新日期。amount 必须为整数。date_inc_hour(date,amount)返回指定日期后 amount 小时的新日期。amount 必须为整数。

date_inc_minute(date,amount)返回指定日期后 amount 分钟的新日期。 amount 必须为整数。

date_inc_second(date,amount)返回指定日期后 amount 秒的新日期。amount 必须为整数。

date_get_year(date)返回 date 对应的年份。

date_get_month(date)返回 date 对应的月份。

date_get_week(date)返回 date 对应的星期。

date_get_day(date)返回 date 对应的天数。

date_get_hour(date)返回 date 对应的小时。

date_get_minute(date)返回 date 对应的分钟。

date_get_second(date)返回 date 对应的秒。

date_get_weekday(date)返回 date 对应一星期的哪一天。

date_get_day_of_year(date)返回 date 对应一年中的哪一天。

date_get_hour_of_year(date)返回 date 对应一年中的哪一小时。

date_get_minute_of_year(date)返回 date 对应一年中的哪一分钟。

date_get_second_of_year(date)返回 date 对应一年中的哪一秒。

date_year_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少年。此函数只报告年数片断。

date_month_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少月。此函数只报告月份片断。

date_week_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少星期。此函数只报告星期片断。

date_day_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少天。此函数只报告天数片断。

date_hour_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少小时。此函数只报告小时片断。

date_minute_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少分钟。此函数只报告分钟片断。

date_second_span(date1,date2)返回两个日期 date1 和 date2 之间相隔多少秒。此函数只报告秒数片断。

date_compare_datetime(date1,date2)比较两个日期时间的大小,返回-1,0,1,分别代表前者小于,等于,大于后者。

date_compare_date(date1,date2)比较两个日期的大小,返回-1,0,1,分别代表前者小于,等于,大于后者。

date_compare_time(date1,date2)比较两个时间的大小,返回-1,0,1,分别代表前者小于,等于,大于后者。

date_date_of(date)返回指定日期-时间数据的日期部分,时间部分设定成0。

date_time_of(date)返回指定日期-时间数据的时间部分,日期部分设定成0。

date_datetime_string(date)按照给定的数据,返回系统默认的字符串格式日期-时间。date_date_string(date)按照给定的数据,返回系统默认的字符串格式日期。

date_time_string(date)按照给定的数据,返回系统默认的字符串格式时间。

date_days_in_month(date)返回指定日期-时间所在月份的天数。

date_days_in_year(date)返回指定日期-时间所在年份的天数。

date_leap_year(date)返回指定日期-时间所在年份是否为闰年。

date_is_today(date)返回指定日期-时间是否为今天。

移动

很明显,游戏的一个重要方面就是对象实例的四处移动。每个实例拥有两个内建的变量 x 和y 用来指出实例的位置。(更精确的说,它们显示的位置是精灵原点摆放的位置。)( 0 ,0 )的位置在房间的最左上角。你可以通过改变实例 x 和 y 变量的值来改变实例的位置。你如果想要对象进行复杂运动,这是个可行的方法。把有关的代码放在对象的并行( step )事件里。

如果对象以固定方向及恒速移动,实现起来就很简单。每个对象实例都有一个水平速度( hspeed )和一个垂直速度( vspeed )。两个速度都是以像素每步( pixels per step )为单位。一个正的水平速度就是向右的运动,负的水平速度意味着向左的运动。正的垂直速度是向下,负的垂直速度是向上。所以你必须给这些变量初始化(比如在创建事件里)使对象实例有一个恒速。

自定义运动的方法和之前不同,使用了方向( direction )( 0-359 度),和速度( speed )(必须是非负数)。你可以设定并读取这些变量来自定义一个任意运动。(内部处理实际上是把值转换成 hspeed 和 vspeed 。)当然还有阻力( friction )和重力( gravity )和重力方向( gravity dirction )供你使用。最后要说的是函数 motion_add(dir,speed) 用来给现有对象增加速度。

完整来说,每个实例由以下变量和函数来处理它们的位置和运动 :

x对象的 x 坐标 .

y对象的 y 坐标 .

xprevious对象以前的 x 坐标 .

yprevious对象以前的 y 坐标 .

xstart对象在房间里的初始 x 坐标 .

ystart对象在房间里的初始 y 坐标 .

hspeed速度的水平部分,即水平速度 .

vspeed速度的垂直部分,即垂直速度 .

direction对象当前方向( 0-360 度,逆时针, 0 = 朝右) .

speed对象当前速度(像素每步) .

friction当前阻力(像素每步) .

gravity当前重力(像素每步) .

gravity_direction重力方向( 270 朝下) .

motion_set(dir,speed)以参数(方向,速度)设定运动 .

motion_add(dir,speed)以参数(方向,速度)对当前运动做改变 .

这儿有大量可利用的函数帮助你定义你的运动 :

place_free(x,y)返回实例在( x , y )位置是否与固体实例碰撞的值。这个函数用来在实际移动到新位置前检测。

place_empty(x,y)返回实例在( x , y )位置是否与任何东西碰撞的值。所以这个函数还把非固体实例加入计算范围。

place_meeting(x,y,obj)返回实例在( x , y )位置是否与对象( obj )碰撞的值。与 obj 对象的实例遇到时,函数返回真( true )。也可以用实例名做 obj 参数,实例名都意味着是对象的一个实例。

place_snapped(hsnap,vsnap)返回实例是否与网格对齐的值。 //hsnap 水平网格, vsnap 垂直网格

move_random(hsnap,vsnap)移动实例到一个随机空闲并且是网格的位置,和其对应的动作效果一样。

move_snap(hsnap,vsnap)将实例对齐网格,和其对应的动作效果一样。

move_wrap(hor,vert,margin)离开房间到另一边时卷动实例。参数 hor 为是否水平卷动( 1 或 0 )参数 vert 为是否垂直卷动( 1 或 0 )。参数 margin 为卷动前离原点多远时实例必须离开房间。等于围绕房间的一圈留白。这个函数在离开事件( outside event )中使用非常具有代表性。

move_towards_point(x,y,sp)以速度( sp )朝( x , y )位置移动实例。

move_bounce_solid(adv)遇到固体实例反弹,和其对应的动作效果一样。参数 adv ( 1 或0 )为是否使用高级反弹,高级反弹将倾斜面加入计算范围。

move_bounce_all(adv)遇到所有实例反弹,不单单对固体反弹。

move_contact_solid(dir,maxdist)朝某方向移动实例直到接触固体对象。如果在当前位置没有碰撞,实例在碰撞发生前将不停的移动。如果当前位置已经发生碰撞了,实例就不再移动。你可以指定移动的最大速(距离未定时可以使用负数) //dir 设定方向, maxdist 设定速度

move_contact_all(dir,maxdist)和上一个函数类似,不过这次接触到任何对象时都会停止,不单是固体对象。

move_outside_solid(dir,maxdist)朝某方向移动实例直到离开固体对象。如果在当前位

置没有碰撞,实例不移动。你可以指定移动的最大速(距离未定时可以使用负数) // 用于分开重叠的实例

move_outside_all(dir,maxdist)和上一个函数类似,不过这次是离开任何对象时都会停止,不单是固体对象。

distance_to_point(x,y)返回当前实例的碰撞盒离( x , y )的距离。

distance_to_object(obj)返回实例离最近的对象( obj )的距离。

position_empty(x,y)返回在( x , y )位置是否有任何实例的布尔值。

position_meeting(x,y,obj)返回( x , y )位置是否有实例 obj 的布尔值。参数 obj 可以是对象,实例名,或是其他关键字等等

路径

在 GameMaker 里你可以定义路径并且命令实例跟随路径。尽管你可以使用动作库,变量和函数可以使你更灵活的运用 :

path_start(path,speed,endaction,absolute)为当前实例开始一段路径。参数 path 是你想开始的路径名。参数 speed 是跟随路径的速度。负的 speed 意味着实例沿着路径往回移动。参数 edaction 是设定当实例到达路径的终点时发生的事件。有以下几个值可供使用 : 0: 停止路径

1: 从开始点继续(如果路径没有闭合,直接跳到开始点)

2: 从当前点继续

3: 反转路径,改变速度的符号

参数 absolute 应该是 true 或是 false ( 1 或 0 )。设为 true 时和路径是绝对的关系( absolute )。设为 false 时路径和实例的当前位置是相关的关系( relative )为了更精确地设定,如果 speed 是正的,当前位置就是路径的开始点,路径沿着当前位置而行。 speed 为负值时,当前位置就是路径的终点,路径沿着当前位置往后移动。

path_end()当前实例结束跟随路径。

path_index*当前实例跟随路径的索引。你不可以直接改变它,必须使用上面的函数。

path_position当前路径的位置。值为 0 时在路径的开始位置。值为 1 时在路径的结束位置。值必须在 0 到 1 之间。

path_positionprevious当前路径的前一个位置。可以使用碰撞事件( collision events )里的例子来设置在路径上位置使它回到前一个位置。

path_speed设置跟随路径的速度(像素每步)。负值时向后移动。

path_orientation路径处理时的方位(逆时针)设定。值 0 时为正常方向。

path_scale缩放路径。增加值使路径变大。 1 是默认值。

path_endaction路径结束时必须执行的行为。可以使用最上面的函数介绍的值。

运动设计

运动设计帮助你在避免与另一实例(比如:墙)碰撞的情况下将某实例从给定位置移动到另一位置。运动设计是一个有难度的项目。几乎不可能给出一些能够在任何情况下正常运作的普通函数。同时,计算碰撞运动非常耗费系统资源。所以使用这些函数时必须非常小心仔细。当你使用以下任一函数时请将这些建议记到心里。

Game Maker 提供了一些不同形式的运动计划。最简单的形式允许一个实例朝某特定目标方向步进,可能的话尽量走直线但是如果有要求的话可以取不同的方向。这些函数应当在实例的并行事件 (step event) 中使用。对应的运动计划动作库也是可用的 :

mp_linear_step(x,y,stepsize,checkall)这个函数作用为让实例朝指定位置( x , y )直线步进。每一步的大小由参数 stepsize 设置。如果实例已经到位,实例不再移动。如果参数 checkall 为 true ( 1 ),实例遇到任意对象的实例都不会停止。如果为 false ( 0 ),实例碰撞到另一固体实例时就会停止。注意这个函数遇到障碍时不会试着绕路。它只会简单的停止。函数返回值为是否到达目标位置。

mp_linear_step_object(x,y,stepsize,obj)除了参数 obj 实例为障碍,其他效果同上。参数 obj 可以是对象或是实例名。

mp_potential_step(x,y,stepsize,checkall)和先前的函数类似,这个函数也是让实例朝指定位置步进。不同处是这个函数会试着绕过障碍物。当实例快撞上某一固体实例(或任何实例, checkall 为 true 时)时,会改变运动方向来避开实例并且绕开它。这个方法不能保证有效,但是在大部分简单应用中会非常有效的让实例朝目标移动。函数返回值为是否到达目标位置。

mp_potential_step_object(x,y,stepsize,obj)除了参数 obj 实例为障碍物,其他效果同上。参数 obj 可以是对象或是实例名。

mp_potential_settings(maxrot,rotstep,ahead,onspot)先前的函数利用的一些参数可

以使用这个函数改变。以下方法都有全局性。首先试着朝目标直线移动。可以使用参数 ahead (默认值为 3 )设置前面有多少步。减少这个值意味着实例将在延后开始改变方向。增加这个值意味着提前开始改变方向。如果检测到将要碰撞,实例会开始朝向最佳方向,偏右或是偏左。根据参数 rotstep (默认值为 10 )的大小决定在多少步中改变朝向。减少 rotstep 的值会使得实例有更多移动的可能性但速度也会更慢。参数 maxrot 解释起来有一点难度。实例有一个当前方向。参数 maxrot (默认值为 30 )为在一步里面允许改变当前方向的最大值。所以说即使实例可以直线移动到目标,只要不超过改变方向的最大值,它就会这样执行。如果你把 maxrot 设得很大,实例就可以在每一步都改变很多方向。这样可以使它更简单的寻找一段短路径,但同时整个路径会变得非常丑陋(路线歪七歪八的…)。如果把值设得很小,路线就会很平滑但同时它可能会绕很远的路费很多时间(有时候甚至找不到到目标的路)。没有创建步时,实例的行为会建立在参数 onspot 上。如果 onspot 值为 true (或1 ,为默认值),实例会根据 maxrot 的大小在自己的位置上旋转。如果值为 false (或 0 )实例就不再移动。如果实例为车辆时,设为 false 比较好,但同时会减少寻路成功的机会。

请注意 potential 函数只能使用局部信息。所以它只能在局部信息足够确定正确的运动方向时寻路成功。举例来说,走出迷宫就找不到路了(大部分情况下)。

第二种类型函数为实例计算路径是否碰撞。一旦路径经过计算,你可以分配给实例让它朝目标移动。计算路径会花一些时间但接下来完成路径会非常快。当然只会在其间情况没有改变时才有效。举例来说,如果障碍物改变了,你可能需要重新计算路径。再次注意,这些函数可能不起作用

开始的两个函数使用了线形运动,潜在域方法照例是用在 step 函数里的。

mp_linear_path(path,xg,yg,stepsize,checkall)这个函数使用指定步大小计算实例从

当前位置到( xg , yg )的直线路径。使用步的方法和函数 mp_linear_step() 一样。指

定的路径必须已经存在并且会被新路径覆盖。(参考后面的章节怎样建立和销毁路径。)函数返回值为是否找到路径。函数在寻路失败前不会停止,开始和目标之间不存在直线路径为失败的情况。如果失败,路径仍然会被创建直到运行到实例到达封闭的位置。

mp_linear_path_object(path,xg,yg,stepsize,obj)除了参数 obj 实例为障碍物,其他效果同上。参数 obj 可以是对象或是实例名。

mp_potential_path(path,xg,yg,stepsize,factor,checkall)这个函数计算指定步大小

让实例绕过障碍从当前位置和方向到( xg , yg )的路线。函数使用了潜在域步骤,类似于函数 mp_potential_step() 当然参数可以用函数 mp_potential_settings() 来设置。指定的路径必须已经存在并且会被新路径覆盖。(参考后面的章节怎样建立和销毁路径。)函数返回值为是否找到路径。为了避免函数不停的计算下去,你需要给出一个大于 1 的参数factor 。如果找不到比开始和目标之间的距离更短的路径,函数就会停止并报错。参数factor 为 4 是正常够用的值了,但是如果想绕远点的话可能需要加大数值。如果失败,路径仍然会被创建并且在目标方向运行,但是到达不了目标

mp_potential_path_object(path,xg,yg,stepsize,factor,obj)除了参数 obj 实例为障碍物,其他效果同上。参数 obj 可以是对象或是实例名

另一些函数使用了更复杂的机构使用了一种基于网格的方法(有时候称它为 A* 算法)。寻路更容易成功(尽管还是有失败的可能)并且路线更短,缺点是需要很多操作。以下都是全局概念。首先我们在房间内放入一网格(相应的部分)。你可以选择精致的网格(较慢)或是粗糙的网格。接下来,我们要探测所有的相关对象与网格单元交叠的地方(不管是碰撞盒或是精确检测)并且对这些单元作禁止的标记。即使只是和障碍物部分交叠,单元会全部被标记为禁止通行。最后我们指定一个开始和一个目标位置(必须放在空白单元上),函数就会计算他们之间的最短路径(实际上是最接近最短路径)。路径会在中间空白的单元上行进。所以如果单元足够大到能在中心完全放下实例,函数就会成功。接下来你可以把这个路径给一个实例。

基于网格的方法十分强大(在很多专业游戏中使用)但是要求你仔细的考虑如何使用。你必须决定哪个区域以及单元大小比较合适。同样必须决定哪个对象必须避开并且决定精确检测是否必要。所有这些参数都强烈影响到寻路的效果。

特别需要注意,单元的大小十分重要。要记住单元必须要足够的大,大到能将移动的对象完全放入单元的中心。(注意对象原点的位置。同样要了解如果对象的原点不在它的中心,你就可以移动路径)另一方面,单元越小路径越容易存在。如果单元和障碍物之间的开口太大路径会闭合,因为所有的单元都和一个障碍物交叠。

基于网格方法的实际函数如下 :

mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight)这个函数建立网格。返回一个索引用于其它函数调用。你可以在同一瞬间创建并维持多重网格结构。参数 left 和 top 指定网格左上角的位置。参数 hcells 和 vcells 设置水平和垂直单元的数量。参数 cellwidth 和 cellheight 是单元的大小。

mp_grid_destroy(id)销毁指定网格结构并释放空间。如果不再用到结构时记得调用这个函数。

mp_grid_clear_all(id)将网格中的所有单元都标记为空。

mp_grid_clear_cell(id,h,v)清除指定单元。单元 0 , 0 在最左上角。

mp_grid_clear_rectangle(id,left,top,right,bottom)清除和指定矩形交叉的所有的单元(在相应的房间里)。

mp_grid_add_cell(id,h,v)标记指定的单元为禁止通行。单元 0 , 0 在最左上角。

mp_grid_add_rectangle(id,left,top,right,bottom)标记和指定矩形交叉的所有的单元为禁止通行。

mp_grid_add_instances(id,obj,prec)标记所有与指定对象的实例交叉的单元为禁止通行。你可以通过参数 obj ,实例的 id 名来使用一个单独的实例。同样也可以使用关键字all 表示所以对象的所有实例。参数 prec 为是否使用精确检测(只有当实例使用的精灵打开精确检测时才有效)。

mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag)计算一条通过网格的路径。参数 path 必须指定一条已经存在的路径用来被电脑路径替代。参数 xstart 和 ystart 为路径的开始点, xgoal 和 ygoal 为目标点。参数 allowdiag 为是否允许使用斜角移动替代水平和垂直移动。函数返回值为是否寻路成功。(注意路径不受当前实例影响;是一条穿越网格的路径,不是某特殊实例的路径)

mp_grid_draw(id)这个函数将空的单元绘成绿色,禁止通行的单元绘成红色。这个函数运行起来很慢这是用来做 debug 工具。

碰撞检测

计划运动或是要决定具体行动时,察看实例是否与其它对象在确定的地点碰撞是一件十分重要的事。为此需要用到下面的程序。所有的这些函数有三个共有参数:参数 obj 是某对象,关键字all ,或是某实例的 id 名。参数 prec 是是否启用精确检测或是仅仅使用实例的碰撞盒。精确检测只有当实例的精灵设定了精确碰撞检测时才有效。参数 notme 可以设为true ( 1 ),使调用的实例不会被检测。所有的这些函数返回值为被碰撞实例的 id 名,如果没有碰撞就返回一个负值。

collision_point(x,y,obj,prec,notme)这个函数测试在( x , y )位置是否和实体对象 obj 有碰撞。

collision_rectangle(x1,y1,x2,y2,obj,prec,notme)这个函数测试指定对角的矩形(已填充)是否和实体对象 obj 有碰撞。举例来说,你可以使用这个函数测试某个区域里是否没有障碍物。

collision_circle(xc,yc,radius,obj,prec,notme)这个函数测试指定圆心( xc , yc )的圆(已填充)是否和实体对象 obj 有碰撞。举例来说,你可以使用这个函数测试某对象是否靠近某特点位置。

collision_ellipse(x1,y1,x2,y2,obj,prec,notme)这个函数测试指定对角的椭圆(已填充)是否和实体对象 obj 有碰撞。

collision_line(x1,y1,x2,y2,obj,prec,notme)这个函数测试线段( x1 , y1 )到

(x2,y2) 是否和实体对象 obj 有碰撞。这是个强大的函数。你可以这样使用这个函数,通过检测线段是否与他们之间的墙相交来测试某实例是否可以看到另一实例。

实例

游戏中,最基本的单位就是各种不同对象的实例。游戏进行时可以替换许多实例的外貌。同样你也可以通过创建新实例并摧毁实例达到替换的效果。除了先前讨论的运动相关变量和下面将要讨论的绘制相关变量,每个实例都有如下一些变量 :

object_index*对象的索引。这个变量不可以改变。

id*实例的统一标识符( >= 100000 )。(注意,定义房间时,鼠标指定的实例 id 名总会显示出来。)

mask_index遮照精灵的索引,用来碰撞检测。值为 -1 时效果和 sprite_index 一样。solid实例是否为固体。可以在游戏进行中改变。

persistent实例是否持久显示并且移动到另一房间时再现。某些时候经常需要把持久的效果关掉。(举例来说,要回到第一个房间的时候)

处理实例时有个问题。分辨单个的实例不是很容易。他们没有名字。只有某特点对象的某个实例时你可以使用对象名,否则需要实例的 id 名。实例有一个统一的标识符。你可以在with 语句中当做对象标识符使用。幸运的是有大量的变量及程序帮助你定位实例 id 名。

instance_count*房间中现存实例的数量。

instance_id[0..n-1]*特定实例的 id 名。这里的 n 为实例的编号。

注意,实例对实例 id 名的分配每一步都改变,所以你不能使用上一步的值。我来举个例子。设想你游戏中的每个单位都有特别有力量,你想找到最强壮的那个,可以使用以下代码 :

{

maxid = -1;

maxpower = 0;

for (i=0; i

{

iii = instance_id[i];

if (iii.object_index == unit)

{

if (iii.power > maxpower)

{maxid = iii; maxpower = iii.power;}

}

}

}

做完循环, maxid 就是那个最强的单位了。(循环时不要销毁实例,因为他们会自动从数组中移除)

instance_find(obj,n)返回值为参数 obj 的第 (n+1) 个实例 id 名。参数 obj 可以是某对象或是关键字all 。如果不存在,返回特殊对象 noone 。注意,实例对实例 id 名的分配每一步都改变,所以你不能使用上一步的值。

instance_exists(obj)返回值为 obj 的实例是否存在。参数 obj 可以是某对象,实例 id 名或是关键字all 。

instance_number(obj)返回 obj 实例的编号。参数 obj 可以是某对象或是关键字all 。instance_position(x,y,obj)返回值为 obj 在( x , y )位置上实例的 id 名。同一位置有多个实例时,返回第一个实例。参数 obj 可以是某对象或是关键字all 。如果不存在,返回特殊对象 noone 。

instance_nearest(x,y,obj)返回值为最接近( x , y )位置的 obj 的实例 id 名。参

数 obj 可以是某对象或是关键字all 。

instance_furthest(x,y,obj)返回值为离( x , y )位置最远的 obj 的实例 id 名。参数 obj 可以是某对象或是关键字all 。

instance_place(x,y,obj)返回值为遇到当前( x , y )位置上实例的 obj 的实例 id 名。参数 obj 可以是某对象或是关键字all 。如果不存在,返回特殊对象 noone 。

下面的函数用于创建销毁实例。

instance_create(x,y,obj)在( x , y )位置创建 obj 的实例。函数返回新实例的 id 名。

instance_copy(performevent)创建当前实例的复制品。参数 performevent 为复制品的创建事件( creation event )是否必须执行。函数返回新复制品的 id 名。

instance_destroy()销毁当前实例。

instance_change(obj,perf)改变 obj 的实例。参数 perf 为是否执行销毁和创建事件( destroy and creation events )。

position_destroy(x,y)销毁所有包含( x , y )位置精灵的实例。

position_change(x,y,obj,perf)在( x , y )位置改变所有 obj 的实例。参数 perf 为是否执行销毁和创建事件( destroy and creation events )。

解散实例

当你创建大房间时,比如在平台游戏中,在一个小视野里,很多实例在视野的外面。这些实例仍然是激活状态并且会执行他们的事件。同样,计算碰撞检测时这些实例也会加入计算。这样会浪费大量的时间,通常也没有必要。(举例来说,视野外的实例移动一点都不重要。)为了解决这个问题,Game Maker 内含了一些函数来解散和激活实例。使用前你必须清楚地明白他们是怎样运作的。

解散实例时,它们会被判断为从游戏中移除。他们不再可见也不会执行任何事件。所以对大部分动作库和函数来说,它们不再存在。这样节省了大量的时间,但使用时要非常小心。举例来说,当你删除了某特别类型的所有实例,已解散实例没有被删除(因为它们不存在)。所以不要认为一串角色捡到的钥匙可以用来打开一个已解散的门。

最容易犯的错误是解除了一个激活的实例。为了避免下面的一些程序,要求你强调被调用的实例不会解除它本身

这儿有些可用的程序 :

instance_deactivate_all(notme)解除房间内的所有实例。如果参数 notme 为 true ( 1 )正在调用的实例不会解除(通常是你想要的效果)。

instance_deactivate_object(obj)解除房间内的所有 obj 的实例。你也可以参数 obj 改为all 来使所有的实例解除或者指定实例 id 名解除一单个的实例。

instance_deactivate_region(left,top,width,height,inside,notme)解除指定区域内

的所有实例(那些碰撞盒部分在区域内的也算)。如果参数 inside 为 false ( 0 ),完全露在区域外的实例会被解除。如果参数 notme 为 true ( 1 )正在调用的实例不会解除(通常是你想要的效果)。

instance_activate_all()激活房间内的所有实例。

instance_activate_object(obj)激活房间内的所有 obj 的实例。你也可以参数 obj 改为all 来使所有的实例激活或者指定实例 id 名激活一单个的实例。

instance_activate_region(left,top,width,height,inside)激活指定区域内的所有实例。如果参数 inside 为 false ( 0 ),完全露在区域外的实例会被激活。

举例来说,视野外的实例都解除,视野内的实例全激活,你可以将下面的代码放到移动角色的并行事件中( step event ) r:

{

instance_activate_all();

instance_deactivate_region(view_xview[0],view_yview[0],

view_wview[0],view_hview[0],false,true);

}

特别注意,你可能需要让区域比视野稍微大一些。

定时

一个好的游戏要求精确的时间控制。幸运的是Game Maker 有许多时间方面的函数。使事物恒速( rate )发生。这个速度( rate )在定义房间的时候设置。你可以用全局变量room_speed 来改变它。举例来说,通过每一步对 room_speed 增加一个很小的量(比如0.001 ),你可以缓慢增加游戏的速度,使它难度更高。如果你的电脑很慢,游戏速度可能不能达到。可以使用变量 fps 来不断监测实际每秒的帧数。最后,一些高级定时使用时可以用变量 current_time ,电脑开始时的毫秒数。这儿是所有可用的变量(只有第一个可以改变) :

room_speed当前房间的游戏速度(单位为步每秒)。

fps*实际每秒的帧数。

current_time*系统开始时经过的毫秒数。

current_year*当前年。

current_month*当前月。

current_day*当前日。

current_weekday*当前星期几( 1 为星期日,…,7 为星期六)。

current_hour*当前小时。

current_minute*当前分钟。

current_second*当前秒。

有时候你需要将游戏停止一小会儿。使用 sleep 函数。

sleep(numb)睡眠( numb )毫秒。

如你所知,每个实例有 12 个不同的定时器可以设置。使用下面的变量改变(或获取)不同定时器的值 :

alarm[0..11]指定定时器的值。(注意只有在对象的定时器事件包含动作时,定时器才会更新!)

复杂的时间问题可以使用时间轴资源。每个实例都有一个时间轴资源关联。下面的函数是处理时间轴的 :

timeline_index实例关联时间轴的索引。可以设定为一个特定的时间线然后使用它。设为-1 时停止使用时间轴。

timeline_position当前时间轴位置。可以改变它的值来跳过部分内容或是重复部分内容。timeline_speed一般来说,时间轴上的位置每步都增加1。可以改变为不同的值。你可以用一个实数比如0.5。如果值比1大,同样的时间步内会发生更多的事件。他们会根据正确的命令允许,所以不会跳过任何动作。

房间

游戏是在房间中运行的。每个房间都有一个索引名。当前房间保存在变量 room 中。你不要将房间想象成连续的。所以不要增加或减少 room 变量的值。而应该使用下面的函数和变量。你可以使用下面一行典型的代码 :

{

if (room != room_last)

{

room_goto_next();

}

else

{

game_end();

}

}

下面变量和函数用来处理房间 .

room当前房间的索引。不能通过改变就进入一个不同的房间,要用下面的函数。

room_first*游戏中第一个房间的索引。

room_last*游戏中最后一个房间的索引。

room_goto(numb)进入索引为 numb 的房间。

room_goto_previous()进入先前的房间。

room_goto_next()进入下一个房间。

room_restart()当前房间重新开始。

room_previous(numb)返回先前房间的索引 numb ( -1 为空),但是不能去那里。

room_next(numb)返回下一个房间的索引 numb 。

game_end()结束游戏。

game_restart()游戏重新开始。

调用下面的函数来改变房间或结束或重新开始游戏时,请认识到房间的改变不会立刻实现。当前的动作全部执行完才开始改变。所以剩下的脚本仍然会执行,同样的应用可能调用脚本。

房间有这些附加属性 :

room_width*房间的宽度。(单位为像素)

room_height*房间的高度。(单位为像素)

room_caption显示在窗口的房间名。

room_persistent当前房间是否持久显示。

很多游戏要求玩家保存游戏以及读取游戏。 Game Maker 中 F5 保存游戏 F6 读取游戏。也可以用一行代码保存和读取游戏(注意,读取只在当前步的最后发生)。

game_save(string)保存游戏为文件名 string 。

game_load(string)读取文件名为 string 的游戏。

请认识到,只是最基本的游戏数据被保存。如果播放一段音乐,在音乐的精确位置是不能保存的。同样改变过的资源也不能保存。另外未保存的是数据结构内容,粒子,还有多人设置。

得分

很多游戏的另一个重要方面是得分,生命值,以及生命。Game Maker 保留得分为全局变量score ,生命为全局变量 lives 。生命值和生命同样如此。所有的实例如果生命大于 0 ,并且要小于等于 0 ,没有生命事件( no-more-lives event )就会执行。如果你不想在标题上显示得分和生命,设置 show_score 为 false 。同样也可以改变标题。更复杂的游戏最好自己显示得分。

score当前得分。

lives生命数量。

health当前生命值( 0-100 )。

show_score是否在窗口标题中显示得分。

show_lives是否在窗口标题中显示生命数量。

show_health是否在窗口标题中显示生命值。

caption_score用于得分的标题。

caption_lives用于生命数量的标题。

caption_health用于生命值得标题。

产生事件

如你所知,Game Maker 是完全事件驱动的。所有的动作都在事件中发生。有大量不同的事件。创建和销毁事件发生在实例创建或是销毁时。每一步中,系统首先运行闹钟事件。接下来运行键盘和鼠标事件,然后运行并行事件。再然后是碰撞事件,实例碰撞后设置到新的位置。最后绘制事件用来绘制实例(注意有多重视野时绘制事件在每步中调用多次)。你也可以通过代码对当前实例使用事件。下面是可用的函数 :

event_perform(type,numb)当前实例执行指定类型事件的 numb 号码。有以下事件类型可以指定 :

ev_create创建事件

ev_destroy销毁事件

ev_step并行事件

ev_alarm闹钟事件

ev_keyboard键盘事件

ev_mouse鼠标事件

ev_collision碰撞事件

ev_other其他事件

ev_draw绘制事件

ev_keypress键盘按下事件

ev_keyrelease键盘松开事件

有多个事件类型时,参数 numb 可以用来指定精确的事件。比如闹钟事件 numb 可以设范围0 到 11 。键盘事件可以使用参数 keycode 。鼠标事件可以使用下面的常量 :

ev_left_button 左键

ev_right_button 右键

ev_middle_button 中键

ev_no_button 没有按键

ev_left_press 按下左键

ev_right_press 按下右键

ev_middle_press 按下中键

ev_left_release 放开左键

ev_right_release 放开右键

ev_middle_release 放开中键

ev_mouse_enter 移入鼠标

ev_mouse_leave 移开鼠标

ev_mouse_wheel_up 滚轮向上

ev_mouse_wheel_down 滚轮向下

ev_global_left_button 全局左键

ev_global_right_button 全局右键

ev_global_middle_button 全局中键

ev_global_left_press 全局按下左键

ev_global_right_press 全局按下右键

ev_global_middle_press 全局按下中键

ev_global_left_release 全局放开左键

ev_global_right_release 全局放开右键

ev_global_middle_release 全局放开中键

碰撞事件中要给出另一对象的索引。最后,其他事件中使用以下常量 :

ev_outside 出房间

ev_boundary 边界

ev_game_start 游戏开始

ev_game_end 游戏结束

ev_room_start 房间开始

ev_room_end 房间结束

ev_no_more_lives 没有生命

ev_no_more_health 没有生命值

ev_animation_end 结束动画

ev_end_of_path 结束路径

ev_user0 自定义 0

ev_user1 自定义 1

ev_user2 自定义 2

ev_user3 自定义 3

ev_user4 自定义 4

ev_user5 自定义 5

ev_user6 自定义 6

ev_user7 自定义 7

ev_user8 自定义 8

ev_user9 自定义 9

ev_user10 自定义 10

ev_user11 自定义 11

ev_user12 自定义 12

ev_user13 自定义 13

ev_user14 自定义 14

ev_user15 自定义 15

并行事件中使用以下常量 :

ev_step_normal正常步

ev_step_begin步开始

ev_step_end步结束

event_perform_object(obj,type,numb)这个函数和上面的函数相同除了这次可以指定事件给另一个对象。注意,在这些事件里的动作是当前实例的,不是给对象实例的。

event_user(numb)在其他事件( other events )中可以定义 16 个用户事件。只有当你调用这个函数是运行。参数 numb 必须在 0 到 15 的范围内。

event_inherited()执行继承事件。只有实例拥有父对象是才有效。

使用下面的只读变量可以获取当前事件执行的信息 :

event_type*当前开始执行的事件类型。

event_number*当前开始执行的事件号码。

event_object*当前执行的事件的对象索引。

event_action* 当前执行的事件的动作索引。( 0 为事件中第一个执行的,依次类推)。复杂的变量和函数

这里有一些处理出错的变量和函数。

error_occurred显示是否有错误发生。

error_last用字符串显示最后出错的信息。

show_debug_message(str) Debug 模式中显示字符串

下面的函数用来监测是否确定变量的存在以及怎样设置变量及获取他们的值。所有这些函数的变量名都是用字符串传递。

variable_global_exists(name)返回值为名为参数 name (字符串)的全局变量是否存在。variable_local_exists(name)返回值为当前实例的名为参数 name (字符串)的局部变量是否存在。

variable_global_get(name)返回值为给出参数 name (字符串)的全局变量的值。variable_global_array_get(name,ind)返回值为给出参数 name (字符串)的全局数组的参数 ind 的索引值。

variable_global_array2_get(name,ind1,ind2)返回值为给出参数 name (字符串)的全局二维数组变量的参数 ind1 , ind2 的索引值。

variable_local_get(name)返回值为给出参数 name (字符串)的局部变量的值。variable_local_array_get(name,ind)返回值为给出参数 name (字符串)的局部数组的参数 ind 的索引值。

variable_local_array2_get(name,ind1,ind2)返回值为给出参数 name (字符串)的局部二维数组变量的参数 ind1 , ind2 的索引值。

variable_global_set(name,value)设置给出参数 name (字符串)的全局变量的值。variable_global_array_set(name,ind,value)设置给出参数 name (字符串)的全局数组的参数 ind 的索引值。

variable_global_array2_set(name,ind1,ind2,value)设置给出参数 name (字符串)的全局二维数组变量的参数 ind1 , ind2 的索引值。

variable_local_set(name,value)设置给出参数 name (字符串)的局部变量的值variable_local_array_set(name,ind,value)设置给出参数 name (字符串)的局部数组的参数 ind 的索引值。

variable_local_array2_set(name,ind1,ind2,value)设置给出参数 name (字符串)的局部二维数组变量的参数 ind1 , ind2 的索引值。

举例来说,你可以这样写 :

{

if variable_global_exists('ammunition')

global.ammunition += 1

else

global.ammunition = 0

}

你可以使用这些函数通过一种参数传递的方法给脚本传递变量,通过传递它们的字符名以及使用函数来改变它们

你可以使用下面的函数改变程序的优先级 :

set_program_priority(priority)设置程序的优先级。可以指定 -3 到 +3 之间的值。值为 -3 时意味着程序只会在如下情况运行,电脑没有其他程序要处理时,或是所有其他的程序都空闲时。值为 -2 或 -1 时在正常线下,其他程序会有优先权。值为 0 时是正常的值。值为 +1 或 +2 为较高的优先级,可能会导致较高的速度和较平滑的游戏流程。但其他程序会得到很少的处理时间。值为 +3 时为实时模式。在实时模式中基本上所有的时间都分配到游戏当中去了。这样会导致电脑正在运行的其他应用程序发生严重的问题。当然键盘事件不

再被电脑记录下来。所以只有当你想要所有的处理时间时才使用这个函数。同样要注意最好使用前仔细的检查一下并且运行前保存游戏。

键盘

键盘互动中,存在以下几个变量和函数 :

keyboard_lastkey最后一个按下的按键代码。请看后面的按键代码手册。你可以改变它,例如设定成0,如果你愿意的话。

keyboard_key当前按下的按键代码(看后面;如果是0则表示没有按键)。

keyboard_lastchar最后一个按下的字符(返回字符串格式)。

keyboard_string返回最后一批被按下的字符,最多1024个。字符串将只包含可打印字符。

有些时候将某个按键映射成另一个按键相当有用。例如,你可能想允许玩家同时使用方向键和数字小键盘。除了简单复制动作以外,你还可以通过映射小键盘到方向键来完成。或者你想搞一个控制选项让玩家自己去设置按键。那么以下几个函数就会相当有用 :

keyboard_set_map(key1,key2)映射按键代码 key1 到 key2 。

keyboard_get_map(key)返回当前 key 的映射代码。

keyboard_unset_map()重置所有被映射的按键到原始状态。

要检查某个按键或鼠标键是否被按下,你可以使用如下函数。这在需要设置多重按键的时候会用到。

keyboard_check(key)返回指定的 key 是否正处于被按下的状态。

keyboard_check_pressed(key)返回指定的按键 key 是否在上一步之后被按下。

keyboard_check_released(key)返回指定的按键 key 是否在上一步之后被放开。keyboard_check_direct(key)直接通过硬件返回指定按键 key 是否被按下。结果取决于

程序专注的方向,它允许使用更多的按键检查。尤其是它可以检查 vk_lshift,vk_lcontrol, vk_lalt,vk_rshift,vk_rcontrol和vk_ralt这样的按键代码来检测左边或右边的shift,control或alt键被按下。

以下几个函数用来处理键盘的状态 :

keyboard_get_numlock()返回 numlock 键是否打开。

keyboard_set_numlock(on)开关 numlock 键。

keyboard_key_press(key)模拟指定按键 key 的一次按键操作。

keyboard_key_release(key)模拟指定按键 key 的一次放开键的操作。

以下为一些存在的虚拟按键代码 :

vk_nokey没有按键时的按键代码。

vk_anykey任意键被按下时的按键代码。

vk_left左方向键的按键代码。

vk_right右方向键的按键代码。

vk_up上方向键的按键代码。

vk_down下方向键的按键代码。

vk_enter回车键

vk_escape ESC键

vk_space空格键

vk_shift Shift键

vk_control Ctrl键

vk_alt Alt键

vk_backspace Backspace键

vk_tab Tab键

vk_home Home 键

vk_end end 键

vk_delete delete 键

vk_insert insert 键

vk_pageup pageup 键

vk_pagedown pagedown 键

vk_pause pause/break 键

vk_printscreen printscreen/sysrq 键

vk_f1 ... vk_f12功能键 F1 ~ F12

vk_numpad0 ... vk_numpad9数字小键盘数字键

vk_multiply数字小键盘乘号

vk_divide数字小键盘分号

vk_add数字小键盘加号

vk_subtract数字小键盘减号

vk_decimal数字小键盘小数点

至于字母键可以使用类似 ord('A') 这样的格式表示按键代码(要用大写字母)。数字键就用 ord('5') 这样的格式。以下是在 keyboard_check_direct 里要用到的按键代码 :

vk_lshift左shift 键

vk_lcontrol左 control 键

vk_lalt左 alt 键

vk_rshift右 shift 键

vk_rcontrol右 control 键

vk_ralt右 alt 键

例如,假设你有一个对象可以通过方向键控制移动,你可以用如下代码实现步行事件 :

{

if (keyboard_check(vk_left)) x -= 4;

if (keyboard_check(vk_right)) x += 4;

if (keyboard_check(vk_up)) y -= 4;

if (keyboard_check(vk_down)) y += 4;

}

当然在动作库里直接拖放设定更方便一些

这里有一些额外的键盘处理函数。

keyboard_clear(key)清除按键 key 的状态。这意味着除非它被连发,否则不会产生任何按键代码事件。

io_clear()清除所有键盘及鼠标状态。

io_handle()操作用户 io,更新键盘及鼠标状态。

keyboard_wait()等待,直到用户按下键盘上的某个键。

鼠标

在鼠标处理中,存在以下几个变量和函数 :

mouse_x*鼠标在房间内的横坐标。无法更改。

mouse_y*鼠标在房间内的纵坐标。无法更改。

mouse_button当前按下的鼠标键。可以有如下集中状态: mb_none,mb_any,mb_left, mb_right,以及 mb_middle。

mouse_lastbutton最后一次按下的鼠标键。

为了检查指定的鼠标键是否被按下,你可以使用如下几个函数。这些函数尤其在多个键按下时非常有用。

mouse_check_button(numb)返回某个鼠标键是否被按中(numb 为 mb_none, mb_left, mb_middle, or mb_right 中的一种)。

mouse_check_button_pressed(numb)返回某个鼠标键在上一次行动后是否被按下(numb 为 mb_none, mb_left, mb_middle, or mb_right 中的一种)。

mouse_check_button_released(numb)返回某个鼠标键在上一次行动后是否被放开(numb 为 mb_none, mb_left, mb_middle, or mb_right 中的一种)。

这里有一些额外的鼠标处理函数。

mouse_clear(button)清除鼠标按键 button 的状态,直到玩家将它放开并再次按下。

io_clear()清除所有键盘及鼠标状态。

io_handle()管理用户 io,更新键盘及鼠标状态。

mouse_wait()等待,直到用户按下某个鼠标键。

精灵和图像

每个对象都有一个相关联的精灵。精灵可以是一张图像或是一组连续的图像。对于对象的每个实例,程序都要在屏幕上绘制对应的图像,在实例的坐标(x,y)原点(这个点在精灵属性里定义)上。当存在多幅图像的时候,会重复循环显示各个图像,形成动画效果。这里有一批函数负责处理图像的绘制。他们可以用来改变效果。每个实例含有如下几个变量 : visible如果 visible 为真(1),则图像就被绘制出来,否则就不予绘制。不可见的实例仍然是活动的并可以触发碰撞事件;只是你看不到而已。将 visible 设置为假可以用在例如手柄对象中(将他们设置为非固态形式以避免碰撞事件)或者隐藏的机关等。

sprite_index实例的当前精灵索引编号。你可以更改它使实例更换另一个精灵。根据不同的值你可以设定显示你所指定的不同的精灵。更改精灵并不会更改当前可见的子图像索引编

游戏设计与制作课程设计题目

游戏设计与制作课程设计 以下4个题目任选一个按要求完成,并于6月5日(即第15周周四)前提交包含所有材料的课程设计袋。 题目1:太阳系模拟 太阳系(Solar System)是以太阳为中心,和所有受到太阳重力约束的天体的集合体,主要包括太阳,八大行星,以及卫星.此课题模拟太阳系各大行星和卫星围绕太阳旋转运动。 基本设计思路和运行效果可参考“《《计算机图形学》课程设计报告”一文相关内容。 要求: 开发环境——VS2008以上 SDK ——DirectX 9.0c 以上 题目2:基于阴影贴图的阴影的实现 阴影贴图是实现实时阴影的一种方法,它可以实现任意曲面上投影的阴影效果,而不仅仅是平面阴影。 通过本次课程设计,要求: 1、了解基于阴影贴图的阴影实现的基本思路和算法; 2、结合参考文献理解实现过程; 3、基于阴影贴图的阴影实现存在的问题和改进的方法。 4、编写相应的实现代码和测试代码。 参考: 1、”Introduction.to.3D.Game.Programming.with.DirectX.9.0c.Shader.Approach”第22.2节“Shadow mapping”。 2、DX SDK自带的“ShadowMap sample”。 题目3:二维游戏“Breakout!(打砖块)”的设计与实现 进入Breakout的初始界面,屏幕上方的彩色矩形方块代表砖块,屏幕下方的较长的矩形方块表示板子。板子的垂直位置不变,但可在屏幕边界之间通过用户的输入左右移动。还有一个小球,从屏幕中间向下运动,球可从板子或左右墙面反弹击中砖块。击中的砖块即消失。小球不断实现反弹击中砖块的过程,直到以下两种情况出现,退出游戏: 1、小球碰到地面(即屏幕的下边界),即玩家没用板子接住球。在这种情况下,假设一关游戏给三次击球的机会,如果总共有三次没有用板子接住球,玩家失败,退出游戏。 2、所有的砖块都被击中,玩家赢,退出游戏。

JAVA课程设计打砖块(含代码)

Java程序课程设计任务书 一、主要容 打砖块游戏是一种动作电子游戏的名称。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。球碰到砖块、棒子与底下以外的三边会反弹,落到底下会失去一颗球,把砖块全部消去就可以破关。 二、具体要求 通过图形用户界面(Graphics User Interface,GUI)和线程,使用户和程序之间可以方便地进行交互。运用Swing组件,编写小应用程序游戏,加深对Java语言的理解,深入地了解图形用户界面的设计,更加熟练地运用编程软件。 功能要求: (1)游戏运行需键盘的操作; (2)游戏可统计分数; (3)球落到底下会失去一颗,按ENTER可重新开始。 开发工具:JCreater软件; 开发技术:J2ME。 三、进度安排 12月28日:课程设计选题,查找参考资料 12月29日:完成打砖块游戏程序设计分析 12月30日~ 1月3日:完成程序代码的编写 1月4日~ 1月5日:游戏测试与完善 1月6日~ 1月7日:完成课程设计报告,准备答辩 四、主要参考文献 [1] (美)埃克尔著昊鹏,饶若楠等译. Java编程思想[J]. 机械工业,2005 [2](美)Gary J.Bronson著珑雅文译. Java编程原理[J]. 清华大学,2004 [3](美)Michael Morrison著徐刚,于健,薛雷译. 游戏编程入门[J]. 人民邮电,2005.9 [4](美)Wendy Stahler著冯宝坤,曹英译. 游戏编程中的数理应用[J]. 红旗,2005

[5](美)克罗夫特(David Wallace Croft)著彭晖译. Java游戏高级编程[J]. 清华大学,2005 [6](美)David Brackeen著邱仲潘译. Java游戏编程[J]. 科学,2004 [7] 聂庆亮编著. Java应用开发指南[J]. 清华大学,2010 [8] 耿祥义,跃平编著. Java面向对象程序设计[J]. 清华大学,2010 [9] 绍方编著. Java编程实用技术与案例[J]. 清华大学,2000.11 [10] 明日科技编著. Java编程全能词典[J]. 电子工业,2010 摘要 随着Java语言的不断发展和壮大,现在的Java已经广泛的应用于各个领域,

软件开发设计报告5_12

《软件开发实践》 设计报告 项目名称:打砖块小游戏 姓名学号工作量 何建清2012141463199 80% 廖宇2012141463001 20% 2014 年 5 月 4 日

目录 1.引言........................................................................................................... 错误!未定义书签。 1.1 开发目的......................................................................................... 错误!未定义书签。 1.2 开发背景......................................................................................... 错误!未定义书签。 1.3 参考资料......................................................................................... 错误!未定义书签。2.软件分析设计.. (1) 2.1 游戏描述 (1) 2.1.1 对需求的支持 (1) 2.1.2 游戏目标 (1) 2.2 总体设计 (1) 2.2.1 游戏运行环境 (1) 2.2.2 游戏描述 (1) 2.2.3 游戏框架 (1) 2.3 模块设计 (2) 2.3.1 功能 (2) 2.3.2 算法 (2) 2.4 界面设计 (3) 2.5 代码设计 (3) 2.6 游戏素材展示 (4) 2.7 开发环境 (5) 3. 项目管理和保障 (5) 3.1 项目计划 (5) 3. 2 游戏使用说明 (5)

打砖块JAVA游戏代码

#include #include #include #include #include void draw(int x1) { int m=0,n=0,x=40,y=20; int t=0,i,j,k=1; int a=0,b=127,c=88; for(i=0;i<8;i++) { n=i*20; y=n+20; for(j=0;j<16-t;j++) { m=(j+i)*40; x=m+40; POINT points[]={{m,n}, {x,n}, {x,y}, {m,y}}; setfillcolor(RGB(a,b,c)); fillpolygon(points, 4); a=8*k+8;

b=j*3+k+200; c=20*k; k=k+8; } t=t+2; k=1; } m=300; n=160; x=340; y=180; POINT points[]={{m,n}, {x,n}, {x,y}, {m,y}}; setfillcolor(RGB(a,b,c)); fillpolygon(points, 4); } void end() { settextstyle(50, 0, "宋体", 0, 0, FW_BOLD, false, false, false); settextcolor(RED); outtextxy(200,200,"游戏结束!"); getch();

closegraph(); } void start() { int n=0; loadimage(NULL,"IMSGE","background"); while(1) { setbkmode(TRANSPARENT); settextstyle(50, 0, "楷体", 0, 0, FW_BOLD, false, false, false); if(n%2==0) settextcolor(GREEN); else settextcolor(RED); outtextxy(80,100,"请按空格键开始游戏"); Sleep(250); if(_kbhit()) break; n++; } }

JAVA课程设计打砖块

Java程序课程设计任务书 一、主要内容 打砖块游戏是一种动作电子游戏的名称。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。球碰到砖块、棒子与底下以外的三边会反弹,落到底下会失去一颗球,把砖块全部消去就可以破关。 二、具体要求 通过图形用户界面(Graphics User Interface,GUI)和线程,使用户和程序之间可以方便地进行交互。运用Swing组件,编写小应用程序游戏,加深对Java 语言的理解,深入地了解图形用户界面的设计,更加熟练地运用编程软件。 功能要求: (1)游戏运行需键盘的操作; (2)游戏可统计分数; (3)球落到底下会失去一颗,按ENTER可重新开始。 开发工具:JCreater软件; 开发技术: J2ME。 三、进度安排 12月28日:课程设计选题,查找参考资料 12月29日:完成打砖块游戏程序设计分析 12月30日 ~ 1月3日:完成程序代码的编写 1月4日 ~ 1月5日:游戏测试与完善 1月6日 ~ 1月7日:完成课程设计报告,准备答辩 四、主要参考文献 [1] (美)埃克尔著陈昊鹏,饶若楠等译. Java编程思想[J]. 机械工业出版社,2005 [2](美)Gary 著张珑刘雅文译. Java编程原理[J]. 清华大学出版社,2004 [3](美)Michael Morrison著徐刚,于健,薛雷译. 游戏编程入门[J]. 人民邮电出版社, [4](美)Wendy Stahler著冯宝坤,曹英译. 游戏编程中的数理应用[J]. 红旗出版社,2005 [5](美)克罗夫特(David Wallace Croft)著彭晖译. Java游戏高级编程[J].

小游戏 打砖块

小游戏打砖块 制作人: 步宇星20062366 信息学院06计算机系 开发平台: Visual C++6.0 软件介绍: 模拟红白机小游戏,打砖块。 如果你是80年代出生或者孩子是80年代出生的话,或者你是一个心理年龄 比较中,家里一定会有任天堂出品的红白机,或者小霸王。那些怀旧的经典游 戏中有一款叫做打砖块的小游戏。 本作品就是我在PC上仿真它做出来的。 游戏开始时的截图。 这是一个用DirectDraw做图形处理的全屏幕游戏。操作在屏幕下方。 玩过的人都知道游戏规则,很简单,控制球棒接住球并把所有的方块打掉,就 可以进入下一关。屏幕上方又显示level,level越高球速越快,另外每关背景 和音乐也不一样。

这是第二关背景改变了 下面的卡就不在给图了 主要程序框架: 本游戏是在win32平台下用开发的,所以跟每个win32程序一样 都是以WinMain为程序入口,用WindowProc来处理消息(WM_CREATE、 WM_ACTIVATE、WM_PAINT、WM_DESTROY)。 1、主消息循环 // 游戏初始化 Game_Init(); // 进入事件循环 while(true) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // 如果是WM_QUIT退出事件循环 if (msg.message == WM_QUIT) break; // 翻译消息

TranslateMessage(&msg); // 把消息送给回调函数 DispatchMessage(&msg); } // end if // 进入游戏主程序在这里进行每一帧的绘制 if(!Game_Main()) return (0); } // end while // 做游戏结束工作 Game_Shutdown(); 为了保证响应windows,Game_Main()采用状态机的方式工作,每次操作完返回给windows下次再进入Game_Main()时根据所在状态工作, // 游戏状态 #define GAME_STATE_INIT 0 #define GAME_STATE_START_LEVEL 1 #define GAME_STATE_RUN 2 #define GAME_STATE_PAUSE 3 #define GAME_STATE_OVER 4 #define GAME_STATE_SHUTDOWN 5 #define GAME_STATE_EXIT 6 游戏先进入 GAME_STATE_INIT 状态做好初始化工作 进入 GAME_STATE_START_LEVEL 状态重置每关的初始数据 进入 GAME_STATE_RUN 循环在这里执行游戏逻辑、输入检测,并绘制每一帧并返 回windows 重复第三步 第三步中按下Enter键进入GAME_STATE_PAUSE 状态游戏将暂停,直到按下space键回到第三步 第三步中将生命用完(life值小于0)进入GAME_STATE_OVER状态,直到按下R键回到第二步 上述步骤中如按下Esc键则进入GAME_STATE_SHUTDOWN状态此时做结束工作并发送WM_DESTROY消息 进入GAME_STATE_EXIT状态此时Game_Main()不做任何操作就返回 2、图像处理部分 考虑到游戏对速度的要求,图像处理主要利用比GDI快得多的DirectDraw完成(文字显示用了GDI)。所有Direct的相关代码都在被我封装在ddrawlib.cpp中,其中的全局变量和函数原型以及宏和定义都在ddrawlib.h申明。我这么做的目的是让自己习惯于利用引擎的API来编程。实际上ddrawlib就是一个基于Direct的简单2D游戏引擎。 关于该引擎的函数库说明,源代码中有详细的注释,这里不多讲了。

C#课程设计(打砖块)

辽宁工业大学 C#.NET程序设计课程设计(报告)题目:打砖块游戏 院(系):软件学院 专业班级:计算机信息管理101班 学号: 101403009 学生姓名:姜洪亮 指导教师:胡峰 教师职称:助教 起止时间:2011.11.21至2011.12.02

程序设计专题(报告)任务及评语

目录 第1章程序设计专题目的与要求 (1) 1.1 程序设计目的 (1) 1.2 程序设计的实验环境 (1) 1.3 程序设计的预备知识 (1) 1.4 程序设计要求 (1) 第2章程序设计内容 (2) 2.1概要设计 (2) 2.2程序整体设计说明 (2) 2.3程序部分源代码及注释 (8) 2.4测试结果 (12) 第3章程序设计总结 (13) 参考文献 (14)

第1章程序设计目的与要求 1.1 程序设计目的 《C#.Net程序设计》是计算机科学与技术专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是软件技术专业学生学习完《C#.Net程序设计》课程后,进行的一次全面的综合训练,C#.Net 程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 1.2 程序设计的实验环境 硬件要求能运行Windows xp操作系统的微机系统。C#.Net程序设计语言及相应的集成开发环境visual https://www.360docs.net/doc/7615982658.html,。 1.3 程序设计的预备知识 熟悉c#语言及visual https://www.360docs.net/doc/7615982658.html,集成开发环境。 1.4 程序设计要求 按程序设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握c#.net2003的基本技能和面向对象的概念和方法;了解windows编程。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。

基于Java的打砖块游戏毕业论文

北方民族大学学士学位论文论文题目基于JA V A的打砖块游戏开发 系(部)名称: 计算机科学与工程学院 学生姓名: 专业: 软件工程 学号: 指导教师姓名: 论文提交时间: 2014-5-7 论文答辩时间: 2014-5-17 学位授予时间: 北方民族大学教务处制

基于JAVA的打砖块游戏开发 摘要 打砖块是一款堪称经典的小游戏,在掌上游戏机上和许多手机上都能发现这个小游戏。游戏基本内容是玩家通过控制一个能够左右移动的挡板,反弹正在运动中弹球,使之改变移动的方向,用小球消除游戏窗口里面的的砖块,然后到达下一关,在障碍物被消除的过程中,可能会产生一些能改变挡板或者小球状态的物品,例如:挡板变长、变短,小球威力加强等等。 本系统是一个基于Java语言平台的打砖块游戏。主要任务是设计打砖块游戏的算法,并使用JA V A语言编写程序,最终完成游戏编程,并使之能够正确运行。主要是小球的碰撞检测和运动轨迹的算法,碰撞部分可以将小球看成一个矩形,当矩形的边界坐标与砖块、挡板、墙壁等一样时,可以判断为进行了碰撞,而运动轨迹只要在碰撞后将X轴或Y轴取反就可以了。 本文第一章阐述了选题目的及Java游戏目前的发展现状。第二章介绍了Java 语音的特点和基于Java游戏开发的相关的技术。第三章详细介绍了打砖块游戏,包括游戏的规则和期待的效果等。第四章进行打砖块游戏的具体设计与实现,包括界面的设计,类的设计,算法的设计等等。第五章对游戏进行运行和测试,以期检测游戏中的各种问题。期望通过本游戏实例掌握小型Java游戏开发和Java 编程的基础的知识和技巧,使自己具备开发Java游戏基本能力。 关键字:java,游戏设计,测试,打砖块,算法

C++课程设计:打砖块游戏

课程设计报告 课程名称:面向对象程序设计C++ 设计题目:打砖块游戏 专业:计算机科学与技术 姓名: 学号: 指导教师:李晓虹 2015 年 12 月 30 日

一、需求分析 本系统为一个用C#实现的为我们所熟悉的简单的打砖块游戏,该系统的具体功能如下: 能简便的开始游戏,游戏中的功能与日常我们所熟悉的游戏的功能一致 ,直到砖块全部打光过关和在砖块打光之前机会用完游戏结束功能; 当游戏结束时会自动弹出消息框提示本关所获得得分数; 当过关时会出现提示图片,点击进入下一关,下一关的方块位置和所组成的形状。 二、系统运行环境 (1)硬件环境:计算机 (2)软件环境:本系统的设计采用Visual C++6.0编写。在Windows7环境下测试通过 (3)本游戏软件在Windows平台下都可以运行 三、总体设计 3.1 开发与设计的总体思想 3.1.1 设计思路 随着社会生活节奏的加快,越来越多的人,选择在自己的闲暇时间用玩游戏的方式去缓解自己的生活工作上的压力,所以,此款游戏的最终目标就是给游戏玩家带来一种精神上的放松以及娱乐消遣带来的快乐。所以经过反复仔细的思考,我决定在用一种简单、大方的颜色作为游戏的背景颜色,并且里面插播一首轻音乐来使游戏者感到轻松、愉悦。 3.2功能介绍 1) 游戏设计游戏开始时,小球会停在挡板正中间,而且此时小球可以随着挡板左右自由移动,当按下空格键小球弹出,并在程序设定的区域中不停碰撞反弹。 2) 当小球碰撞到墙壁、挡板、和砖块的时候,均以相同的速度反弹,并且砖块被碰撞后会以相同的速度反弹,并且当砖块被碰撞后会消失。 3) 挡板可以左右移动以接住小球,若超过三次没有接住,则游戏结束,按退出键退出,当所有砖块全部打光时则出现进入下一关的提示框,点击进入下一关。

unity3d打砖块游戏代码

BrickBreaker Game Step 1: Create New Project “BrickBreaker” File -> New Project (check Standard Assets(Mobile).unityPackage) Then save the scene following below instruction. Change name of scene to “MainScene”. File -> Save Scene

Step 2: Set Main Camera The position, rotation and scale of Main Camera are showed following figure. Change background color whatever you want. Change projection perspective -> orthographic Size = 20 Clipping Planes : Near = 0.3 Far = 25

Step 3: Create Directional Light GameObject-> Create Other -> Directional Light Step 4: Create Walls Create new cube following this instruction: GameObject -> Create Other -> Cube Change Cube Name to “ WallLeft”. “WallLeft” position, rotation and scale are following below figure Change “Main Color”.

最新打砖块游戏软件工程项目可研报告

打砖块软件可行性研究报告 1.规模和目标 本次软件开发项目为打砖块,初步确定做一个小中型规模单机版的游戏,同时也可以在游戏平台里面运行,确保能够在局域网或者互联网上与朋友对战,寻求一种游戏上的刺激,可以让人们在业余时间尽情的消遣自己,使全身心得到最大的放松。这是我们做这个游戏实现最基本的目标。现在从系统的逻辑模型出发,从3个方面研究打砖块游戏的可行性。 一.技术可行性(使用现在的技术能实现这个系统吗)在技术方面,截至目前,我们学习过C语言,VC++,汇编语言,接触过VB和java,结合游戏的本身特点和我们对C语言的掌握程度,特别是对于VC++,它功能强大,对于游戏里面的界面设计,动作类的算法以及常用函数构造和系统函数的调用等都可以用它来实现,相信能较好较快的编写出这个小中型的游戏系统。 二.经济可行性(这个系统的经济效益能超过它的开发成本吗)

在经济方面,初步从成本来看,我们做这个游戏,主要是耗费人力,至于财力方面,不需要投入什么,只要游戏能够在通用游戏平台里运行就几乎很成功了;从系统的经济效益来看,我们相当看好,估计它一定可以超过游戏本身所开发的成本。理由有两个方面:其一随着社会的越来越进步,人员的越来越紧张的竞争,工作压力的重要之下,必然有大部分人喜欢在工作闲暇之余让自己充分的放松,这个时候游戏就是最好的兴奋剂,可以带动整个人,让整个人兴奋起来,不至于那么疲劳和无聊。其二打砖块这个游戏通俗易懂,简单方便,老少皆宜,相信随着它的流行会有更多的人喜欢这款小游戏的。 三.操作可行性 (系统的操作方式在这个用户组织内行得通吗) 在操作方面,我们采用简单的操作方式和必要的帮助说明,让用户一看就知道如何操作,主要有左右方向键,前后移动键,发射打砖块键,击中目标砖块才可以得分,并且分数累计到了一定阶段,自动进入第二阶段,依次类推……..直到打到最后一关,而且每过一关砖块在空中飘过的速度就增加一次,我们主要用数据结构中的相关算法来实现;砖块的左右循环飘动,可以用循环递归语句实现;

《打砖块》游戏设计报告

——《打砖块》 学院: 班级: 学号: 姓名:

一.游戏设计规则 游戏开始时,小球会停在挡板正中间,且此时挡板可左右自由移动,当按下空格键后小球会弹出,并在程序设定的区域内不停的碰撞反弹。当小球碰到墙壁、挡板和砖块时,均会以相反的速度反弹,并且砖块被碰撞后会自动消失。挡板可左右移动以接住小球,若小球没有被接住,超出指定区域下边缘,则程序会自动提示“游戏结束”,点击“确定”后退出程序。当所有的砖块均消失时,程序会弹出提示“恭喜你,你赢了”。 二.游戏设计思路 整个游戏可以分为三个类:小球类、挡板类和砖块类。 其中最简单的当然是挡板了,在回调函数中增加“WM_KEYDOWN”的按键消息,在里面编写控制挡板移动的代码,挡板的移动是通过“上、下、左、右”四个键来实现的。 砖块在整个程序中负责两件事情,其一是程序初始化时随着小球和挡板出现在游戏界面中,再就是被小球碰到后消失。控制砖块出现与否是通过一个bool变量“blockExist”来实现的,当该变量为“true”时,就将砖块贴到目标DC上,否则就不贴。由于砖块数量很多,故可以用一个for循环来实现,所有的砖块用的都是一张图片,而变化的只是砖块的坐标。 本游戏中最复杂的要数小球了,因为小球要涉及到很多碰撞检测和反弹,而且这其中还和砖块、挡板有联系。小球涉及到的碰撞有:小球与墙壁碰撞、小球与挡板碰撞、小球与砖块碰撞。

碰撞检测实际上是检测小球的坐标是否进入了某个特定的区域,若进入了,则小球要反弹;否则,按原来的路线继续前进。小球能不断的反弹,事实上靠的是小球速度方向的改变,对于小球而言,它能出现在某个点上,是它所在坐标系中的坐标导致的。若设小球的坐标为(x_ball,y_ball),其速度为水平:vx,竖直:vy,将其坐标与速度之间建立赋值关系,即:x_ball+=vx,y_ball-=vy。 只要对其坐标进行相对应的计算,就能控制小球的反弹了。三.游戏主要代码 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_APIDEMOGAME, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_APIDEMOGAME); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

打砖块开题报告

硬件课程设计实验报告 课题:基于BASYS2的打砖块游戏设计班级:测控1201 作者:王志鹏 学号:U201214414 组员:张亚枫 学号:U201214416 组员:郭圣桐 学号:U201214404 指导老师:吴建新 课设成绩:

1.1 项目要求 本项目要求设计并实现一个基于BASYS2的打砖块游戏,利用BASYS2实验板的键位实现挡板左右移动,外接VGA显示器实现游戏的界面。 1.2 项目背景 本项目作为《硬件课程设计》课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个硬件和软件开发过程。 FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合和布局,快速地烧录至FPGA 上进行测试,是现代IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。 了解利用FPGA实现电子琴的基本原理,综合运用所学知识实现一个具有多个模块的模数混合系统,为后续课程学习和工作打下基础。而且实现电子琴也十分有趣,能够加深电子系统在音乐艺术领域的应用。 1.3 开发工具简介 Basys2:该开发板是围绕着一个Xilinx Spartan-3E FPGA芯片和一个Atmel AT90USB USB控制器搭建的,它提供了完整、随时可以使用的硬件平台,并且它适合于从基本逻辑器件到复杂控制器件的各种主机电路。Basys2板上集成了大量的I/O设备和FPGA所需的支持电路,让您能够构建无数的设计而不需要其他器件。 ISE 13.1_1:ISE是使用XILINX的FPGA的必备的设计工具,它可以完成FPGA 开发的全部流程,包括设计输入、仿真、综合、布局布线、生成BIT文件、配置以及在线调试等,功能非常强大。ISE除了我们功能完整,使用方便外,它的设计性能也非常好,拿ISE 9.x来说,其设计性能比其他解决方案平均快30%,它集成的时序收敛流程整合了增强性物理综合优化,提供最佳的时钟布局、更好的封装和时序收敛映射,从而获得更高的设计性能。先进的综合和实现算法将动态功耗降低了10%。 Digilent Adept_v2-3-0:为XILINX公司的Digilent开发板下载程序用的软件,能够将ISE生成的.bit文件烧写至FPGA中。

J2ME手机游戏设计之“打砖块”

J2ME手机游戏设计之“打砖块” 一、游戏分析: 随着现代社会发展的日新月异,人们平常工作学习的竞争也在加大,生活的压力也跟着加重。所以利用闲暇之余,大家都需要休闲娱乐工具,来放松自己,缓解压力,消除紧张的疲劳状态。在这样的背景下,打砖块游戏作为一向休闲手机游戏应运而生,它不仅能舒缓我们的身心,而且能够开发我们的动手能力,提高自己的反应敏捷程度,充实自己。 二、游戏规则设计: BeatBrick:打砖块游戏的游戏规则为,每局有三个球,也就是有三条生命。首先发球,球在击打砖块后弹回。此时,须用球拍接住弹回的球并令其继续击打砖块。否则,球会掉出屏幕。直至球全部使用完或通全关则游戏结束。 游戏开始时,小球会停在挡板正中间,且此时挡板可左右自由移动,当按下空格键后小球会弹出,并在程序设定的区域内不停的碰撞反弹。当小球碰到墙壁、挡板和砖块时,均会以相反的速度反弹,并且砖块被碰撞后会自动消失。挡板可左右移动以接住小球,若小球没有被接住,超出指定区域下边缘,则程序会提示游戏结束,点击“确定”后退出程序。当所有的砖块均消失时,程序会提示你赢了。 三、游戏实现: 1、J2ME,即Java 2 Micro Edition,是SUN公司推出的在移动设备上运行的微型版Java平台,常见的移动设备有手机,PDA,电子词典,以及各式各样的信息终端如机顶盒等等。最重要的移动终端当然是手机了,因此,我们主要讨论手机相关的J2ME规范。 J2ME是Sun公司为嵌入式开发所定义的一个框架,一系列标准的规范所组成。所以J2ME是一个协议簇,而不是单一的规范。 2、游戏由6个类构成: GameScreen:GameScreen类表示游戏的核心,它包括对象的移动、图像的绘制以读取和响应用户的输人。本游戏从MIDP LCDUI的低级Canvas类派生一个类来代表游戏的屏幕,后面将对这个类进行详细的说明。 BeatBrick:由MIDIet继承而来的应用程序类来代表这个应用程序。这个类的作用就像其他的MIDIet一样,是和应用程序管理器(AMS)的接口。AMS会调用MIDIet的startApp 、pauseApp和destroyApp方法,告诉什么时候游戏开始、暂停和将要结束。 TextForm:这个类在屏幕上显示一段文字,然后再返回到菜单中。对于Help 和About对话框的实现这是一个很有用的方法。本游戏就是采用这个方法,由于这种显示是完全独立的,因此需要继承Form类来实现Form对象。 GameOver:告诉玩家游戏结束,制作方法和Splash类类似。 Splash:这个类的作用仅仅在于向玩家强调他们选择了该游戏,同时为游戏做一些宣传。闪屏是玩家运行游戏时第一个看到的图案,因此应该将它设计得非常绚丽。如果是针对Nokia手机开发游戏,还可以将闪屏制作成全屏的,那样效果会更好。有兴趣的读者可以将自己的闪屏设计得更好看或是动态的闪屏。 MainMenu:每一个游戏都应该有菜单系统,即使只包含“开始一个新游戏”和“退出游戏”的选项。本游戏包括了开始一个新游戏、如何运行游戏的帮助、游戏的信息和退出游戏的选项。产生菜单最简单的办法就是从LCDUI的List类

打砖块游戏

Flash动画制作课程教案

打砖块游戏的设计与实现片段讲稿 打砖块游戏的设计与实现: 一、游戏运行效果演示 向同学们演示效果,介绍游戏的基本功能。 二、游戏规则 打砖块游戏的基本规则。 三、解决方法 1.解决方法-设计界面 1)准备相应的素材,包含以下元件:砖块、小球、挡板、横向墙壁和纵向墙壁。 2)把元件从库里面拖出实例、并放到合适的位置,并给元件实例设置实例名。界面图如下: 元件实例名列表如下: 用于显示分数的动态文本绑定变量“fenshu”。 2.解决方法-需要解决的问题 1)如何实现多个砖块的显示? 1.在舞台上创建元件的一个实例。(操作) 2.复制出元件的多个实例。(复制影片剪辑方法:duplicateMovieClip())

3.给新复制出的多个元件实例相应的属性赋值。 实现程序思路:(假设舞台上共放20个砖块,分4行排列)如图所示。 第一块砖zhuan0与zhuan的x属性的关系:相等。zhuan0._x=zhuan._x 第二块砖zhuan1与zhuan的x属性的关系:zhuan1的x属性的值等于zhuan的x属性的值加上zhuan的宽度。zhuan1._x=zhuan._x+zhuan._width。 第六块砖zhuan5与zhuan的x属性的关系:相等。zhuan5._x=zhuan._x+zhuan._width*0 推出结论:_root["zhuan"+i]._x=zhuan._x+(i%5)*zhuan._width; 采用同样的方法分析y属性推出结论: _root["zhuan"+i]._y=zhuan._y+(Math.floor (i/5))*zhuan._height; for(i=0;i<=19;i++) { //复制元件 duplicateMovieClip("zhuan","zhuan"+i,i); //设置复制后元件的新属性 _root["zhuan"+i]._x=zhuan._x+(i%5)*zhuan._width; _root["zhuan"+i]._y=zhuan._y+(Math.floor (i/5))*zhuan._height; _root["zhuan"+i]._width=zhuan._width; _root["zhuan"+i]._height=zhuan._height; } 2)如何实现挡板跟随鼠标的移动? 挡板元件当前的x坐标=鼠标光标的x坐标 banzi._x=_root._xmouse ; 和enterFrame事件结合实现。 root.onEnterFrame =function() { banzi._x=_root._xmouse ; } 3)如何实现小球的自动运动?

打砖块-教学设计

《打砖块》教学设计 一、教学内容 出自广东教育出版社的小学信息技术课本第三册(下)B版。 二、教材分析 本课是本书的第10课,这节课主要是在于通过编写小游戏来激发学生学习的乐趣,通过Scratch软件制作的小游戏,来提高对Scratch的编程水平。通过制作“打砖块”的小游戏,引导学生在制作的过程中,进一步了解Scratch编程的主要步骤:明确效果需求、选用哪些模块搭建脚本程序、具体如何搭建,为后面更精彩的课程打下基础。 三、学生分析 通过认识Scratch、魔术表演、演奏音乐、漂亮的风车、幸运大转盘、猫抓老鼠等这几课的学习,让学生充分领略到了Scratch编程软件的乐趣。本课教学对象是小学六年级学生。此年龄段学生喜欢玩各类电子游戏,对游戏规则和游戏中途控制等相关内容感兴趣;虽然已对Scratch程序设计中程序脚本的制作方法有了初步了解,但对Scratch软件中众多的控件功能、作用还不了解,需要进一步的学习。因此,这节课主要在于通过自己动手编写游戏的过程激发学生们对Scratch进一步的探索,留出足够的时间让学生动手操作,让学生感受Scratch软件的神奇,体验成功的乐趣。 四、教学目标 1.知识与技能 (1)掌握侦测鼠标位置方法。 (2)学会角色方向设置。 (3)学会设置停止和奖励机制。 2.过程与方法 通过制作“打砖块”的游戏,了解Scratch软件创作游戏的步骤与过程,为以后的学习创作出更多有趣的动画与游戏。

3.情感态度与价值观 通过小游戏的制作,让学生体验到成功的喜悦,进一步增进学习Scratch 的兴趣。 五、教学重难点 教学重点:掌握侦测鼠标位置方法,学会方向设置。 教学难点:了解小球在舞台中运行时移动方向及在碰到物体后的反弹的方向。 六、教学准备 多媒体课件、Scratch、《打砖块》游戏以及相关素材 七、教学过程

打砖块游戏设计报告

************* 面向对象方法及程序设计 课程设计报告 打砖块游戏的设计与开发 分组:第九组 组员姓名:******************** 班级: *********** 指导教师: **** 完成日期:2014年 06月21日

题目:打砖块游戏的开发与设计 为了加强计算机科学与技术专业学生的学科实践能力,巩固和强化所学专业知识,提高学生的学习兴趣,本课程设计实践周特别强调理论与实践相结合,利用所学专业知识,进行实践项目的开发,提高学生的实践编程能力和技术文档的写作能力,提高学生的学习兴趣,,为后期的学习奠定一定的实践基础。 目录 第一章课程设计的目的与要求 (3) 1.1课程设计目的 (3) 1.2 课程设计的实验环境 (3) 1.3 课程设计的预备知识 (3) 1.4课程设计要求 (3) 1.4.1人员分配,形成课程设计小组 (3) 1.4.2 分析课程设计的题目要求 (3) 1.4.3写出详细的设计说明 (3) 第二章课程设计内容 (3) 2.1设计思路 (3) 2.2功能介绍 (4) 2.3相关素材 (4) 2.4程序整体设计说明 (4) 2.5程序部分源代码及注释 (4) 2.6程序结构流程图 (6) 2.7程序代码 (6) 2.8运行程序 (17) 第三章课程设计总结 (17)

第一章课程设计的目的与要求 1.1课程设计目的 本次课程设计是计算机科学与技术专业最重要的实践环节之一。 本次课程设计的目的和任务: 1.巩固和加深学生对VC++语言的基本知识的理解和掌握; 2.掌握VC++语言编程和程序调试的基本技能; 3.利用VC++语言进行基本的软件设计; 4.掌握书写程序设计说明文档的能力; 5.提高运用VC++解决实际问题的能力; 1.2 课程设计的实验环境 硬件环境要求能运行Windows 2000/XP操作系统的微机系统,VC++程序设计及相应的开发环境。 1.3 课程设计的预备知识 熟悉C语言及C语言的开发工具 1.4课程设计要求 1.4.1人员分配,形成课程设计小组 按照指导教师的要求,参与课程设计的同学根据彼此学习间的默契度以及在游戏设计上想法的不谋而合,自由的选择自己的队友,形成课题设计小组。 指导教师要求每组成员人数必须控制在3~5人之间,使得在课程设计的过程中,尽量的保证每个人都能够参与其中,积极的动脑思考。我们是第九组课程设计小组。 1.4.2 分析课程设计的题目要求 为了使得课程设计能够更加的独特,并且能够在最大限度上呈现出一个完美的课程设计,体现出同学们的创新的好的想法,指导教师给我们准备了不同的设计课题。 我们组选择的课题是“打砖块”的游戏设计与开发。 1.4.3写出详细的设计说明 针对我们的这个课程设计,我们小组的成员,查阅了大量的相关的专业书籍,并在游戏的一些细节问题上,充分参考了指导老师的意见和建议。 第二章课程设计内容 2.1设计思路 首先,本次课程设计的主要目的就是为了增强同学们的专业课知识,是对专业书上的知识的进一步巩固和实践!为了更好的去完成本次的课程设计,我们针对手机游戏被广大消费

对抗游戏课程设计

对抗游戏课程设计 信抗班袁爽 913104480110 一、程序功能简介 一个对抗游戏,根据随机产生的数字决定双方的输赢,并且按分数进行游戏。 二、课程设计要求 (1)当双方进行游戏时,游戏者可根据自身的牌点决定是否继续下注,例如拿到A把握增大,则在计算机的牌点出来之前加大赌注,但不超过5点。 (2)将双方牌点的比较扩大为两张牌点之和,若出现一组对子,则对子牌点大于任何单牌,若双方均为对子,则比较牌点之和。 三、程序算法说明 注明:因为是自己手写的程序,自己友元函数用的不是很熟练,没有像书上一样把比较函数封装到类里面,是在主函数中直接进行了比较过程,而且自己更改了书中显示牌的方法,自己写了一个显示牌的函数(op)封装到了类里,以后显示函数的过程就没有那么长了。还有一点是关于加注这个动作,不清楚加注确切是加到哪里,程序中我将其加入了score里面。详细程序标注: #include #include #include #define MAX 13 //牌的最大点为13 class War //生成一个类 { int plyr, comp,PLYR,COMP;//plyr玩者的第一轮牌点, comp计算机的第一轮牌点,PLYR玩家的第二轮牌点,COMP计算机第二轮牌点 static int Score;//玩者的分数,当分数为小于等于0或大于等于52时游戏结束 static int Loop;//出牌次数,游戏结束时给出总的出牌次数 int stake;//加注的量,大于等于1小于等于5 public: int Player1();//返回玩者第一轮的牌点 int Player2();//返回玩家第二轮的牌点 int Computer1();//返回计算机第一轮的牌点 int Computer2();//返回计算机第二轮的牌点 void Initialize1();//给出玩者和计算机的第一轮牌点 void Initialize2();//给出玩者和计算机的第二轮牌点 int CheckScore();//返回玩者分数 void GameOver();//游戏结束,显示玩的轮数 War();//缺省构造函数,初始化对象 static int Increase(int s);//分数增加 static int Decrease(int s);//分数减少 static int Loops();//出牌次数增加 int Gamers();//加大赌注 void op(int x);//显示随机生成数字对应的牌点,简化主程序 int Returnloops(); };

相关文档
最新文档