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

[复制链接]
`ivY) 发表于 2018-1-20 11:44:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
/ y: T1 U9 J. b' I: G
让小兔子转向  Q7 }2 L6 e% P) {# k
+ ?+ f: {- j+ h. K8 N6 M
现在,你的小兔子可以根据你的按键移动了!% l/ x- q0 S. c8 o
不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。
/ W1 e6 n1 ], m8 d让我们一起看看下面的插图/ q# X- g2 U2 u& _
* o3 T1 K& j( Q; I( a
如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。; l& m$ X4 o6 c+ b: X' J
如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。+ Z6 L7 F/ T/ a2 N7 D
现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。
; j  E$ v" @( m: z0 a% e* M3 c* S小提示:用atan2求出的z值是用弧度制(radians)表示的。5 O8 ^7 J# }) s. l$ {/ R% c2 N
atan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:2 _! J, r* P1 Q( a7 Y+ A
import math! E) H, s" ]/ B! X$ U# e
接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:
# ?3 @/ [- g  y( g- H# 6.1 – 设定小兔子的位置并让它转向
7 q9 h% D4 N9 a! N4 Pposition = pygame.mouse.get_pos()% x6 H+ e$ K3 ~6 i' W/ K: \1 o
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
- l5 {; l. x9 |( `. A* u! [: ?playerrot = pygame.transform.rotate(player, 360-angle*57.29)
& f2 i" J7 W% ^0 s- W, ~% _playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
' L& x+ _. \4 Z5 d3 W. L) nscreen.blit(playerrot, playerpos1)6 d+ G4 I" C. e' y  G8 t
让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。6 y. h6 P& f* q. B  J! m
因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。
, F, K, B% |; }1 j3 c再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!! {5 f; \6 C0 F/ e0 A

# k; W7 f# M  H3 v- e小兔子,射击!
1 A, f2 C& \( L/ O  K, ?( b: u* L) y1 {6 z$ O
你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!
: z/ U. d3 j% U这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。: k6 X2 K9 R' b6 t; Z" ~; G9 X: }
首先,在第二部分(#2)末尾添加一些要用到的变量:
; {" H+ N# |6 y: W( ?  qacc=[0,0]
4 Y9 R  N5 C* w6 y& M: @arrows=[]
+ x5 _8 ~" @9 ~( X; G第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。
& g( ?+ F( }+ g, a: |! z$ C* I接着,在第三部分(#3)末尾载入弓箭的图像:
1 M' P, V9 D7 y: v9 F( {& Rarrow = pygame.image.load("resources/images/bullet.png")
7 E* T( E5 {& t; D! t* q2 i当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:! n* _$ c4 I6 f" k* K0 L. P
if event.type==pygame.MOUSEBUTTONDOWN:
+ d# N! L9 E; ]8 l" i$ p position=pygame.mouse.get_pos()8 z/ Y: H& {' ]( |& d
acc[1]+=1; M8 B1 x! a. n; R. w+ \
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
) p3 J. Y0 ~  Q# I这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。" l5 a' A3 M0 n1 ~
我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:
& J8 _  ~8 G- G2 z( v/ ~# 6.2 – 在屏幕上显示弓箭3 _0 w% J' X, Y  l, g
for bullet in arrows:
6 ~; z9 I# J% Y index=0  f+ A: [; O9 h9 y$ ~* X
velx=math.cos(bullet[0])*10
& M- \' w! e0 R2 z1 \ vely=math.sin(bullet[0])*10
9 F- D. I! x2 r" h, M& S! v2 v bullet[1]+=velx1 o7 P7 M: X2 G1 H8 u- B& B
bullet[2]+=vely8 u0 V, F& K' Y0 `% B
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:$ w1 E# x4 Q/ d. G! F+ w% |/ m  ~
arrows.pop(index)
( G0 {  s0 b/ ?9 W$ i  k  [( J" c index+=1# o7 I$ y- Q% h+ D* F# ^- h* |
for projectile in arrows:! x8 h% @/ y; t: O4 R
arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
- l- Z/ l4 d5 U screen.blit(arrow1, (projectile[1], projectile[2]))
7 [: P0 q8 Y  u/ J/ z) D弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。
# T8 w* K* {9 a5 P; P现在运行游戏,1 V  j3 N/ d  j; l5 V& G: X
你应该能让小兔子在你点击鼠标的时候射击了!
9 [! M) m1 \" L" o- G" r$ R  D(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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