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

[复制链接]
`ivY) 发表于 2018-1-20 11:44:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
* }. H! x) J- G
让小兔子转向* `; y" R! u2 o) w

" u* c4 Q- H7 D6 m7 J现在,你的小兔子可以根据你的按键移动了!
" U$ R+ D) N3 }. D" c不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。: }9 R4 S4 K, l/ Y: B! R2 s
让我们一起看看下面的插图
. W# ~' m$ d4 A1 q7 c* S# R
& Q2 K) P) ^7 o9 f9 f5 \: Z如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。
: y: T  e3 _) h, A2 O5 b! D' S如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。
+ j0 ^  V6 b. p2 k* `& v- |6 P现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。
6 k' A3 A! [+ B; i. ~4 p  q3 }小提示:用atan2求出的z值是用弧度制(radians)表示的。
9 N7 p1 {% ?& e9 ~" l, M8 fatan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:4 h+ x+ x$ |9 |0 ?# F, x, }, Q
import math  y1 z" T: M5 d8 p" w% d* ?
接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:
; \& v4 p" G( l) E; w* B# 6.1 – 设定小兔子的位置并让它转向
2 ?9 L5 b5 B* L% A+ K3 kposition = pygame.mouse.get_pos(): x, Y  p/ T) w# X* M
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
, J# O* S; }/ f& M0 l" jplayerrot = pygame.transform.rotate(player, 360-angle*57.29)1 [2 \3 u* b+ F7 J) ^
playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
! ?+ W6 C/ @/ ^0 J* z/ h( w% s  {screen.blit(playerrot, playerpos1)' Y; G# i( X- K
让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。# i! z+ W. U2 a; B1 p& |; [
因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。- C) N, l; X5 q5 P8 K1 L/ H
再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!
* L. H" {( L7 ^. W* K( l, G% I0 _3 P; K, o- K0 {* ^3 z
小兔子,射击!
8 i$ Z' Z+ C% S+ Y: O; G& d: j) V& o5 E
你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!0 J# S  f6 S5 I6 _
这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。
; T3 o( [4 K9 y! r2 p9 Y" j) L首先,在第二部分(#2)末尾添加一些要用到的变量: ( r0 J* e; ?+ T9 X1 Q; O
acc=[0,0]- g% Q* Y8 s8 D" ]9 }/ D1 ?
arrows=[]
; q- ]8 e8 r: ]# g: l% l第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。$ j7 l+ x: l+ u' q; C, Y
接着,在第三部分(#3)末尾载入弓箭的图像:: E% P0 Y: G5 l) s8 [
arrow = pygame.image.load("resources/images/bullet.png")1 E1 `- l, p0 m3 u6 O
当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:
: ]7 `5 {7 x- |3 dif event.type==pygame.MOUSEBUTTONDOWN:5 K5 L. S. c+ E$ W9 Z& E
position=pygame.mouse.get_pos()
- r- ~; J& H4 X8 j! Y- w( G acc[1]+=1
9 F7 F! h8 I  `" G- } arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])& N  f6 u; G& l2 Y
这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。
: x9 ?/ U) Z! y% i! q9 u我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:
7 V( K' f1 b3 @6 ~4 p, v# 6.2 – 在屏幕上显示弓箭
* Y. S9 q3 X7 f( pfor bullet in arrows:1 J  @$ w# V6 ]' `: L, J, ]
index=0
9 H4 n/ a4 K6 W4 @  o! z6 ^9 o6 |- { velx=math.cos(bullet[0])*105 N3 }6 M" I2 i! V: \0 A* d( ?/ e
vely=math.sin(bullet[0])*10
, e& g# m  B4 I  N! F bullet[1]+=velx
# K0 K: ]: H) Q9 V bullet[2]+=vely9 e  v- D7 I  b0 x7 D3 |* |2 a8 h; \
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:* L  R1 ~  X) x$ O! P. s
arrows.pop(index)
2 q9 @6 K9 O; K4 V! _ index+=19 G- S0 O8 v! H# [2 N# ~4 [/ [
for projectile in arrows:, t' z. U' d8 t" V8 W* [7 S
arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)" U( y! s, M( E9 z3 G6 A$ |/ i
screen.blit(arrow1, (projectile[1], projectile[2]))
; \6 B5 _/ e$ O* }! c' |) B弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。# v' J) }' l! [. B" P5 `# ^
现在运行游戏,
# M* w# ^; [0 [; D8 l: c& z你应该能让小兔子在你点击鼠标的时候射击了!) I7 F& N- H& Y7 z
(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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