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

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

: x7 L. _5 j! q* G! Y6 R让小兔子转向
4 n" m! ^% \& m7 ]0 }5 b0 @$ B  G4 H+ D8 N  s
现在,你的小兔子可以根据你的按键移动了!9 Y& d6 ]3 N! J' O) O* G
不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。/ j+ |6 S+ {+ P. x
让我们一起看看下面的插图7 F1 o: `' o) l5 N6 R2 h- e
/ q, x3 l# i# Z, A+ }
如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。
) [5 j  W3 P+ Q; t: D如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。5 U# Q9 ~. e% Y# \* V
现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。; N( J. R" l2 K3 ]! Z/ V( a' C
小提示:用atan2求出的z值是用弧度制(radians)表示的。
" _) t: f2 l5 Oatan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:6 l8 N) |% I% Y( ?( Z1 J$ p
import math
8 G$ p3 W: I! a接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:" o$ V  d5 Y) f% D! y; t2 d  Q
# 6.1 – 设定小兔子的位置并让它转向
9 C. H- o1 z1 K! jposition = pygame.mouse.get_pos()
$ q' `' @+ L2 a4 M8 Qangle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26)), {2 ]# B2 U) c* ]
playerrot = pygame.transform.rotate(player, 360-angle*57.29)
' e+ k; T$ F/ V! |playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
% r* y; S  \% H8 E, Tscreen.blit(playerrot, playerpos1). [9 N5 _. t& h& a* g1 R
让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。
5 E* E# v% p6 Y& `( _" f因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。! K+ U! m  n- x9 ^
再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!# C4 m  y% G8 ~. i9 h( A7 m& `

9 L/ K" Z. D9 b8 a+ L% m8 q小兔子,射击!
( A7 S' H1 V" @3 ^- R$ O3 F/ T6 n# l% X0 ?
你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!: k0 q* _) q- b: Z
这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。
& ?8 o, T; G- |/ X( A2 D+ K% C/ E首先,在第二部分(#2)末尾添加一些要用到的变量:
( G+ a8 _3 `/ x7 K0 I' |. ^9 Wacc=[0,0]
3 v2 z: ^- E# h' @) q; S5 darrows=[]. b/ K+ a$ D) q" [+ @: [9 ?# I
第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。
2 h3 R6 J& l; o接着,在第三部分(#3)末尾载入弓箭的图像:  @2 R# S- q% O/ B8 B9 f
arrow = pygame.image.load("resources/images/bullet.png")) m: ?5 `9 j1 R# C0 W% [2 V) p
当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:
8 }7 d0 ]! ~6 Y7 d# Jif event.type==pygame.MOUSEBUTTONDOWN:
, y  t9 G7 i4 @ position=pygame.mouse.get_pos()
4 a" H' a6 X! @; d acc[1]+=18 c' @0 X+ O- e: _
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
7 b4 g8 @+ K- o8 y这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。' a4 t! U6 V+ l
我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:
7 `! d# S3 \. A9 }. K# 6.2 – 在屏幕上显示弓箭2 t2 L* P7 J+ P& R& A% J
for bullet in arrows:
% ~4 ~, k9 J" y% }2 X* m index=0
* z8 P5 x& J' c/ M1 o+ W" | velx=math.cos(bullet[0])*10
3 l0 i  A5 Y6 D) v- ~' O8 u vely=math.sin(bullet[0])*105 F2 q0 X" s/ M8 P$ D2 J3 e. j
bullet[1]+=velx7 o3 t6 }3 K; g2 P
bullet[2]+=vely, V; n, C% j* h& F8 M9 |/ h  B
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:7 @9 i% _  G& X; F4 D$ ?
arrows.pop(index)
2 |$ E: P( T5 U& o index+=1# \* h6 h1 k% b2 E
for projectile in arrows:0 |$ d& E" x$ K, o( [
arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
8 E2 \8 ?# f5 x2 R$ e screen.blit(arrow1, (projectile[1], projectile[2]))
  s: U( F. Z# z/ [6 x9 C6 b+ P" n+ L弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。! s2 ~0 e( D/ F7 b" ?# f
现在运行游戏,1 q2 z; r5 e, y3 T
你应该能让小兔子在你点击鼠标的时候射击了!
% L/ i- `* X2 x# V* s(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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