PC-3D-30-30-30-mint sum int m int n什么意思

3d坦克-30%3天是什么意思_百度知道
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
3d坦克-30%3天是什么意思
我有更好的答案
-30%意思就是减少30%,相当于free30%,就是现价为原价的70%(这是外国人的习惯说法);三天就不解释了,都懂也就是通常说的打7折(在三天时间内)求采纳~~
采纳率:94%
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包PC - 歌单 - 网易云音乐
播放:26次
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:如此生活三十年。 - 歌单 - 网易云音乐
如此生活三十年。
一个杂乱无章的歌单 包含民谣 轻摇滚 流行 爵士
播放:1836次
喜欢这个歌单的人
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:&figure&&img src=&/v2-870c487fca1abc492f154e140f3ec9a0_b.jpg& data-rawwidth=&1523& data-rawheight=&869& class=&origin_image zh-lightbox-thumb& width=&1523& data-original=&/v2-870c487fca1abc492f154e140f3ec9a0_r.jpg&&&/figure&&p&本工程难度:★★☆☆☆&/p&&h2&&b&前言&/b&&/h2&&p&12月8日,TGA 2017各项获奖名单公布,茶杯头(Cuphead)获得最佳艺术指导和最佳独立游戏两项大奖,可谓实至名归。&/p&&p&记得6月的时候我还在苦苦等待某狗头人的黑暗剑21(已经不存在了),在看E3发布会直播时,一款名为茶杯头的游戏立刻吸引了我,就冲这复古的画风我肯定买爆啊!待到发售日听闻好评一片而且难度极高,我心里暗自琢磨:哼,我可是黑魂三部曲总时间超过两百个小时,和历代薪王谈笑风生,什么大场面没见过,一个小小的茶杯头还想难倒我?拿起手柄开搞!然后我就被打脸了……&/p&&figure&&img src=&/v2-46caa1de963dc9b4dca6c_b.jpg& data-size=&normal& data-rawwidth=&1382& data-rawheight=&726& class=&origin_image zh-lightbox-thumb& width=&1382& data-original=&/v2-46caa1de963dc9b4dca6c_r.jpg&&&figcaption&看到最多的就是这个画面&/figcaption&&/figure&&p&经历了重重磨难通关后,回头看了眼自己的死亡记录,emmmmm……&/p&&figure&&img src=&/v2-3bda1b11_b.jpg& data-size=&normal& data-rawwidth=&1366& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1366& data-original=&/v2-3bda1b11_r.jpg&&&figcaption&大概就是这样吧……&/figcaption&&/figure&&p&似乎找到了当初激情黑魂的感觉,茶杯之魂,名不虚传,在下佩服。&/p&&figure&&img src=&/v2-4cbbc67cb2dc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1003& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1003& data-original=&/v2-4cbbc67cb2dc_r.jpg&&&/figure&&p&嘛,总之茶杯头是一款素质极佳的横板闯关游戏,在刚发售的那段时间里成为了各大游戏主播的新受苦素材,人气颇高。实际上,这款游戏就是用Unity制作的,这就引起了我的兴趣,作为一名Unity程序猿,肯定要尝试复刻一下啦。那么接下来,就开始我们的Cuphead之旅吧。本期先从主角茶杯头的基本操作开始介绍。&/p&&p&&br&&/p&&h2&&b&状态分析&/b&&/h2&&p&对于角色的基本操作来说,如何处理好角色状态之间的切换是重中之重。茶杯头的教学关卡中几乎已经囊括了角色的所有状态,基本可以总结为下图中的几大类。在本期中仅介绍其中的一部分供大家参考。主要运用到的Unity模块为动画模块和2D物理模块。&/p&&figure&&img src=&/v2-4afba62f79f62545e23e_b.jpg& data-size=&normal& data-rawwidth=&699& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&699& data-original=&/v2-4afba62f79f62545e23e_r.jpg&&&figcaption&角色状态一览&/figcaption&&/figure&&p&&b&1.角色移动&/b&&/p&&p&首先角色的默认状态为站立闲置,当按下方向键(A或D)时向左/右移动,抬起时停止移动。同时需要注意,在处于下蹲状态时角色是不会移动的,所以在移动的函数中要先判断是否处于下蹲状态再根据情况改变角色速度。&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_Move&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&dic&/span&&span class=&p&&)&/span& &span class=&c1&&//dic代表面向方向,左为-1,右为1&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(!&/span&&span class=&n&&_isDown&/span&&span class=&p&&)&/span& &span class=&c1&&//判断是否为下蹲状态&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&dic&/span& &span class=&p&&*&/span& &span class=&n&&_moveSpeed&/span&&span class=&p&&,&/span& &span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&);&/span& &span class=&c1&&//直接用rigidbody.velocity赋予角色速度&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetBool&/span&&span class=&p&&(&/span&&span class=&s&&&IsWalk&&/span&&span class=&p&&,&/span& &span class=&k&&true&/span&&span class=&p&&);&/span& &span class=&c1&&//触发行走动画&/span&
&span class=&n&&_isWalking&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&c1&&//当前进方向与面向方向不一致时反转角色&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&dic&/span& &span class=&p&&&&/span& &span class=&m&&0&/span& &span class=&p&&&&&/span& &span class=&p&&!&/span&&span class=&n&&_isFacingRight&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_Reverse&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span& &span class=&nf&&if&/span& &span class=&p&&(&/span&&span class=&n&&dic&/span& &span class=&p&&&&/span& &span class=&m&&0&/span& &span class=&p&&&&&/span& &span class=&n&&_isFacingRight&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_Reverse&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_StopMove&/span&&span class=&p&&()&/span& &span class=&c1&&//停止移动&/span&
&span class=&p&&{&/span&
&span class=&c1&&//判断是否为冲刺状态,若在冲刺则保持速度不变&/span&
&span class=&k&&if&/span& &span class=&p&&(!&/span&&span class=&n&&_isDash&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetBool&/span&&span class=&p&&(&/span&&span class=&s&&&IsWalk&&/span&&span class=&p&&,&/span& &span class=&k&&false&/span&&span class=&p&&);&/span&
&span class=&n&&_isWalking&/span& &span class=&p&&=&/span& &span class=&k&&false&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&角色移动效果如下图(一个完整的左脚换右脚再换回左脚总共是16张图片组成的帧动画,抠图抠的爽歪歪):&/p&&figure&&img src=&/v2-7f1cbfeee465_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-7f1cbfeee465_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-7f1cbfeee465_r.gif&&&/figure&&p&&br&&/p&&p&&b&2.角色跳跃&/b&&/p&&p&角色跳跃直接改变角色在Y轴方向上的速度,这里的重点在于站立动画和跳跃动画的切换。我在这里采用的方法是在角色脚下放置监测点,通过向下发射射线检测的方式确认角色是否接触地面并控制动画状态机的相关变量,射线检测的距离可以按照实际需要调整。&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&c1&&//Update函数中的相关代码&/span&
&span class=&k&&if&/span& &span class=&p&&(!&/span&&span class=&n&&_isGrounded&/span& &span class=&p&&&&&/span& &span class=&p&&!&/span&&span class=&n&&_isJump&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetBool&/span&&span class=&p&&(&/span&&span class=&s&&&IsJump&&/span&&span class=&p&&,&/span& &span class=&k&&true&/span&&span class=&p&&);&/span&
&span class=&n&&_isJump&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span& &span class=&nf&&if&/span&&span class=&p&&(&/span&&span class=&n&&_isGrounded&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetBool&/span&&span class=&p&&(&/span&&span class=&s&&&IsJump&&/span&&span class=&p&&,&/span& &span class=&k&&false&/span&&span class=&p&&);&/span&
&span class=&n&&_isJump&/span& &span class=&p&&=&/span& &span class=&k&&false&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(!&/span&&span class=&n&&_isAlreadyLand&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&GroundDust&/span&&span class=&p&&();&/span& &span class=&c1&&//产生落地的灰尘&/span&
&span class=&n&&_isAlreadyLand&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&//End Update&/span&
&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_Jump&/span&&span class=&p&&()&/span& &span class=&c1&&//角色跳跃&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&_jumpSpeed&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&跳跃效果如下(特地看了一下原版游戏,一次完整的跳跃大概是跳跃动画循环两次,哇,我是有多无聊……):&/p&&figure&&img src=&/v2-3a49d2f911d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-3a49d2f911d_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-3a49d2f911d_r.gif&&&/figure&&p&&br&&/p&&p&&b&3.角色下蹲&/b&&/p&&p&下蹲也是检测按钮状态,按下或按住则蹲下,抬起则恢复到站立状态。这里的关键点在于如果处于跳跃状态一定要将下蹲状态关闭,否则在下蹲时按下跳跃按钮并在跳跃状态中放开下蹲按钮,当角色落地时就会一直处于下蹲状态(嗯,bug就是这么产生的……)&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_Down&/span&&span class=&p&&(&/span&&span class=&kt&&bool&/span& &span class=&n&&isDown&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetBool&/span&&span class=&p&&(&/span&&span class=&s&&&IsDown&&/span&&span class=&p&&,&/span& &span class=&n&&isDown&/span&&span class=&p&&);&/span&
&span class=&n&&_isDown&/span& &span class=&p&&=&/span& &span class=&n&&isDown&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&_isJump&/span&&span class=&p&&)&/span& &span class=&c1&&//跳跃时下蹲无效&/span&
&span class=&p&&{&/span&
&span class=&k&&return&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&isDown&/span&&span class=&p&&)&/span& &span class=&c1&&//下蹲时停止移动&/span&
&span class=&p&&{&/span&
&span class=&n&&_StopMove&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&效果如下(看我上下鬼畜!):&/p&&figure&&img src=&/v2-d4d732afe32dff7e0b9c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-d4d732afe32dff7e0b9c_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-d4d732afe32dff7e0b9c_r.gif&&&/figure&&p&&br&&/p&&p&&b&4.角色冲刺&/b&&/p&&p&角色冲刺时要注意是不受重力影响的,所以在角色处于冲刺状态时将其重力影响设置为0,冲刺结束后再设置回来;并且还要考虑在空中的特殊情况,如果在空中已经冲刺则需要禁止再次触发冲刺状态,以免出现在空中多次冲刺的尴尬场面……&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&c1&&//Update中的相关代码&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&_isDash&/span& &span class=&p&&&&&/span& &span class=&p&&(&/span&&span class=&n&&_stateInfo&/span&&span class=&p&&.&/span&&span class=&n&&IsName&/span&&span class=&p&&(&/span&&span class=&s&&&DashGround&&/span&&span class=&p&&)&/span& &span class=&p&&||&/span& &span class=&n&&_stateInfo&/span&&span class=&p&&.&/span&&span class=&n&&IsName&/span&&span class=&p&&(&/span&&span class=&s&&&DashAir&&/span&&span class=&p&&)))&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&_faceDic&/span& &span class=&p&&*&/span& &span class=&n&&_dashSpeed&/span&&span class=&p&&,&/span& &span class=&m&&0&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&_stateInfo&/span&&span class=&p&&.&/span&&span class=&n&&normalizedTime&/span& &span class=&p&&&&/span& &span class=&m&&0.9&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&velocity&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&m&&0&/span&&span class=&p&&);&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&gravityScale&/span& &span class=&p&&=&/span& &span class=&m&&6&/span&&span class=&p&&;&/span&
&span class=&n&&_isDash&/span& &span class=&p&&=&/span& &span class=&k&&false&/span&&span class=&p&&;&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetTrigger&/span&&span class=&p&&(&/span&&span class=&s&&&QuitDash&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&//End Update&/span&
&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_Dash&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&_isAlreadyAirDash&/span&&span class=&p&&)&/span& &span class=&c1&&//如果在空中已经冲刺则返回&/span&
&span class=&p&&{&/span&
&span class=&k&&return&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span&&span class=&p&&(!&/span&&span class=&n&&_isGrounded&/span&&span class=&p&&)&/span& &span class=&c1&&//在地面和空中分别触发不同的动画&/span&
&span class=&p&&{&/span&
&span class=&n&&_rigidbody&/span&&span class=&p&&.&/span&&span class=&n&&gravityScale&/span& &span class=&p&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetTrigger&/span&&span class=&p&&(&/span&&span class=&s&&&AirDash&&/span&&span class=&p&&);&/span&
&span class=&n&&_isAirDash&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&n&&_isAlreadyAirDash&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetTrigger&/span&&span class=&p&&(&/span&&span class=&s&&&GroundDash&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&n&&_isDash&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&效果如下(请自行脑补xiu~xiu~xiu~的声音):&/p&&figure&&img src=&/v2-11af65e2dbee48_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-11af65e2dbee48_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-11af65e2dbee48_r.gif&&&/figure&&p&&br&&/p&&p&&b&5.角色射击&/b&&/p&&p&射击状态是条件限制最多的状态,需要考虑的情况较多。首先,原地站立时按下上键会向上射击。行走时按下射击键会切换到行走射击动画,这里需要运用到blend tree,如果仅按下射击键则将Thresh值设置到向正前方射击的区域;如果还按下了上键,需要将Thresh值设置到斜上方射击的区域;如果放开射击键,还需要将Thresh值设置到初始未射击的区域。如果处于跳跃状态,仅可向正前方和下方发射子弹。好吧,说的我自己都晕了,但这里一定要注意这些细节的处理。&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_Shoot&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&_shootDic&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&_faceDic&/span&&span class=&p&&,&/span& &span class=&m&&0&/span&&span class=&p&&);&/span& &span class=&c1&&//射击方向,为后面的子弹运动做准备&/span&
&span class=&n&&_bulletBornPos&/span& &span class=&p&&=&/span& &span class=&n&&_standBulletPos&/span&&span class=&p&&;&/span& &span class=&c1&&//子弹产生点&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&_isWalking&/span& &span class=&p&&&&&/span& &span class=&p&&!&/span&&span class=&n&&_isJump&/span&&span class=&p&&)&/span& &span class=&c1&&//在地面行走时射击&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&Input&/span&&span class=&p&&.&/span&&span class=&n&&GetKeyDown&/span&&span class=&p&&(&/span&&span class=&n&&KeyCode&/span&&span class=&p&&.&/span&&span class=&n&&W&/span&&span class=&p&&)&/span& &span class=&p&&||&/span& &span class=&n&&Input&/span&&span class=&p&&.&/span&&span class=&n&&GetKey&/span&&span class=&p&&(&/span&&span class=&n&&KeyCode&/span&&span class=&p&&.&/span&&span class=&n&&W&/span&&span class=&p&&))&/span& &span class=&c1&&//若按下向上按钮,动画变为向斜上方射击的同时步行&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetFloat&/span&&span class=&p&&(&/span&&span class=&s&&&WalkState&&/span&&span class=&p&&,&/span& &span class=&m&&1f&/span&&span class=&p&&);&/span&
&span class=&n&&_shootDic&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&n&&_faceDic&/span&&span class=&p&&,&/span& &span class=&m&&1&/span&&span class=&p&&).&/span&&span class=&n&&normalized&/span&&span class=&p&&;&/span&
&span class=&n&&_bulletBornPos&/span& &span class=&p&&=&/span& &span class=&n&&_walkRightUpBulletPos&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetFloat&/span&&span class=&p&&(&/span&&span class=&s&&&WalkState&&/span&&span class=&p&&,&/span& &span class=&m&&0.333f&/span&&span class=&p&&);&/span&
&span class=&n&&_bulletBornPos&/span& &span class=&p&&=&/span& &span class=&n&&_walkRightBulletPos&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&_timeCount&/span& &span class=&p&&+=&/span& &span class=&n&&Time&/span&&span class=&p&&.&/span&&span class=&n&&deltaTime&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&_timeCount&/span& &span class=&p&&&=&/span& &span class=&m&&0.0165&/span& &span class=&p&&*&/span& &span class=&m&&9&/span&&span class=&p&&)&/span& &span class=&c1&&//设定行走射击的时间间隔&/span&
&span class=&p&&{&/span&
&span class=&n&&_timeCount&/span& &span class=&p&&=&/span& &span class=&m&&0f&/span&&span class=&p&&;&/span&
&span class=&n&&WalkShoot&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span& &span class=&nf&&if&/span&&span class=&p&&(!&/span&&span class=&n&&_isWalking&/span& &span class=&p&&&&&/span& &span class=&p&&!&/span&&span class=&n&&_isJump&/span&&span class=&p&&)&/span& &span class=&c1&&//原地站立时射击&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetBool&/span&&span class=&p&&(&/span&&span class=&s&&&IsShoot&&/span&&span class=&p&&,&/span& &span class=&k&&true&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&Input&/span&&span class=&p&&.&/span&&span class=&n&&GetKeyDown&/span&&span class=&p&&(&/span&&span class=&n&&KeyCode&/span&&span class=&p&&.&/span&&span class=&n&&W&/span&&span class=&p&&)&/span& &span class=&p&&||&/span& &span class=&n&&Input&/span&&span class=&p&&.&/span&&span class=&n&&GetKey&/span&&span class=&p&&(&/span&&span class=&n&&KeyCode&/span&&span class=&p&&.&/span&&span class=&n&&W&/span&&span class=&p&&))&/span& &span class=&c1&&//若按下向上按钮则播放向上射击动画&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetFloat&/span&&span class=&p&&(&/span&&span class=&s&&&IdleState&&/span&&span class=&p&&,&/span& &span class=&m&&1f&/span&&span class=&p&&);&/span&
&span class=&n&&_shootDic&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector2&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&m&&1&/span&&span class=&p&&).&/span&&span class=&n&&normalized&/span&&span class=&p&&;&/span&
&span class=&n&&_bulletBornPos&/span& &span class=&p&&=&/span& &span class=&n&&_standUpBulletPos&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&p&&{&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetFloat&/span&&span class=&p&&(&/span&&span class=&s&&&IdleState&&/span&&span class=&p&&,&/span& &span class=&m&&0f&/span&&span class=&p&&);&/span&
&span class=&n&&_bulletBornPos&/span& &span class=&p&&=&/span& &span class=&n&&_standBulletPos&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&//蹲下及跳跃时射击请参考源代码&/span&
&span class=&n&&_isShoot&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&运行效果如下(吃我一发空气弹!):&/p&&figure&&img src=&/v2-8ee7fb85a5ae179ba49a36_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-8ee7fb85a5ae179ba49a36_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-8ee7fb85a5ae179ba49a36_r.gif&&&/figure&&h2&&b&让子弹飞&/b&&/h2&&p&角色的基本操作暂时先介绍这么多,接下来要介绍子弹运动及动画效果该如何实现。&/p&&p&首先要做的,是要确定子弹的产生位置,为此,需要在角色身上按照不同的射击动画时手指的位置设置好子弹诞生点:&/p&&figure&&img src=&/v2-cbcbaf924fdb5f57af95b_b.jpg& data-size=&normal& data-rawwidth=&183& data-rawheight=&167& class=&content_image& width=&183&&&figcaption&角色身上挂载的子弹产生点&/figcaption&&/figure&&p&接下来就是该在何时产生子弹,如果是站立或下蹲时射击,则在射击动画的第一帧添加发射子弹的帧事件;若是在行走或跳跃时射击,则按照一定的时间间隔产生子弹。同时在玩家的相关代码中要将射击子弹的消息传递给子弹管理器,这里我采用的是事件传递的方式:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&public&/span& &span class=&k&&event&/span& &span class=&n&&Action&/span&&span class=&p&&&&/span&&span class=&n&&Vector2&/span&&span class=&p&&,&/span& &span class=&n&&Vector2&/span&&span class=&p&&&&/span& &span class=&n&&OnShoot&/span&&span class=&p&&;&/span& &span class=&c1&&//站立射击实践&/span&
&span class=&k&&public&/span& &span class=&k&&event&/span& &span class=&n&&Action&/span&&span class=&p&&&&/span&&span class=&n&&Vector2&/span&&span class=&p&&,&/span& &span class=&n&&Vector2&/span&&span class=&p&&,&/span& &span class=&n&&Transform&/span&&span class=&p&&&&/span& &span class=&n&&OnWalkShoot&/span&&span class=&p&&;&/span& &span class=&c1&&//行走射击事件&/span&
&span class=&k&&public&/span& &span class=&k&&void&/span& &span class=&nf&&ShootBullet&/span&&span class=&p&&()&/span& &span class=&c1&&//站立射击的帧事件&/span&
&span class=&p&&{&/span&
&span class=&n&&Vector2&/span& &span class=&n&&bornPos&/span& &span class=&p&&=&/span& &span class=&n&&_bulletBornPos&/span&&span class=&p&&.&/span&&span class=&n&&position&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&OnShoot&/span& &span class=&p&&!=&/span& &span class=&k&&null&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&OnShoot&/span&&span class=&p&&(&/span&&span class=&n&&bornPos&/span&&span class=&p&&,&/span& &span class=&n&&_shootDic&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&//行走射击时需要再传一个子弹产生点的transform参数,其余和站立射击相似&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&我们还需要一个子弹管理器来生成子弹,将玩家的射击事件传入并在特定位置创建子弹,同时,我们也可以在这个脚本中管理子弹生成时的特效。这里需要注意的是在行走时射击的话,需要将子弹生成特效的父节点设置为子弹生成点,这样的话,biubiubiu特效就能跟着手指走啦;还需要特别指出一点,向正前方射击时每一颗子弹并不是在同一水平面上的,也就是说,子弹要有一定的垂直偏移,这样才有一种子弹忽上忽下的视觉效果,在代码中就需要一个列表来存储子弹的垂直偏移量,通过循环获取列表的方式改变子弹位置的Y值:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_OnShoot&/span&&span class=&p&&(&/span&&span class=&n&&Vector2&/span& &span class=&n&&bornPos&/span&&span class=&p&&,&/span& &span class=&n&&Vector2&/span& &span class=&n&&shootDic&/span&&span class=&p&&)&/span& &span class=&c1&&//站立射击&/span&
&span class=&p&&{&/span&
&span class=&kt&&var&/span& &span class=&n&&born&/span& &span class=&p&&=&/span& &span class=&n&&_GetBornInstance&/span&&span class=&p&&();&/span&
&span class=&n&&born&/span&&span class=&p&&.&/span&&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&position&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&bornPos&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&bornPos&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&);&/span&
&span class=&kt&&var&/span& &span class=&n&&bullet&/span& &span class=&p&&=&/span& &span class=&n&&_GetBulletInstance&/span&&span class=&p&&();&/span&
&span class=&n&&bullet&/span&&span class=&p&&.&/span&&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&position&/span& &span class=&p&&=&/span& &span class=&n&&_GetOffsetPos&/span&&span class=&p&&(&/span&&span class=&n&&bornPos&/span&&span class=&p&&);&/span&
&span class=&n&&bullet&/span&&span class=&p&&.&/span&&span class=&n&&GetComponent&/span&&span class=&p&&&&/span&&span class=&n&&Bullet&/span&&span class=&p&&&().&/span&&span class=&n&&StartMove&/span&&span class=&p&&(&/span&&span class=&n&&shootDic&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&c1&&//行走射击时需要设置子弹生成特效的父节点,其余和站立射击相似&/span&
&span class=&k&&private&/span& &span class=&n&&Vector3&/span& &span class=&nf&&_GetOffsetPos&/span&&span class=&p&&(&/span&&span class=&n&&Vector2&/span& &span class=&n&&pos&/span&&span class=&p&&)&/span& &span class=&c1&&//获取子弹位置的偏移量&/span&
&span class=&p&&{&/span&
&span class=&kt&&var&/span& &span class=&n&&offsetY&/span& &span class=&p&&=&/span& &span class=&n&&pos&/span&&span class=&p&&.&/span&&span class=&n&&y&/span& &span class=&p&&+&/span& &span class=&n&&_shootOffsets&/span&&span class=&p&&[&/span&&span class=&n&&_curOffsetIndex&/span&&span class=&p&&];&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&_curOffsetIndex&/span& &span class=&p&&&&/span& &span class=&m&&2&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_curOffsetIndex&/span& &span class=&p&&+=&/span& &span class=&m&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&p&&{&/span&
&span class=&n&&_curOffsetIndex&/span& &span class=&p&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&k&&new&/span& &span class=&nf&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&pos&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&offsetY&/span&&span class=&p&&,&/span& &span class=&p&&-&/span&&span class=&m&&1&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&子弹的运动直接通过改变transform.position实现,这里的重点之一是要将子弹旋转至前进方向,所以在开始运动前要先运用四元旋转改变子弹的rotation值;第二点要注意的是,如果子弹接触到地面或者敌人要有对应的反馈(也就是击中时的帧动画),这里我直接在子弹的预制体上加了trigger,运用trigger enter来判断是否要触发相应动画:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&public&/span& &span class=&k&&void&/span& &span class=&nf&&StartMove&/span&&span class=&p&&(&/span&&span class=&n&&Vector2&/span& &span class=&n&&shootDir&/span&&span class=&p&&)&/span& &span class=&c1&&//开始运动&/span&
&span class=&p&&{&/span&
&span class=&n&&_isMoving&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&n&&_moveDir&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&shootDir&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&shootDir&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&m&&0&/span&&span class=&p&&).&/span&&span class=&n&&normalized&/span&&span class=&p&&;&/span&
&span class=&kt&&var&/span& &span class=&n&&origin&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector3&/span&&span class=&p&&(&/span&&span class=&m&&1&/span&&span class=&p&&,&/span& &span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&m&&0&/span&&span class=&p&&).&/span&&span class=&n&&normalized&/span&&span class=&p&&;&/span&
&span class=&kt&&var&/span& &span class=&n&&rotate&/span& &span class=&p&&=&/span& &span class=&n&&Quaternion&/span&&span class=&p&&.&/span&&span class=&n&&FromToRotation&/span&&span class=&p&&(&/span&&span class=&n&&origin&/span&&span class=&p&&,&/span& &span class=&n&&_moveDir&/span&&span class=&p&&);&/span& &span class=&c1&&//根据子弹前进方向对其旋转&/span&
&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&rotation&/span& &span class=&p&&=&/span& &span class=&n&&rotate&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_Destroy&/span&&span class=&p&&()&/span& &span class=&c1&&//子弹的销毁&/span&
&span class=&p&&{&/span&
&span class=&n&&Destroy&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&);&/span&
&span class=&n&&_isMoving&/span& &span class=&p&&=&/span& &span class=&k&&false&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&OnTriggerEnter2D&/span&&span class=&p&&(&/span&&span class=&n&&Collider2D&/span& &span class=&n&&collision&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&collision&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&layer&/span& &span class=&p&&==&/span& &span class=&n&&_groundLayer&/span&&span class=&p&&.&/span&&span class=&k&&value&/span&&span class=&p&&)&/span& &span class=&c1&&//子弹触碰到地面时触发子弹击中动画&/span&
&span class=&p&&{&/span&
&span class=&n&&_isMoving&/span& &span class=&p&&=&/span& &span class=&k&&false&/span&&span class=&p&&;&/span&
&span class=&n&&_animator&/span&&span class=&p&&.&/span&&span class=&n&&SetTrigger&/span&&span class=&p&&(&/span&&span class=&s&&&Hit&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&其实,这种直接销毁子弹的方法消耗很大,若想获得更好的运行效率,需要运用到对象池,关于对象池,大家可以参考这篇文章&a href=&/p/& class=&internal&&【Unity】工具类系列教程——对象池!&/a&。&/p&&p&一切准备就绪,那么就让子弹飞起来吧:&/p&&figure&&img src=&/v2-cfada89c9cf4e1ff1179f8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-cfada89c9cf4e1ff1179f8_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-cfada89c9cf4e1ff1179f8_r.gif&&&/figure&&p&&br&&/p&&h2&&b&And More&/b&&/h2&&p&在茶杯头中,角色行走时,冲刺时,落地时均会产生灰尘溅散的效果,满满的都是细节。那么为了表现这些效果,我们同样要先确定好灰尘生成的位置并在玩家脚本中运用事件触发。接着和子弹一样再创建一个灰尘管理器,这里也有个细节需要注意,游戏中行走时的灰尘是有多个种类的(只能佩服制作组的良心),这里我只准备了三个预制体,在每次生成行走灰尘时要随机选取其中的一个:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&private&/span& &span class=&n&&GameObject&/span& &span class=&nf&&_GetDustInstance&/span&&span class=&p&&(&/span&&span class=&n&&DustType&/span& &span class=&n&&rType&/span&&span class=&p&&)&/span& &span class=&c1&&//根据灰尘的种类获取对应的灰尘预制体&/span&
&span class=&p&&{&/span&
&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&n&&rType&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&n&&DustType&/span&&span class=&p&&.&/span&&span class=&n&&WalkDust&/span&&span class=&p&&:&/span&
&span class=&kt&&int&/span& &span class=&n&&index&/span& &span class=&p&&=&/span& &span class=&n&&Random&/span&&span class=&p&&.&/span&&span class=&n&&Range&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span& &span class=&m&&3&/span&&span class=&p&&);&/span& &span class=&c1&&//获取随机数以便随机获取行走灰尘&/span&
&span class=&k&&return&/span& &span class=&nf&&Instantiate&/span&&span class=&p&&(&/span&&span class=&n&&_dustPrefabList&/span&&span class=&p&&[&/span&&span class=&n&&index&/span&&span class=&p&&]);&/span&
&span class=&k&&case&/span& &span class=&n&&DustType&/span&&span class=&p&&.&/span&&span class=&n&&DashDust&/span&&span class=&p&&:&/span&
&span class=&k&&return&/span& &span class=&nf&&Instantiate&/span&&span class=&p&&(&/span&&span class=&n&&_dashDustPrefab&/span&&span class=&p&&);&/span&
&span class=&k&&case&/span& &span class=&n&&DustType&/span&&span class=&p&&.&/span&&span class=&n&&GroundDust&/span&&span class=&p&&:&/span&
&span class=&k&&return&/span& &span class=&nf&&Instantiate&/span&&span class=&p&&(&/span&&span class=&n&&_groundDustPrefab&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&k&&null&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&private&/span& &span class=&k&&void&/span& &span class=&nf&&_CreateDust&/span&&span class=&p&&(&/span&&span class=&n&&Vector2&/span& &span class=&n&&pos&/span&&span class=&p&&,&/span& &span class=&n&&DustType&/span& &span class=&n&&rType&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&var&/span& &span class=&n&&instance&/span& &span class=&p&&=&/span& &span class=&n&&_GetDustInstance&/span&&span class=&p&&(&/span&&span class=&n&&rType&/span&&span class=&p&&);&/span&
&span class=&n&&instance&/span&&span class=&p&&.&/span&&span class=&n&&transform&/span&&span class=&p&&.&/span&&span class=&n&&position&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&Vector3&/span&&span class=&p&&(&/span&&span class=&n&&pos&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&pos&/span&&span class=&p&&.&/span&&span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&p&&-&/span&&span class=&m&&2&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&最终的效果就像下面这样啦(突然就酷炫了起来):&/p&&figure&&img src=&/v2-cc02310ed4fca95afb6e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&912& data-rawheight=&702& data-thumbnail=&/v2-cc02310ed4fca95afb6e_b.jpg& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/v2-cc02310ed4fca95afb6e_r.gif&&&/figure&&p&&br&&/p&&p&那么本期就介绍到这里了,完整代码请移步&a href=&/?target=https%3A///Yukimine33/CupheadCodeByMyself& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Yukimine33/CupheadCodeByMyself&i class=&icon-external&&&/i&&/a&。其实角色逻辑并不难,但要有足够的耐心去调整细节,还要把大量的精力放在裁剪图片及制作帧动画上,可想而知制作组花费了多少心血才能给玩家带来这样一部作品,也希望大家去多多支持这样的良心作品(购买链接:&a href=&/?target=http%3A///app/268910/Cuphead/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cuphead on Steam&i class=&icon-external&&&/i&&/a&)。下一期将补全角色的基本操作并开始Boss的制作,敬请期待(内心os:还有好多图要裁啊,还有好多代码要调整修改啊,也许摸了~)&/p&&p&&br&&/p&&p&&br&&/p&&p&噢,对了,有想学习游戏开发的同学,可移步至&a href=&/?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&围观一波哟。&/p&&p&&/p&&p&&/p&&p&&/p&
本工程难度:★★☆☆☆前言12月8日,TGA 2017各项获奖名单公布,茶杯头(Cuphead)获得最佳艺术指导和最佳独立游戏两项大奖,可谓实至名归。记得6月的时候我还在苦苦等待某狗头人的黑暗剑21(已经不存在了),在看E3发布会直播时,一款名为茶杯头的游戏立刻…
&figure&&img src=&/v2-886eefa37cb5e97b9ae0bd5c_b.jpg& data-rawwidth=&597& data-rawheight=&544& class=&origin_image zh-lightbox-thumb& width=&597& data-original=&/v2-886eefa37cb5e97b9ae0bd5c_r.jpg&&&/figure&&p&本篇部分代码的下载地址:&/p&&p&&a href=&/?target=https%3A///frombeijingwithlove/dlcv_for_beginners/tree/master/chap5& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/frombeijingw&/span&&span class=&invisible&&ithlove/dlcv_for_beginners/tree/master/chap5&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/p&&p&上篇:&a href=&/p/& class=&internal&&给深度学习入门者的Python快速教程 - 基础篇&/a&&br&&/p&&h2&5.3 Python的科学计算包 - Numpy&/h2&&p&numpy(&b&Num&/b&erical
&b&Py&/b&thon extensions)是一个第三方的Python包,用于科学计算。这个库的前身是1995年就开始开发的一个用于数组运算的库。经过了长时间的发展,基本上成了绝大部分Python科学计算的基础包,当然也包括所有提供Python接口的深度学习框架。&/p&&p&numpy在Linux下的安装已经在5.1.2中作为例子讲过,Windows下也可以通过pip,或者到下面网址下载:&/p&&p&&a href=&/?target=http%3A//www.scipy.org/scipylib/download.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Obtaining NumPy & SciPy libraries&i class=&icon-external&&&/i&&/a&&/p&&h3&5.3.1
基本类型(array)&/h3&&p&array,也就是数组,是numpy中最基础的数据结构,最关键的属性是维度和元素类型,在numpy中,可以非常方便地创建各种不同类型的多维数组,并且执行一些基本基本操作,来看例子:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&numpy&/span& &span class=&kn&&as&/span& &span class=&nn&&np&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&]&/span&
&span class=&c1&&#&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&)&/span&
&span class=&c1&&# array([1, 2, 3, 4])&/span&
&span class=&nb&&type&/span&&span class=&p&&(&/span&&span class=&n&&b&/span&&span class=&p&&)&/span&
&span class=&c1&&# &type 'numpy.ndarray'&&/span&
&span class=&n&&b&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&
&span class=&c1&&# (4,)&/span&
&span class=&n&&b&/span&&span class=&o&&.&/span&&span class=&n&&argmax&/span&&span class=&p&&()&/span&
&span class=&c1&&# 3&/span&
&span class=&n&&b&/span&&span class=&o&&.&/span&&span class=&n&&max&/span&&span class=&p&&()&/span&
&span class=&c1&&# 4&/span&
&span class=&n&&b&/span&&span class=&o&&.&/span&&span class=&n&&mean&/span&&span class=&p&&()&/span&
&span class=&c1&&# 2.5&/span&
&span class=&n&&c&/span& &span class=&o&&=&/span& &span class=&p&&[[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&]]&/span&
&span class=&c1&&# 二维列表&/span&
&span class=&n&&d&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&(&/span&&span class=&n&&c&/span&&span class=&p&&)&/span&
&span class=&c1&&# 二维numpy数组&/span&
&span class=&n&&d&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&
&span class=&c1&&# (2, 2)&/span&
&span class=&n&&d&/span&&span class=&o&&.&/span&&span class=&n&&size&/span&
&span class=&c1&&# 4&/span&
&span class=&n&&d&/span&&span class=&o&&.&/span&&span class=&n&&max&/span&&span class=&p&&(&/span&&span class=&n&&axis&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&&span class=&p&&)&/span&
&span class=&c1&&# 找维度0,也就是最后一个维度上的最大值,array([3, 4])&/span&
&span class=&n&&d&/span&&span class=&o&&.&/span&&span class=&n&&max&/span&&span class=&p&&(&/span&&span class=&n&&axis&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&c1&&# 找维度1,也就是倒数第二个维度上的最大值,array([2, 4])&/span&
&span class=&n&&d&/span&&span class=&o&&.&/span&&span class=&n&&mean&/span&&span class=&p&&(&/span&&span class=&n&&axis&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&&span class=&p&&)&/span&
&span class=&c1&&# 找维度0,也就是第一个维度上的均值,array([ 2.,
3.])&/span&
&span class=&n&&d&/span&&span class=&o&&.&/span&&span class=&n&&flatten&/span&&span class=&p&&()&/span&
&span class=&c1&&# 展开一个numpy数组为1维数组,array([1, 2, 3, 4])&/span&
&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&ravel&/span&&span class=&p&&(&/span&&span class=&n&&c&/span&&span class=&p&&)&/span&
&span class=&c1&&# 展开一个可以解析的结构为1维数组,array([1, 2, 3, 4])&/span&
&span class=&c1&&# 3x3的浮点型2维数组,并且初始化所有元素值为1&/span&
&span class=&n&&e&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&ones&/span&&span class=&p&&((&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&),&/span& &span class=&n&&dtype&/span&&span class=&o&&=&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&float&/span&&span class=&p&&)&/span&
&span class=&c1&&# 创建一个一维数组,元素值是把3重复4次,array([3, 3, 3, 3])&/span&
&span class=&n&&f&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&repeat&/span&&span class=&p&&(&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&)&/span&
&span class=&c1&&# 2x2x3的无符号8位整型3维数组,并且初始化所有元素值为0&/span&
&span class=&n&&g&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&),&/span& &span class=&n&&dtype&/span&&span class=&o&&=&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&uint8&/span&&span class=&p&&)&/span&
&span class=&n&&g&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&
&span class=&c1&&# (2, 2, 3)&/span&
&span class=&n&&h&/span& &span class=&o&&=&/span& &span class=&n&&g&/span&&span class=&o&&.&/span&&span class=&n&&astype&/span&&span class=&p&&(&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&float&/span&&span class=&p&&)&/span&
&span class=&c1&&# 用另一种类型表示&/span&
&span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&c1&&# 类似range,array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&linspace&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&6&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&)&/span&&span class=&c1&&# 等差数列,0到6之间5个取值,array([ 0., 1.5, 3., 4.5, 6.])&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&(&/span&
&span class=&p&&[[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&],&/span&
&span class=&p&&[&/span&&span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&6&/span&&span class=&p&&,&/span& &span class=&mi&&7&/span&&span class=&p&&,&/span& &span class=&mi&&8&/span&&span class=&p&&]]&/span&
&span class=&p&&)&/span&
&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&save&/span&&span class=&p&&(&/span&&span class=&s1&&'p.npy'&/span&&span class=&p&&,&/span& &span class=&n&&p&/span&&span class=&p&&)&/span&
&span class=&c1&&# 保存到文件&/span&
&span class=&n&&q&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&load&/span&&span class=&p&&(&/span&&span class=&s1&&'p.npy'&/span&&span class=&p&&)&/span&
&span class=&c1&&# 从文件读取&/span&
&/code&&/pre&&/div&&p&注意到在导入numpy的时候,我们将np作为numpy的别名。这是一种习惯性的用法,后面的章节中我们也默认这么使用。作为一种多维数组结构,array的数组相关操作是非常丰富的:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&numpy&/span& &span class=&kn&&as&/span& &span class=&nn&&np&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[[ 0,
3],&/span&
&span class=&sd&&
7],&/span&
&span class=&sd&&
9, 10, 11]],&/span&
&span class=&sd&&
[[12, 13, 14, 15],&/span&
&span class=&sd&&
[16, 17, 18, 19],&/span&
&span class=&sd&&
[20, 21, 22, 23]]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&mi&&24&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&reshape&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&))&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&][&/span&&span class=&mi&&1&/span&&span class=&p&&][&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&
&span class=&c1&&# 17&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[ 8,
9, 10, 11],&/span&
&span class=&sd&&
[20, 21, 22, 23]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&c&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[:,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&p&&:]&/span&
&span class=&sd&&''' 用:表示当前维度上所有下标&/span&
&span class=&sd&&array([[ 1,
9],&/span&
&span class=&sd&&
[13, 17, 21]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&d&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[:,&/span& &span class=&p&&:,&/span& &span class=&mi&&1&/span&&span class=&p&&]&/span&
&span class=&sd&&''' 用...表示没有明确指出的维度&/span&
&span class=&sd&&array([[ 1,
9],&/span&
&span class=&sd&&
[13, 17, 21]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&e&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&o&&...&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&]&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[[ 5,
6],&/span&
&span class=&sd&&
[ 9, 10]],&/span&
&span class=&sd&&
[[17, 18],&/span&
&span class=&sd&&
[21, 22]]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&f&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[:,&/span& &span class=&mi&&1&/span&&span class=&p&&:,&/span& &span class=&mi&&1&/span&&span class=&p&&:&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&平均分成3份&/span&
&span class=&sd&&[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]&/span&
&span class=&sd&&'''&/span&
&span class=&n&&g&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&split&/span&&span class=&p&&(&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&mi&&9&/span&&span class=&p&&),&/span& &span class=&mi&&3&/span&&span class=&p&&)&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&按照下标位置进行划分&/span&
&span class=&sd&&[array([0, 1]), array([2, 3, 4, 5]), array([6, 7, 8])]&/span&
&span class=&sd&&'''&/span&
&span class=&n&&h&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&split&/span&&span class=&p&&(&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&mi&&9&/span&&span class=&p&&),&/span& &span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&o&&-&/span&&span class=&mi&&3&/span&&span class=&p&&])&/span&
&span class=&n&&l0&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&mi&&6&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&reshape&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&))&/span&
&span class=&n&&l1&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arange&/span&&span class=&p&&(&/span&&span class=&mi&&6&/span&&span class=&p&&,&/span& &span class=&mi&&12&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&reshape&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&))&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&vstack是指沿着纵轴拼接两个array,vertical&/span&
&span class=&sd&&hstack是指沿着横轴拼接两个array,horizontal&/span&
&span class=&sd&&更广义的拼接用concatenate实现,horizontal后的两句依次等效于vstack和hstack&/span&
&span class=&sd&&stack不是拼接而是在输入array的基础上增加一个新的维度&/span&
&span class=&sd&&'''&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&vstack&/span&&span class=&p&&((&/span&&span class=&n&&l0&/span&&span class=&p&&,&/span& &span class=&n&&l1&/span&&span class=&p&&))&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&hstack&/span&&span class=&p&&((&/span&&span class=&n&&l0&/span&&span class=&p&&,&/span& &span class=&n&&l1&/span&&span class=&p&&))&/span&
&span class=&n&&q&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&concatenate&/span&&span class=&p&&((&/span&&span class=&n&&l0&/span&&span class=&p&&,&/span& &span class=&n&&l1&/span&&span class=&p&&))&/span&
&span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&concatenate&/span&&span class=&p&&((&/span&&span class=&n&&l0&/span&&span class=&p&&,&/span& &span class=&n&&l1&/span&&span class=&p&&),&/span& &span class=&n&&axis&/span&&span class=&o&&=-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&n&&s&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&stack&/span&&span class=&p&&((&/span&&span class=&n&&l0&/span&&span class=&p&&,&/span& &span class=&n&&l1&/span&&span class=&p&&))&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&按指定轴进行转置&/span&
&span class=&sd&&array([[[ 0,
3],&/span&
&span class=&sd&&
9]],&/span&
&span class=&sd&&
4],&/span&
&span class=&sd&&
[ 7, 10]],&/span&
&span class=&sd&&
5],&/span&
&span class=&sd&&
[ 8, 11]]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&t&/span& &span class=&o&&=&/span& &span class=&n&&s&/span&&span class=&o&&.&/span&&span class=&n&&transpose&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&))&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&默认转置将维度倒序,对于2维就是横纵轴互换&/span&
&span class=&sd&&array([[ 0,
8],&/span&
&span class=&sd&&
9],&/span&
&span class=&sd&&
6, 10],&/span&
&span class=&sd&&
7, 11]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&u&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span&&span class=&o&&.&/span&&span class=&n&&transpose&/span&&span class=&p&&()&/span& &span class=&c1&&# 或者u=a[0].T也是获得转置&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&逆时针旋转90度,第二个参数是旋转次数&/span&
&span class=&sd&&array([[ 3,
0],&/span&
&span class=&sd&&
4],&/span&
&span class=&sd&&
8]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&v&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&rot90&/span&&span class=&p&&(&/span&&span class=&n&&u&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&)&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&沿纵轴左右翻转&/span&
&span class=&sd&&array([[ 8,
0],&/span&
&span class=&sd&&
1],&/span&
&span class=&sd&&
2],&/span&
&span class=&sd&&
3]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&w&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&fliplr&/span&&span class=&p&&(&/span&&span class=&n&&u&/span&&span class=&p&&)&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&沿水平轴上下翻转&/span&
&span class=&sd&&array([[ 3,
7, 11],&/span&
&span class=&sd&&
6, 10],&/span&
&span class=&sd&&
9],&/span&
&span class=&sd&&
8]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&flipud&/span&&span class=&p&&(&/span&&span class=&n&&u&/span&&span class=&p&&)&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&按照一维顺序滚动位移&/span&
&span class=&sd&&array([[11,
4],&/span&
&span class=&sd&&
5],&/span&
&span class=&sd&&
6],&/span&
&span class=&sd&&
7]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&roll&/span&&span class=&p&&(&/span&&span class=&n&&u&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&按照指定轴滚动位移&/span&
&span class=&sd&&array([[ 8,
4],&/span&
&span class=&sd&&
5],&/span&
&span class=&sd&&
6],&/span&
&span class=&sd&&
7]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&z&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&roll&/span&&span class=&p&&(&/span&&span class=&n&&u&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&n&&axis&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&对于一维的array所有Python列表支持的下标相关的方法array也都支持,所以在此没有特别列出。&/p&&p&既然叫numerical python,基础数学运算也是强大的:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&numpy&/span& &span class=&kn&&as&/span& &span class=&nn&&np&/span&
&span class=&c1&&# 绝对值,1&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&abs&/span&&span class=&p&&(&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&c1&&# sin函数,1.0&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&sin&/span&&span class=&p&&(&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&pi&/span&&span class=&o&&/&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span&
&span class=&c1&&# tanh逆函数,0.40523&/span&
&span class=&n&&c&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&arctanh&/span&&span class=&p&&(&/span&&span class=&mf&&0.462118&/span&&span class=&p&&)&/span&
&span class=&c1&&# e为底的指数函数,20.668&/span&
&span class=&n&&d&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&exp&/span&&span class=&p&&(&/span&&span class=&mi&&3&/span&&span class=&p&&)&/span&
&span class=&c1&&# 2的3次方,8&/span&
&span class=&n&&f&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&power&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&)&/span&
&span class=&c1&&# 点积,1*3+2*4=11&/span&
&span class=&n&&g&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&dot&/span&&span class=&p&&([&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&])&/span&
&span class=&c1&&# 开方,5&/span&
&span class=&n&&h&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&sqrt&/span&&span class=&p&&(&/span&&span class=&mi&&25&/span&&span class=&p&&)&/span&
&span class=&c1&&# 求和,10&/span&
&span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&sum&/span&&span class=&p&&([&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&])&/span&
&span class=&c1&&# 平均值,5.5&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&mean&/span&&span class=&p&&([&/span&&span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&6&/span&&span class=&p&&,&/span& &span class=&mi&&7&/span&&span class=&p&&])&/span&
&span class=&c1&&# 标准差,0.85426&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&std&/span&&span class=&p&&([&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&])&/span&
&/code&&/pre&&/div&&p&对于array,默认执行对位运算。涉及到多个array的对位运算需要array的维度一致,如果一个array的维度和另一个array的子维度一致,则在没有对齐的维度上分别执行对位运算,这种机制叫做广播(broadcasting),言语解释比较难,还是看例子理解:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&numpy&/span& &span class=&kn&&as&/span& &span class=&nn&&np&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&([&/span&
&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&],&/span&
&span class=&p&&[&/span&&span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&6&/span&&span class=&p&&]&/span&
&span class=&p&&])&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&([&/span&
&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&],&/span&
&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&]&/span&
&span class=&p&&])&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&维度一样的array,对位计算&/span&
&span class=&sd&&array([[2, 4, 6],&/span&
&span class=&sd&&
[5, 7, 9]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&b&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[0, 0, 0],&/span&
&span class=&sd&&
[3, 3, 3]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&-&/span& &span class=&n&&b&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[ 1,
9],&/span&
&span class=&sd&&
[ 4, 10, 18]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&*&/span& &span class=&n&&b&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[1, 1, 1],&/span&
&span class=&sd&&
[4, 2, 2]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&/&/span& &span class=&n&&b&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[ 1,
9],&/span&
&span class=&sd&&
[16, 25, 36]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&**&/span& &span class=&mi&&2&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[
27],&/span&
&span class=&sd&&
25, 216]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&a&/span& &span class=&o&&**&/span& &span class=&n&&b&/span&
&span class=&n&&c&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&([&/span&
&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&],&/span&
&span class=&p&&[&/span&&span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&6&/span&&span class=&p&&],&/span&
&span class=&p&&[&/span&&span class=&mi&&7&/span&&span class=&p&&,&/span& &span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&mi&&9&/span&&span class=&p&&],&/span&
&span class=&p&&[&/span&&span class=&mi&&10&/span&&span class=&p&&,&/span& &span class=&mi&&11&/span&&span class=&p&&,&/span& &span class=&mi&&12&/span&&span class=&p&&]&/span&
&span class=&p&&])&/span&
&span class=&n&&d&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&([&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&])&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&广播机制让计算的表达式保持简洁&/span&
&span class=&sd&&d和c的每一行分别进行运算&/span&
&span class=&sd&&array([[ 3,
5],&/span&
&span class=&sd&&
8],&/span&
&span class=&sd&&
[ 9, 10, 11],&/span&
&span class=&sd&&
[12, 13, 14]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&c&/span& &span class=&o&&+&/span& &span class=&n&&d&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&array([[ 2,
6],&/span&
&span class=&sd&&
[ 8, 10, 12],&/span&
&span class=&sd&&
[14, 16, 18],&/span&
&span class=&sd&&
[20, 22, 24]])&/span&
&span class=&sd&&'''&/span&
&span class=&n&&c&/span& &span class=

我要回帖

更多关于 int sum int m int n 的文章

 

随机推荐