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

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

, O* K! T+ `' A- x. [4 x让小兔子转向% A9 o4 E- Q3 H4 O2 ~- x& o$ R- Y

% c* V$ k; E2 H- u) h- |现在,你的小兔子可以根据你的按键移动了!
4 A% N, }( {; z- U. S2 E1 N不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。
  D+ @9 P& d+ n' x让我们一起看看下面的插图
+ q. x- c9 H# ~5 Y& i/ d8 \4 H% [; c: ^5 r! w7 Y
如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。) U: A) O( V+ G: o) R/ p
如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。
' O: D/ @8 w& z- C% z' f" P" a现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。
8 o( I2 T' M3 p0 G小提示:用atan2求出的z值是用弧度制(radians)表示的。
3 _/ y# _" g. f4 Q- e% catan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:2 O6 e0 P2 p9 p
import math
" N; |; D: V! B# @9 @, V) \接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:7 w" ~* j& b  t7 T0 N3 s( S% M/ Y# g
# 6.1 – 设定小兔子的位置并让它转向
5 ]( R1 f  I2 [# \: I: wposition = pygame.mouse.get_pos(): r4 y9 l; N% z% I: [" o
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
  Y1 v4 c7 S  Eplayerrot = pygame.transform.rotate(player, 360-angle*57.29)
6 g& a0 O3 A+ ], X7 G- c6 ]playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)8 f+ z' y+ a! d; M/ I
screen.blit(playerrot, playerpos1)
# l5 m& c1 D0 e让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。6 b9 r3 z' I2 V4 o; Q0 G* G2 t
因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。; j0 N% i( r! q& i# @* e& z
再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!
5 n. e8 X2 G- c1 x' _5 |% ~, O- j- Q5 w! J0 p2 z0 K
小兔子,射击!
3 J1 P+ I: z+ L- S) S
1 t! F# O" l- q2 n; v8 H$ z2 v/ ~你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!4 M+ g8 q( i( p# X, X9 i" L
这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。, P6 }7 v2 ^( b6 d0 {- w! I* \
首先,在第二部分(#2)末尾添加一些要用到的变量: 8 @" q# G5 Z3 w, `# n
acc=[0,0]
7 D3 H6 r9 z7 [) Y" T( }arrows=[]* D' s4 k% u) k$ Y; E6 N2 Z1 z
第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。; `$ M( r/ d/ I$ ~" c3 Z
接着,在第三部分(#3)末尾载入弓箭的图像:
1 ]% [( r5 m$ K8 b5 I' _  b$ }2 Iarrow = pygame.image.load("resources/images/bullet.png")
. I6 T/ p% A% L5 S4 a( d" @当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:
3 U( s' K6 O$ a, v4 n/ rif event.type==pygame.MOUSEBUTTONDOWN:
& _6 g5 [. H$ F- R! R position=pygame.mouse.get_pos()6 B. C& b) l! t5 z' m
acc[1]+=1
4 q+ D- J7 e" ~3 T4 s1 P; z7 Q2 z arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])5 c* \) {7 F% d& T9 ?( j3 R5 c
这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。1 z0 r, z$ A4 h. i
我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:$ P! U0 ~) w# e5 ^
# 6.2 – 在屏幕上显示弓箭
. B; v. G% R3 q4 V/ Pfor bullet in arrows:+ E3 g$ p, Y  [' `" N
index=0$ Y; g- O& w; Y0 M  ^1 J
velx=math.cos(bullet[0])*10; y1 m8 |8 K/ V4 e: ?0 K# [0 t
vely=math.sin(bullet[0])*10
+ c4 W. I) H5 F7 Y2 j3 k bullet[1]+=velx* d. q( ^1 e- |" }& F# }1 a
bullet[2]+=vely
5 q# v- n% h# X* w  z if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
+ t1 U1 y6 S; D' t& u  x arrows.pop(index)
4 d. _! P, U" _0 S- z, K4 m index+=1
, K/ {( d& t/ E3 @3 T0 m$ s. s* I2 D7 d for projectile in arrows:' i/ i- x. u2 W
arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
! V, u6 L( F& }7 x  w$ R; A screen.blit(arrow1, (projectile[1], projectile[2]))+ |- {) i2 V7 t- P
弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。
( Y. D; r1 x" L0 H! }5 e$ L$ g现在运行游戏,; p/ j9 f$ R0 G) _
你应该能让小兔子在你点击鼠标的时候射击了!+ j; b) t. s( A% i' A( j
(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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