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

[复制链接]
`ivY) 发表于 2018-1-20 11:44:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

; j  S8 t. a$ l& V' u让小兔子转向/ [7 D4 n! ~9 z8 E; O
/ k% c! Q( ]7 E( f
现在,你的小兔子可以根据你的按键移动了!
! A( H' v6 b( u0 {9 S不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。2 m& Z3 y& x, N) L7 S* N
让我们一起看看下面的插图% N* l5 N! p6 N. g! Y! ~: v& i

! f% {% b" R+ i$ U如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。
2 D  W3 C- J  K4 Y. g, R  ]如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。
/ _% T! X1 c6 }4 t现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。
9 o7 J+ z( [1 l; G) d$ j小提示:用atan2求出的z值是用弧度制(radians)表示的。9 a. h  B5 X  a. O6 v' ]/ P0 Q
atan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:
+ k  }5 a1 ^: M( c$ e5 M/ S; g import math
7 i& N5 g. ~1 I接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:: g4 z: d, u# L9 `
# 6.1 – 设定小兔子的位置并让它转向
: n7 k* \. u) n+ S( u; c& dposition = pygame.mouse.get_pos()3 s7 _' U7 B3 C* L" c9 d
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))$ N$ P# n" z3 \2 e- B* d! o4 @4 l
playerrot = pygame.transform.rotate(player, 360-angle*57.29)& I6 A* x# n6 }
playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)$ o1 p: J9 a5 F( P
screen.blit(playerrot, playerpos1)1 a" R" |; c) V8 f' \% W
让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。
6 K; y* ]7 B8 _: ^1 _0 T因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。
: ^+ v5 e6 F1 M1 e" E9 D+ x再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!
  Z* a$ _5 D2 A- t& J4 w4 X0 p& z# X& h/ P; g) M1 e
小兔子,射击!3 Z* H* [" g# {' L
  t' [4 u) z! W
你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!2 z# [8 a6 B$ s6 x) N3 G
这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。
+ x0 o* G) [1 u; M首先,在第二部分(#2)末尾添加一些要用到的变量:
! z. E2 i% d2 [' kacc=[0,0]
) M- {% t% n2 X2 C2 larrows=[]
4 s6 K, V/ [% s& Z& S第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。/ T9 `- S  B7 Z6 P' L  m. \) S" D
接着,在第三部分(#3)末尾载入弓箭的图像:
) l+ ~& ]6 Y0 zarrow = pygame.image.load("resources/images/bullet.png")
; z: D; e. n2 m! T' n当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:* Q# K- A. s$ u* Q* }
if event.type==pygame.MOUSEBUTTONDOWN:1 B2 c* X: u( q! J" f2 s$ Y
position=pygame.mouse.get_pos()# x+ j3 E3 G- D1 o% g2 g, _0 F
acc[1]+=1
7 @- U8 Z: V3 _1 m6 ~ arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])  q2 u3 _' E. v& L7 Y5 D
这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。# Y: X0 }) T, @9 m7 u
我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:) d) p% P2 D- [4 c; Y: b+ x* z
# 6.2 – 在屏幕上显示弓箭0 T) O# z& D; d  e# R) F
for bullet in arrows:' U9 l5 v$ ]) @3 V8 V. {+ z
index=0; S% V/ o7 r+ T# p
velx=math.cos(bullet[0])*10
0 e% [+ r. k- Q, O4 A vely=math.sin(bullet[0])*101 y. o1 ^# k. T
bullet[1]+=velx4 Z9 a2 ^" P2 P3 r' [/ E
bullet[2]+=vely% S7 Y% m+ V, v1 x/ ?
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
4 _( [9 C+ F" R# I arrows.pop(index)
3 G4 j8 N, E9 |7 ~( K index+=1
% l1 G$ w9 w5 C: l" X' W for projectile in arrows:8 {5 [6 z2 g$ }1 L6 c9 U) d
arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
. Z3 r# h9 S% h screen.blit(arrow1, (projectile[1], projectile[2])); Z' Q) z: Q9 |& y
弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。- q9 Q. o* d( y
现在运行游戏,7 r: c. d" Q5 u" i  n8 h( h! {
你应该能让小兔子在你点击鼠标的时候射击了!
+ R. `+ `: K' N' N(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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