少儿编程分享:手把手教你用PYTHON编写兔獾大作战(三) ...

[复制链接]
`ivY) 发表于 2018-1-20 11:44:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
; t% U2 `5 i# p+ s" k
让小兔子转向+ @0 P( E/ S7 k: Y
! j  t; k& J+ G( I  A
现在,你的小兔子可以根据你的按键移动了!4 ~9 H+ N1 O5 c5 E  w
不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。' E* i7 o( j$ x' {% K9 ^
让我们一起看看下面的插图
+ A3 T8 X' W7 D, y/ u6 p1 Y8 {5 v" n- J5 N6 k
如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。. [4 }" X6 N9 D0 j, [& i, m0 M
如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。
: `2 `" o+ Z9 B; W! O现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。
  f& o5 Z* K2 h; f9 S7 @小提示:用atan2求出的z值是用弧度制(radians)表示的。
& P& u. P2 S0 t9 `3 A3 Aatan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:
7 a5 x: p+ t! B2 Q+ i import math. Y* n: N$ a+ r
接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:
; G, ~  d! I; d7 {& Y, N! {. T# 6.1 – 设定小兔子的位置并让它转向
$ y  |% g  k$ nposition = pygame.mouse.get_pos()
  G4 _! j, `1 d; e( \7 t( y$ J1 pangle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
; U- Y& r5 C/ [" ?3 Z! B& \5 Q6 lplayerrot = pygame.transform.rotate(player, 360-angle*57.29)
4 h) j0 ~/ ~5 C0 V* }2 Dplayerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
0 W* h7 b' H7 {! ?- iscreen.blit(playerrot, playerpos1)- S: L+ ?: D9 ?6 O2 f# }
让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。
5 g6 y( M( N+ g" z3 j: c" y因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。- E! l: Z; B, a' O: r" W$ o" P
再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!
' u( m) ?# b, A% Y% y
. [% E& j) W8 [. ]! c+ d2 T小兔子,射击!
7 [/ F3 U; I3 z6 n- {* m& ]; L2 J8 @- w
你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!# l+ _& V2 v3 K$ ?: c7 D$ z: u
这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。+ s; V+ x  j2 Q, u* R
首先,在第二部分(#2)末尾添加一些要用到的变量:
. v4 a3 C- {) D' [acc=[0,0]# E. R1 R2 ^0 j. s9 b6 S
arrows=[]6 a6 x3 U- P* O; ?
第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。
4 X  O$ E. T8 C. z7 z& t  R接着,在第三部分(#3)末尾载入弓箭的图像:
" k! f! |4 G8 _4 N( p, @0 V, rarrow = pygame.image.load("resources/images/bullet.png")# y* i2 C+ ^( x4 |& f! e
当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:4 b0 G' u0 b( n1 c# @5 K- ^
if event.type==pygame.MOUSEBUTTONDOWN:1 i% E2 r% _+ `' `* h0 i( c
position=pygame.mouse.get_pos(); K0 B  F; x8 U! t$ k
acc[1]+=1( r( S8 A- }# c& g1 p
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
4 W+ J7 i0 ]6 `% W! ?# w这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。
% u! i5 }/ j# Y6 ?- \; j# E- [我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:, c* R: G# j  o
# 6.2 – 在屏幕上显示弓箭
3 Q4 K  k1 g- u6 R  X+ W, w+ ifor bullet in arrows:% x4 E0 r$ L3 r5 s8 T
index=0% Y* B1 [; {9 |. S+ B
velx=math.cos(bullet[0])*10
3 O8 }& Y2 v# Y vely=math.sin(bullet[0])*10* d+ g, r1 A5 p6 P$ L$ d5 |1 i
bullet[1]+=velx
% F$ q6 s9 R1 w0 O# ^/ w bullet[2]+=vely
7 }& @9 P! s/ f. ~1 {4 { if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:  @# U8 ~5 k  J( V, Y6 D8 V
arrows.pop(index)
$ c" S+ d- K# G; N index+=1
9 M% P3 x# g( {' e) V# c1 ] for projectile in arrows:
+ O3 _& g1 K8 V2 l  Y arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)+ p/ x: ^/ t& i3 s: y
screen.blit(arrow1, (projectile[1], projectile[2]))( H& R8 n) G9 r( K: ]+ J
弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。1 I  B: g+ M. z. ^/ B
现在运行游戏,8 E$ u8 D9 s8 M( M7 Y0 R
你应该能让小兔子在你点击鼠标的时候射击了!
3 R1 O5 g! R# X9 Y% E8 Z(未完待续)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
推荐阅读更多+
阅读排行更多+
用心服务创业者
0851-88611148
周一至周五 9:00-18:00
意见反馈:admin@0851life.com

扫一扫关注我们

Powered by 童码少儿编程 X3.4© 2001-2013 0851life Inc.|网站地图