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

[复制链接]
`ivY) 发表于 2018-1-20 11:44:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
! Z6 L+ g  h  _. a
让小兔子转向3 J- C- Y' f7 h, X2 B

7 [' d( l9 N8 E4 Y: w现在,你的小兔子可以根据你的按键移动了!
5 z- h% \" C( r* v不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。
( l! y. w3 o2 o: q让我们一起看看下面的插图2 H! t/ H" _/ k4 H/ A

! _" m2 W7 f# j- c/ L) M4 }. g如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。0 f9 D; {* Z) P! F
如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。
' T. Y* Q4 n3 M4 L7 g现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。
9 L; _* T; N9 E; c9 F小提示:用atan2求出的z值是用弧度制(radians)表示的。) R5 J, n' Z* {1 k( V. r5 q4 i: i# Z
atan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:/ O1 |* P/ d5 B8 r0 M
import math5 _' N! f$ R1 @' ]! I8 e
接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:
7 @6 W4 g" u2 a# V# 6.1 – 设定小兔子的位置并让它转向0 q* w9 ?" q& r  M& A$ O6 d
position = pygame.mouse.get_pos()
4 t' ]9 i- {. q9 _1 |5 ?angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))- v0 m9 @6 E  {" S) h& ]
playerrot = pygame.transform.rotate(player, 360-angle*57.29)
( ?* k* k( B3 T4 |playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2). `! r. u7 r* ?: c
screen.blit(playerrot, playerpos1)1 U# x3 @' y. e6 g. P
让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。' b/ r2 K3 `& }. @
因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。
7 y4 H+ K! t7 |0 _0 n再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!
! d' A; u* A- q# z9 o
" i% J5 `( n. j" j小兔子,射击!4 R) [$ u% h9 g1 h7 t; g: {# z0 ]
/ w+ [+ A2 G2 O! M) X* Z
你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!
* h/ I5 I  Z. W! q! F1 T这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。4 g* r; M$ W3 l$ s- V- t6 E
首先,在第二部分(#2)末尾添加一些要用到的变量:
" m+ B% h) u( b& }: R0 J/ uacc=[0,0]$ U2 \) [( ?# U+ f1 r
arrows=[]
8 g( d+ O* ]! ^* V( P第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。! ?3 U6 I2 s* E% n' N
接着,在第三部分(#3)末尾载入弓箭的图像:
& U2 O4 s7 z$ ^$ Z2 rarrow = pygame.image.load("resources/images/bullet.png")
1 F( _0 U' _. `0 e当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:! X1 q9 v& [  P( n$ z+ F4 O
if event.type==pygame.MOUSEBUTTONDOWN:. i7 J/ G9 @4 Q5 M4 K, t
position=pygame.mouse.get_pos()0 i3 Q# U& Y9 c  y- ^' b/ V0 h
acc[1]+=1
' H4 G  R5 m4 S; f0 C+ V/ u9 {: c arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])# t6 W2 l- @* ^! H8 A: M/ n; ?
这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。+ s$ H5 y3 z" P) d
我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:) C" h  @; L6 T8 w/ R' O) A
# 6.2 – 在屏幕上显示弓箭0 m: S5 h  V* }, V5 I+ ^
for bullet in arrows:7 p9 q, o7 S) K8 ~% v6 u( o: s
index=09 \9 J3 k% _! [( e) t+ s  y, l
velx=math.cos(bullet[0])*10
$ v8 S) {- U# g1 u vely=math.sin(bullet[0])*10
. z9 C. z5 Y8 b/ A, I bullet[1]+=velx1 m) Y  h8 ?2 ?, w3 Y
bullet[2]+=vely9 }& _* A5 F# \
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
7 ^3 V* s% ^3 P/ ~0 I1 W! O4 s arrows.pop(index)
3 ]' z; j- _+ X index+=1
9 s! [3 M. W0 x" R( {* S for projectile in arrows:
! G' S; v  D4 v5 l( K arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
0 v+ ^% |  H! ~5 @7 Z/ \5 y1 E3 v screen.blit(arrow1, (projectile[1], projectile[2]))/ w0 m7 _2 ~9 r* _
弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。1 D# W, N  T. U  j6 ~
现在运行游戏,
' T2 d% f3 {3 Z0 V. U你应该能让小兔子在你点击鼠标的时候射击了!' I& M0 G: |5 F% a) T
(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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