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

66c97166f778efc4446d0c3c74538361.png

让小兔子转向

现在,你的小兔子可以根据你的按键移动了!

不过现在小兔子一直面向右边。如果能用鼠标让小兔子面对不同的方向,不就更酷了吗!我们只需要用一些简单的三角函数知识就能解决这个问题。

让我们一起看看下面的插图

1da958f1ce16eefee841963528a7b631.png

如上图,假设(5,3)是小兔子的位置,(2,4)是鼠标的位置,旋转角度z就可以由三角函数atan2来求出(diff x和diff y分别为x、y坐标的差)。求出旋转角度z以后,我们便可以相应地让小兔子转向。

如果你没有完全理解这部分也没关系,你还是可以继续我们的教程!不过我们应该能够由此意识到数学在编程中的重要性。

现在我们要把上面的数学式用到我们的游戏里了。我们可以用surface.rotate(degress)函数来让小兔子转向。

小提示:用atan2求出的z值是用弧度制(radians)表示的。

atan2函数来自Python 的math库。所以我们要先把下面这行代码加到第一部分(#1)开头:

import math

接着,把第六部分(#6)的最后一行(带有player.blit的这行)改成下面的代码:

# 6.1 – 设定小兔子的位置并让它转向

position = pygame.mouse.get_pos()

angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))

playerrot = pygame.transform.rotate(player, 360-angle*57.29)

playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)

screen.blit(playerrot, playerpos1)

让我们一起看看上面的代码。首先,我们要知道鼠标的位置和小兔子的位置。接着,我们atan2函数得到角度。然后,我们要将atan2函数得到的角度从弧度制(radians)转化为角度制(degrees)(把弧度乘以57.29或者360/2π)。

因为小兔子被转向了,它的位置也会相应改变。所以最后我们要计算小兔子的新位置,然后让小兔子走到屏幕上相应的地方。

再次运行游戏。现在,如果你移动你的鼠标,小兔子也会跟着转动了!

7954995d185ea90e449a6fc70ee44c1a.png

小兔子,射击!

你的小兔子已经能够转动了,现在让我们给它添加一些动作!让小兔子在敌人来袭的时候向敌人射箭!

这一步可能稍微有些复杂,因为你需要用代码不停追踪弓箭的位置,计算弓箭射出的角度,并在它们超出屏幕范围时把它们删掉。

首先,在第二部分(#2)末尾添加一些要用到的变量:

acc=[0,0]

arrows=[]

第一个变量acc检测玩家的准确度,第二个变量arrows用于追踪所有弓箭。变量acc实际上是一个由两个数字组成的列表(list),它记录了射击的次数和被击中的獾的数量,我们要用这两个数字来计算精确度百分比。

接着,在第三部分(#3)末尾载入弓箭的图像:

arrow = pygame.image.load("resources/images/bullet.png")

当玩家点击鼠标的时候,需要有弓箭射出。把下面的代码加到第八部分(#8)末尾来实现这一功能:

if event.type==pygame.MOUSEBUTTONDOWN:

position=pygame.mouse.get_pos()

acc[1]+=1

arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])

这些代码检测玩家是否点击了鼠标。如果点击了鼠标,就记下鼠标的位置,并根据小兔子的位置和鼠标的位置得出弓箭射出的角度。这些角度值被记录在arrows列表中。

我们现在要让弓箭显示在屏幕上,把下面的代码加在#6.1末尾:

# 6.2 – 在屏幕上显示弓箭

for bullet in arrows:

index=0

velx=math.cos(bullet[0])*10

vely=math.sin(bullet[0])*10

bullet[1]+=velx

bullet[2]+=vely

if bullet[1]640 or bullet[2]480:

arrows.pop(index)

index+=1

for projectile in arrows:

arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)

screen.blit(arrow1, (projectile[1], projectile[2]))

弓箭的x、y坐标velx和vely的值都是用基本的三角函数计算出来的。10是弓箭的速度。if语句用于检测弓箭是否超出了窗口范围,如果超出的话,就把超出的弓箭从列表中删去。第二个for语句对所有弓箭进行循环,并画出它们正确的位置和角度。

现在运行游戏,

你应该能让小兔子在你点击鼠标的时候射击了!

(未完待续)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值