python制作射击游戏_用python3从零开始开发一款烧脑射击游戏#2
上回说到用pygame绘制一个静止的小方块,今天将会实现通过鼠标或者键盘来控制小方块的移动
在这之前,首先我们需要考虑一个问题:
我们怎样才会认为一个物体在运动?风动,幡动还是仁者心动?
小方块在屏幕上的相对位置发生了变化,那就代表它移动了
与连续的现实世界不同的是,计算机内部的世界是离散化的,我们其实并没有真的去移动初始的小方块
而是在屏幕上不断的擦去旧的小方块,画出新位置上的小方块,玩家看起来就像它在移动一样
因此移动的实现逻辑就得到了:
在每一帧中擦去上一帧画的小方块
获取小方块当前的位置,并在这个位置画一个新的小方块
只要帧数足够多(超过视觉暂留的需求),就实现了小方块的“连续移动”
下面我们定义一个小方块的类
class Robot(object):
def __init__(self:
self.x = 120
self.y = 350
def Move(self):
self.x+=1
self.y+=1
pygame.draw.rect(screen,color1,Rect(self.x,self.y,20,20))
小方块的初始为止在(120,350),每调用一次Move,坐标就会修改,如果绘制出新的矩形,就实现了移动
我们用这个类创建一个对象
robot = Robot()
然后开始绘制屏幕
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(color)#用背景色刷掉前一帧的所有图形
robot.Move()#绘制新的位置
pygame.display.flip()
这样小方块就动起来辣
再来看怎么发出移动指令来控制移动行为
1.先看通过键盘的方向键来控制移动
pygame支持键盘事件,当按键按下的时候响应KEYDOWN事件,按键弹起的时候响应KEYDOWN事件
不过我不打算直接通过键盘事件来驱动移动行为,而采用一种更简便的方法:
在每帧更新方块位置时,获取当前被按下的键盘按键,然后对坐标做对应的修改:
key_press = pygame.key.get_pressed()
if(key_press[K_LEFT]):
self.x -= 1
elif (key_press[K_RIGHT]):
self.x += 1
elif (key_press[K_UP]):
self.y -= 1
elif (key_press[K_DOWN]):
self.y += 1
完整代码可以从这里获取
2.然后是鼠标控制。(鼠标控制要复杂一点,需要根据鼠标的点击维护好移动指令的状态)
这里我们将模拟实现鼠标移动操作最多的rts游戏(星际争霸与war3)中最基础的几个鼠标操作:
a.左键框选选中目标(可以同时选中框内的多个目标)
b.有选择单位时,右键点击移动位置,则选中的单位将会向目标点移动(持续移动,直到到达目标点为止,中间不需要其他命令)
c.左键单击空地,将会取消单位选中的状态
20190122_173911.gif
pygame支持一些鼠标事件,他们包括MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN
我们可以在事件轮训中判断当前是否发生鼠标事件
for event in pygame.event.get():
if event.type == MOUSEBUTTONDOWN:
#逻辑处理
由于我们是在帧触发时处理移动指令,我们需要自己记录鼠标的位置和点击状态(一组全局变量)
mouse_state = 0#0空闲,1左键按下,2右键按下
mouse_begin = [0,0]#鼠标按下时的起始位置
mouse_end = [0,0]#鼠标的当前位置
move_tar = [0,0]#鼠标右键选择的移动目标
move_click = False#是否有未处理的右键目标
check_select = False#是否需要检测框选目标
通过鼠标的按键信息,更新维护对应的状态变量:
pressed_array = pygame.mouse.get_pressed()
for index in range(len(pressed_array)):#判断鼠标按的是左中右的哪个键
if pressed_array[index]:
if index == 0:
mouse_state = 1
check_select = True
elif index == 2:
mouse_state = 2
if mouse_state > 0 :
mouse_begin = pygame.mouse.get_pos()#获取鼠标的箭头位置
有了这些信息后,我们就可以改造一下方块类,让它根据鼠标选择的位置来进行移动
class Robot(object):
def __init__(self,clo,ms):
self.dir = [0,0]
self.x = 120
self.y = 350
self.isselect = False#是否被框选中
self.color = clo#区分颜色
self.move_speed = ms#移动速度
self.tar =[0,0]#移动目标
def Move(self):
if check_select:#检测是否在左键拉出的框内
minx = min(mouse_begin[0],mouse_end[0])
maxx = max(mouse_begin[0],mouse_end[0])
miny = min(mouse_begin[1],mouse_end[1])
maxy = max(mouse_begin[1],mouse_end[1])
if(self.x >=minx and self.x <= maxx and self.y >= miny and self.y <= maxy):
self.isselect = True
else:
self.isselect = False
if move_click:#有移动指令
if self.isselect :
self.tar = move_tar
dx = self.tar[0]-self.x
dy = self.tar[1]-self.y
len=(dx*dx+dy*dy)**0.5
if(len > 0):
dx /= len
dy /= len
dx *= self.move_speed
dy *= self.move_speed
self.dir = [dx,dy]#计算移动向量
if( self.dir[0] != 0 or self.dir[1] != 0):#移动向量非0,表示需要移动更新坐标
dx = self.tar[0]-self.x
dy = self.tar[1]-self.y
len=(dx*dx+dy*dy)**0.5
if(len < 10):
self.x=self.tar[0]
self.y=self.tar[1]
self.dir = [0,0]
self.x += self.dir[0]
self.y += self.dir[1]
if True == self.isselect :
pygame.draw.rect(screen,color1,Rect(self.x,self.y,20,20))
else:
pygame.draw.rect(screen,self.color,Rect(self.x,self.y,20,20))
完整代码可以从这里获取
python制作射击游戏_用python3从零开始开发一款烧脑射击游戏#2相关推荐
- python可以开发3d游戏吗_用python3从零开始开发一款烧脑射击游戏#3
上回说到我们已经可以控制小方块的移动了,现在我们要把这个小方块放置到游戏场景里 剥去美术的外壳,游戏场景其实就是一个标记了玩家可行走与不可行走的空间 对于2D游戏,它是一个平面网格,3D游戏就是一个3 ...
- 以前一款半回合制java游戏_我以前玩过一款回合制游戏,很久以前的事了但是忘记叫什么名字了? 爱问知识人...
仙剑系列 仙1是我第一个玩的游戏,感觉很粗糙,不过很经典. 直到玩了第2个游戏,仙3,3D的画面让我第一次感受了到单机游戏的丰富多采,让我开始步入单机游戏的的殿堂.仙3外还是我继幻想三国志2后,第二次 ...
- html小游戏代码_研发实践:Mozilla分享如何开发一款WebVR小游戏
文章相关引用及参考:mozvr 本文来自Mozilla的Josh Marinacci (映维网 2019年02月06日)在倡导新技术时,我总是尝试采用现实世界开发者的方式,而对于WebVR,开发一款游 ...
- 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)
如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)_转 来源:www.armjishu.com 作者:jesse 转载请注明出处 首先,如果你有幸看到这篇文章,千万不要试图在2个小时内阅读完 ...
- 实战:一天开发一款内置游戏直播的国产版Discord应用【附源码】
游戏直播是Discord产品的核心功能之一,本教程教大家如何1天内开发一款内置游戏直播的国产版Discord应用,用户不仅可以通过IM聊天,也可以进行语聊,看游戏直播,甚至自己进行游戏直播,无任何实时 ...
- Second Dinner 工作室正与漫威合作,开发一款漫画改编游戏
Kotaku 的资深舅舅报道说,由前炉石执行制作人朱仲英(Hamilton Chu)领衔的 Second Dinner 工作室正与漫威合作,开发一款漫画改编游戏.该工作室规模很小,但骨干成员全部来自暴 ...
- python制作阴阳师脚本_利用python制作一个阴阳师小游戏
利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...
- 用python编21点游戏_【Python3】21点游戏
刚开始学python,试着写了一个21点游戏. 游戏过程就是,一开始给你和庄家(就是电脑啦)各发两张牌,但庄家有一张是暗牌.接下来你可以选择是要牌(hit me)还是停止发牌直接开(stand),要牌 ...
- python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)
今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...
最新文章
- php 千万级访问量网站,承受每天百万级访问量的网站需要多少台服务器?
- PERL 语言中的q,qw,qr,qx,qq......符号用法总结
- Spring MVC-02循序渐进之解耦控制器和校验器
- sql语句练习(一)
- 六. 异常处理7.throw:异常的抛出
- tensorflow中的Session方法解释
- 管理功能(下):EqualLogic PS5000 强大丰富
- 简单粗暴的多目标跟踪神器 – DeepSort
- 智能硬件创业2周内快速做出产品原型
- 阿里云加密服务产品优势及使用场景
- 新浪自媒体重新开放注册 一点资讯全面布局?
- Ubuntu16.04安装Shark-3.0.0
- c++ 怎么输出保留2位小数的浮点数
- 洛谷P4012 深海机器人问题(费用流)
- python切片详解_python切片及sys.argv[]用法详解
- 查看网页上次更新时间
- win10分屏快捷键无法使用_win10分屏快捷键如何使用
- 企业为什么要选择阿里云国际版上云?
- 非常好用的一款在线json转excel的工具
- 教程 | 用Python识别图片验证码中的文字
热门文章
- 抓取html的内容,js获取网页选中内容(包含html代码)
- matlab生产计划问题,用MATLAB解决综合生产计划编制过程中的优化问题
- mysql待办事项表名_SSD8-Ex4待办事项列表答案参考
- 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
- 十、深入Java字符串(下篇)
- 化工原理知识点总结复习重点
- 七十六、SpringBoot 的数据缓存cache+Redis(三)
- 三十二楼层选几层最好_32层的房子买几楼好
- 一文解析激光雷达中时序融合的研究现状和发展方向
- 漫谈强化学习中的引导搜索策略