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

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

" z/ ~& l' t( O. d让小兔子转向( a: n# h4 T9 F) y1 X0 b/ r& p
2 ]+ V4 ]' `' ^2 f/ y* a& R. g' k
现在,你的小兔子可以根据你的按键移动了!
$ }) ]1 x7 a, t1 S2 ~6 A不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。" M! R% e3 }* E- T0 z3 ]
让我们一起看看下面的插图2 e5 H( v& d3 d. L+ P

& |2 x0 I) n8 e$ }如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。
) {: R: C6 f( Y如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。
' L. }! l" Y: p; o. x2 k- ^现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。2 b/ d) e/ z: }% g
小提示:用atan2求出的z值是用弧度制(radians)表示的。1 O; Y3 u/ a' Q  Z% @7 m
atan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:
  v& |" ?5 k  X2 W. ^ import math& r* _. g: p* H+ I3 D- C+ g3 A/ u2 ^
接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:* ?) `2 V  P% ~& k5 v5 j
# 6.1 – 设定小兔子的位置并让它转向1 b5 u9 M5 l3 D2 `0 c0 O! A& j
position = pygame.mouse.get_pos()  k: Z' W/ c3 V+ A4 n1 C
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
  S4 N* J" V& L# O- q5 d  `playerrot = pygame.transform.rotate(player, 360-angle*57.29)/ w( o# h! y( Z; ]% v. w! F# q
playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
+ @/ p9 R: w; t9 u% V/ N& R4 V/ i2 Oscreen.blit(playerrot, playerpos1)
! y" x: x  d* M让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。! W- d6 u+ i  r% W, G* o
因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。
  W3 G$ o$ [- l$ W5 I$ v/ }再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!
4 y; X& \2 G0 h2 D  _& y0 h- _1 a* m5 `' x9 f' Z$ D$ B& D
小兔子,射击!
7 @8 n. J0 r0 X1 P3 [
, g0 W  w2 ~) c3 D7 y  {你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!' {- y& {7 N) c5 E, S
这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。
$ S# _! O1 X; n: q* ~首先,在第二部分(#2)末尾添加一些要用到的变量:
, P- ]0 y, W. ?' |  ~6 Kacc=[0,0]3 ?7 S# Q0 ^) n' R7 W4 Q/ j
arrows=[]3 y' b0 d  |9 Z& O+ f; L7 c
第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。0 N2 ^1 o/ }" L$ \+ w/ Y) G
接着,在第三部分(#3)末尾载入弓箭的图像:
1 j8 _. E: q# t. p' o. q3 c% q5 Darrow = pygame.image.load("resources/images/bullet.png")
( h( i# e, h' _# [' [当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:
% ]  Y$ o( ?! x5 H4 X7 h8 C& iif event.type==pygame.MOUSEBUTTONDOWN:% j$ `7 ^% H1 K- a& E& ^) b
position=pygame.mouse.get_pos()
* J: u1 x4 J) S3 u9 \ acc[1]+=1) q- D0 d3 {* s
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
8 l7 U- v. H+ n- H- ~! x, l这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。( I& z; ~% p' ?  S8 L
我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:4 h0 Q- }( v% R- c
# 6.2 – 在屏幕上显示弓箭
- k) O; |: G* w. [- E6 f9 Zfor bullet in arrows:: ^$ [* o' S, N' h
index=09 }7 r0 r% P. P# }2 C
velx=math.cos(bullet[0])*10
4 U) M, y8 ?1 o vely=math.sin(bullet[0])*109 {, m- t. `" C; R! B
bullet[1]+=velx. K( q# X+ h  }* {, ]+ b* y( p- t; V
bullet[2]+=vely& n6 E: U" e* P
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
: K* l/ p) `7 E) z+ y arrows.pop(index)9 |2 u% |! B1 G3 C" l0 z
index+=1( n8 J# m1 W$ D3 X
for projectile in arrows:1 D- i/ L: z8 J( f0 \
arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)# J0 z2 `6 g5 |6 j/ j
screen.blit(arrow1, (projectile[1], projectile[2]))2 p8 Z# y: I' w+ f# d/ H
弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。
4 X2 e; i. k5 D6 q! q4 z/ Q现在运行游戏,
( D6 O! _" b* O) f4 s; d8 N你应该能让小兔子在你点击鼠标的时候射击了!5 m. i& W+ y2 z: ~9 `
(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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