上回说到用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相关推荐

  1. python可以开发3d游戏吗_用python3从零开始开发一款烧脑射击游戏#3

    上回说到我们已经可以控制小方块的移动了,现在我们要把这个小方块放置到游戏场景里 剥去美术的外壳,游戏场景其实就是一个标记了玩家可行走与不可行走的空间 对于2D游戏,它是一个平面网格,3D游戏就是一个3 ...

  2. 以前一款半回合制java游戏_我以前玩过一款回合制游戏,很久以前的事了但是忘记叫什么名字了? 爱问知识人...

    仙剑系列 仙1是我第一个玩的游戏,感觉很粗糙,不过很经典. 直到玩了第2个游戏,仙3,3D的画面让我第一次感受了到单机游戏的丰富多采,让我开始步入单机游戏的的殿堂.仙3外还是我继幻想三国志2后,第二次 ...

  3. html小游戏代码_研发实践:Mozilla分享如何开发一款WebVR小游戏

    文章相关引用及参考:mozvr 本文来自Mozilla的Josh Marinacci (映维网 2019年02月06日)在倡导新技术时,我总是尝试采用现实世界开发者的方式,而对于WebVR,开发一款游 ...

  4. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)

    如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)_转 来源:www.armjishu.com 作者:jesse 转载请注明出处 首先,如果你有幸看到这篇文章,千万不要试图在2个小时内阅读完 ...

  5. 实战:一天开发一款内置游戏直播的国产版Discord应用【附源码】

    游戏直播是Discord产品的核心功能之一,本教程教大家如何1天内开发一款内置游戏直播的国产版Discord应用,用户不仅可以通过IM聊天,也可以进行语聊,看游戏直播,甚至自己进行游戏直播,无任何实时 ...

  6. Second Dinner 工作室正与漫威合作,开发一款漫画改编游戏

    Kotaku 的资深舅舅报道说,由前炉石执行制作人朱仲英(Hamilton Chu)领衔的 Second Dinner 工作室正与漫威合作,开发一款漫画改编游戏.该工作室规模很小,但骨干成员全部来自暴 ...

  7. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  8. 用python编21点游戏_【Python3】21点游戏

    刚开始学python,试着写了一个21点游戏. 游戏过程就是,一开始给你和庄家(就是电脑啦)各发两张牌,但庄家有一张是暗牌.接下来你可以选择是要牌(hit me)还是停止发牌直接开(stand),要牌 ...

  9. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)

    今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...

最新文章

  1. php 千万级访问量网站,承受每天百万级访问量的网站需要多少台服务器?
  2. PERL 语言中的q,qw,qr,qx,qq......符号用法总结
  3. Spring MVC-02循序渐进之解耦控制器和校验器
  4. sql语句练习(一)
  5. 六. 异常处理7.throw:异常的抛出
  6. tensorflow中的Session方法解释
  7. 管理功能(下):EqualLogic PS5000 强大丰富
  8. 简单粗暴的多目标跟踪神器 – DeepSort
  9. 智能硬件创业2周内快速做出产品原型
  10. 阿里云加密服务产品优势及使用场景
  11. 新浪自媒体重新开放注册   一点资讯全面布局?
  12. Ubuntu16.04安装Shark-3.0.0
  13. c++ 怎么输出保留2位小数的浮点数
  14. 洛谷P4012 深海机器人问题(费用流)
  15. python切片详解_python切片及sys.argv[]用法详解
  16. 查看网页上次更新时间
  17. win10分屏快捷键无法使用_win10分屏快捷键如何使用
  18. 企业为什么要选择阿里云国际版上云?
  19. 非常好用的一款在线json转excel的工具
  20. 教程 | 用Python识别图片验证码中的文字

热门文章

  1. 抓取html的内容,js获取网页选中内容(包含html代码)
  2. matlab生产计划问题,用MATLAB解决综合生产计划编制过程中的优化问题
  3. mysql待办事项表名_SSD8-Ex4待办事项列表答案参考
  4. 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
  5. 十、深入Java字符串(下篇)
  6. 化工原理知识点总结复习重点
  7. 七十六、SpringBoot 的数据缓存cache+Redis(三)
  8. 三十二楼层选几层最好_32层的房子买几楼好
  9. 一文解析激光雷达中时序融合的研究现状和发展方向
  10. 漫谈强化学习中的引导搜索策略