自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(148)
  • 收藏
  • 关注

原创 【pygame实现星露谷物语风格游戏】21.交易商店的实现(完结)

至此,游戏的所有基本功能都已实现玩家可以砍树,砍苹果卖钱。通过金钱购买种子来种地,通过浇水,等待四天后植物成熟,收获植物再卖钱等等通过这个系列,基本上2D游戏的大部分通用的制作思路都能学到,再想拓展其他功能,或者自己创建一个属于自己的2D游戏,基本上就是简单的堆代码的工作了。正如开头所说,通过本次系列,最重要的是学习游戏制作的思路,至于pygame的API之类的,不重要。真要制作游戏还是建议使用游戏引擎。有了这些思想,再去学习其他的游戏引擎开发,基本上也就是学习一下API就可以掌握了。

2024-02-27 22:02:14 1016

原创 【pygame实现星露谷物语风格游戏】20.时间流动效果

思路就是给游戏窗口添加上一个蒙版,用到的函数是我们在写玩家睡觉,屏幕逐渐变黑的效果的时候用到的,大体思路也是一样的,一开始蒙版的颜色为[255,255,255],也就是纯白色,以 pygame.BLEND_RGBA_MULT 的方式绘制到窗口上后会透明。所以我们每一帧都减小一点蒙版颜色的RGB值,直到颜色变为(38,101,189),此时天就完全暗了,然后玩家睡觉之后,再把颜色重新设回[255,255,255],此时天就亮了。完成时间流动效果,随着时间的推移,游戏中的天色会逐渐变暗。

2024-02-27 21:39:05 452

原创 【pygame实现星露谷物语风格游戏】19.收获作物

当作物成熟后,玩家与作物发生碰撞,会触发收获作物的效果,此时作物会消失,并且会有白色的粒子效果,此外玩家背包里会多出来一份相应的作物。收割植物的函数写在level.py中,基本都是调用之前写过的函数,十分简单。接下来在run函数中不断调用这个函数即可。

2024-02-26 00:12:11 395

原创 【pygame实现星露谷物语风格游戏】18.种植作物

其中,参数中的soil是种植这株植物的土壤,我们可以从soil.rect里获取坐标,这样就不用单独把坐标当作参数传递进来了,而check_watered是检擦这株植物所在的土地是否浇水了的函数,这个函数我们一会在实现。接下来,我们的思路就是,每天起床的时候,就会调用所有植物的grow函数,我们先来完成调用所有植物的grow函数这一操作,把它写道update_plant函数里。grow函数的作用是实现植物的一次生长,比如植物的age是1,grow之后age就变成了2,并且还会改变对应年龄的贴图。

2024-02-26 00:10:41 947

原创 【pygame实现星露谷物语风格游戏】17.下雨

但是正在空中的雨滴,我们还需要他有一个向下的动画,这个很简单,首先判断这个雨滴是否是在空中的雨滴,这个只需要在传递参数的时候传递一个叫move的参数,如果move为true,就说明这个雨滴是正在空中的雨滴,是需要向左下方移动的,只要给他一个向左下的二维矢量当作速度,像我们之前写玩家的移动一样让它动起来即可。这样,我们在外面创建一个Rain的对象,然后调用这个对象的update方法,就会在地图的随机地方,分别生成一个落在地上的雨滴,和在空中的雨滴,经过400到500ms之后再消失。

2024-02-25 15:38:28 947

原创 【pygame实现星露谷物语风格游戏】16.浇水

接下来的思路和开垦荒地一样,玩家浇水,遍历所有被开垦过的土地这个精灵组中的精灵,如果有土地与玩家的水壶的坐标重叠,说明浇的是这一片土地,就创建一个WaterTile精灵来覆盖到这片土地上面,达到土地湿润的视觉效果。首先需要导入水渍的图片,水渍的图片一共有三张,到时候我们会随机选择其中的一张来绘制,因此我们需要用到之前在support.py中写的方法, 还得把它导入进来。获取浇水功能,拿着水壶对着开垦过的土地使用,会获得水渍效果,并且睡一觉后,到了第二天,水渍会消失。于是,我们就完成了本次的所有任务。

2024-02-25 15:34:01 329

原创 【pygame实现星露谷物语风格游戏】15.开垦土壤

首先要明确我们的思路,当开垦过土地之后,我们要新建一个精灵,把精灵加入我们初始化的时候创建的soil_sprites精灵组里面,此外因为需要把他绘制出来,还要放到all_sprites精灵组里,把精灵的贴图设为我们初始化的时候导入进来的开垦过的土地的贴图。每次调用create_soil_tiles函数的时候,我们先把soil_sprites精灵组清空,也就是先把之前创建的所有的开垦过的土地的精灵给消除掉,然后再查询grid,把里面所有带标记'X'的土地块的位置都在创建一个开垦过的土地的精灵。

2024-02-25 15:31:17 819

原创 【pygame实现星露谷物语风格游戏】14.睡觉功能的完成

我们先不急着调用这个函数,接下来,我们还要完成玩家睡觉的动画效果:屏幕慢慢变黑,然后再慢慢亮起来,这个效果所需的代码比较多,因此我们新开一个文件叫transition,在里面实现这个功能。接下来,我们希望玩家睡觉来到新的一天,新的一天会对作物的一些状态进行刷新,现在,我们能做的就是让树上重新长出一些苹果,我们在level.py里做这些改动。它的返回值是与第一个参数的精灵发生碰撞的精灵,如果b传递的是一个精灵组,并且精灵组中同时有多个精灵与a发生了碰撞,那么就会返回一个列表。

2024-02-25 15:28:09 863

原创 【pygame实现星露谷物语风格游戏】13.玩家背包的创建

接着,我们要到tree这个类里面,每当苹果掉落或者树木消失的时候,就调用一次这个函数,由于level与sprites这两个文件是不互通的,所以要在创建tree对象的时候把player_add这个函数当作参数传递进去。接下来只需要在苹果消失的时候调用sef.player_add("apple"),树木消失的时候调用self.player_add("wood")即可。创建一个玩家的背包,里面记录玩家背包里的苹果数,木头数,小麦数,马铃薯数。接下来我们要写一个函数,让玩家背包里相应的物品的数目加一。

2024-02-25 15:24:30 394

原创 【pygame实现星露谷物语风格游戏】12.砍树粒子效果的创建

至于为什么z值选择fruit,是因为作者在写LAYERS这个常量的时候忘记了粒子效果这种情况了,并没有给他单独设置Z值,不过把它与fruit设置为同一图层并不影响视觉效果,因为树木先绘制出来的,粒子效果后绘制出来的,粒子效果依旧会覆盖掉树木。这里的思路就是,每当砍掉树木的时候,新创建一个精灵,它的外形与原树木相同,只不过颜色变成了白色,绘制覆盖到原来的树木上,经过很短的时间(苹果200ms,树木300ms)后,再kill掉这个精灵,就能达到白光一闪的效果。以及苹果被摧毁的时候创建粒子效果这个对象。

2024-02-25 15:21:52 401

原创 【pygame实现星露谷物语风格游戏】11.砍树

接着就是砍树功能的实现,大体思路就是玩家那边砍树会调用tree这边的函数,相应砍树的结果,先不管player那边怎么写,tree这边的思路就是给树设置一个生命值,写一个damage函数,每次玩家砍树都会调用tree的damage函数,在damage函数里对树的生命值减一,同时如果树上还有苹果,就去掉一个苹果。他是一个字典,key值是树的名字,按照大树和小树来进行明明,value值是一系列的坐标,这个坐标是相对的,是苹果相对于果树的左上角的坐标。逻辑是,首先判断玩家在使用斧子的时候面前是否有树。

2024-02-25 15:20:19 931

原创 【pygame实现星露谷物语风格游戏】10.碰撞箱

接下来,我们的思路就是,所有会与玩家发生碰撞的精灵,都加入一个叫collision_sprites的精灵组,然后在player这个类里,每次进行移动的时候,都会遍历collision_sprites精灵组中的所有精灵,如果player在移动的过程中与这个精灵组的任何一个精灵碰撞箱发生了重叠,就说明它们发生了碰撞,这时候我们再对发生碰撞的这种情况进行处理。实际上,我们同时按住上键和右键,视觉效果是斜着向右上方走的,实际上是每一帧先向右走一点,再向上走一点,这是由我们代码的书写顺序决定的。

2024-02-25 15:11:27 820

原创 【pygame实现星露谷物语风格游戏】9.绘制地图中的其他事物,并且打造伪3D效果

目前还有一个问题,就是虽然树木,墙壁野花等等这些东西的z值和玩家是相同的,但是其绘制顺序还是得分个先后的,现在我们是无论什么情况都把玩家画在最上面,这就造成了如下图所示的问题:我们实际上在树的后面,但是视觉效果在树的树顶。所谓的伪3D效果,就是当玩家在树(也可以是地图中的一切东西,这里用树举例)的前面时,系统会将玩家的图层放到树的图层的上面,造成视觉上的玩家在树前面的效果。同样的,房间的地毯也是具有相同的性质,所以可以用相同的代码来写,不过为了节省空间,利用一个for循环把地板和地毯都创建出来了。

2024-02-25 15:06:39 974

原创 【pygame实现星露谷物语风格游戏】8.游戏地图的绘制与摄像机的创建

但是怕以后会用得到,还是按照原作者的方式写的。此时的offset_rect = (554,298),因为player_rect_center是取的主角的图像的中心点的坐标,而offset_rect是取得精灵图像的左上角的坐标,所以实际上这两个绘制出来是在同一个地方的。这样,我我们在绘制精灵的时候,不仅要根据z轴的大小来决定先绘制谁,而且还要达到摄像机跟随主角的效果,作者提供的精灵组的draw方法显然是不能满足我们的需求的,因此我们需要重写它的draw方法。

2024-02-25 15:01:06 856

原创 【pygame实现星露谷物语风格游戏】7.物品框的展示

具体的细节都写在注释里了,其中 新接触到的东西只有 self.display_surface.blit()这个函数,这是将图片绘制到屏幕的指定位置的函数,它的两个参数第一个为图片,第二个为一个坐标,比如self.display_surface.blit(img,(0,0))就是把图片img绘制到坐标为(0,0)的地方。首先创建一个名为overlay.py的文件,用于书写Overlay类,该类的作用是,将玩家可能手持的所有工具或者种子的图片导入进来,并且根据玩家实际手持的工具,将其展示在屏幕的左下角。

2024-02-25 14:57:19 380

原创 【pygame实现星露谷物语风格游戏】6.工具的切换,种子的切换

上一次,我们完成了实用工具的动画,但是并不能切换工具,这次我们要实现的功能是:按键盘左边shif键,切换工具。此外,还要完成种子的切换和使用,按下键盘右边的键,切换种子,按下右边ctrl键,使用种子。但是在这节并不会实现使用种子的动画,把他们放在以及只是因为他们切换的代码十分相似。

2024-02-25 14:55:26 361

原创 【pygame实现星露谷物语风格游戏】5.工具的使用

上一节完成了玩家移动动画的制作,这次要完成实用工具动作的绘制。效果就是按下空格,玩家使用工具。

2024-02-25 14:52:22 922

原创 【pygame实现星露谷物语风格游戏】4.玩家移动的动画制作

在上一节,我们把玩家的所有动作需要的图片都导入进来了,并且存放在了一个名为animations的数据结构中,这次,我们需要把玩家移动的动画制作出来,让玩家不再是简单的图片平移。

2024-02-25 14:48:59 995

原创 【pygame实现星露谷物语风格游戏】3.玩家图片素材的导入

在上一节,我们完成了玩家的移动,但是并没有给玩家一个具体的形象,因此这里我们要导入玩家的图片素材,并且把player类的image替换成相应的图片所有的图片素材都在与code同级的graphics文件夹下,其中玩家的图片素材在character文件夹下但是玩家有很多种状态,比如向上移动的时候,向下移动的时候,砍树的时候,浇水的时候等等,在做不同的动作的时候,玩家的图片肯定是不一样的,因此我们把做不同动作用到的图片分别装在了不同的文件夹下,如下图所示。

2024-02-25 14:46:33 898

原创 【pygame实现星露谷物语风格游戏】2.玩家的创建与移动

上一节中,我们完成了main.py与settings.py的代码,实现了窗口的创建与显示,并且完成了level.py中Level类的框架,等待我们以后的完善。这次我们要完成玩家的创建于移动。效果如下图所示由于我们还没有给玩家赋予一个形象(这一点需要下一节来完成),因此采用一个绿色的方块来代表玩家。我们可以按键盘上的上下左右键来控制玩家的移动,并且同时按住上或者下于左或者右可以斜着移动。在进行代码编写之前,我们需要先了解一个pygame中的概念:精灵于精灵组。

2024-02-23 02:23:47 914

原创 【pygame实现星露谷物语风格游戏】1.窗口的创建与展示

本次,我们在settings.py中创建了本项目所需要的所有常量,并且在main.py中完成了游戏窗口的创建与显示,并且创建了Level对象并在游戏主循环中调用其run()函数。在level.py中,我们编写了Level类的框架,包括一个初始化__init__函数和一个run()函数,这两个函数等待我们的后续完善。

2024-02-23 02:15:18 1243 1

原创 【openCV+mediapipe+yolo项目集】1.手部跟踪小项目以及手部跟踪模块的创建

大概的工作流程就是,先检测手在哪里,并且检测到手的数量不能超过传入的参数max_num_hands设置的数量.然后如果第一个参数为False,就会进入跟踪模式,在此期间如果跟踪的东西为手的置信度小于传入的第四个和第五个参数的值,就会重新检测手在哪里,否则就一直跟踪.这种方法比较节省资源.如果第一个参数设置为True,就会每一帧每一帧一直检测手在哪里,会浪费资源并且速度变慢。需要改的地方不多,只不过把一些功能写到一个类里面,提供两个方法,一个是寻找手部的代码,另一个是查询坐标的代码,具体细节看注释即可。

2024-02-19 00:52:04 1410 1

原创 【openCV学习】38.车辆检测计数项目

8.经过观察,会发现,由于车内有车灯,车牌等物件,可能会在大车的轮廓框内包含一些小的车灯的,车牌的轮廓框,因此我们设置当宽和高大于某一个值的时候,才绘制出显示框,这样就可以把车灯和车牌等干扰项给排除掉。3.去掉背景后的视频,不动的地方是黑色的,移动的地方会显现出白色,会发现有黑色的背景有时会出现白色的小方块的噪声,因此采用腐蚀操作去除噪声(腐蚀)2.去噪后消除背景,在计算机视觉中,不动的叫背景,移动的叫前景(这里使用到了一个新的API,是关于去除视频背景的)进行视频背景去除后的视频截图。

2024-02-19 00:38:37 1731 1

原创 【openCV学习】37.拉普拉斯金字塔

它的作用是进行图像压缩,当拥有了高斯金字塔图像和拉普拉斯金字塔图像,二者结合起来就可以得到原图了。拉普拉斯金字塔并没有API,他是通过原图与高斯金字塔图像进行相减运算得到的。它的效果是得到高斯金字塔丢失掉的细节的部分。

2024-02-19 00:35:08 317

原创 【openCV学习】36.高斯金字塔

高斯金字塔是用来进行图像的缩放的。

2024-02-19 00:34:03 372

原创 【openCV学习】35.绘制外接矩阵

最小外接矩形函数返回的外接矩阵是一个包含矩阵中心点,宽高,旋转角度的元组,需要用到cv2.boxPoints()函数将其转换成四点坐标的形式,全是坐标的形式就与轮廓的形式大致相同了,我们的目的是想用drawCountrys函数将这个矩阵绘制出来,因此还需要把返回的矩阵的坐标的float类型的数值经过四舍五入之后变成int类型,这样就能绘制了。而最大外接矩形返回的是四个值,分别是左上角坐标,宽和高,可以直接用rectangel绘制即可。外接矩阵分为最大外接矩阵和最小外接矩阵两种。

2024-02-19 00:31:54 347

原创 【openCV学习】34.凸包

凸包是把轮廓上最少的点连接成一个多边形,是这个多边形把轮廓本身给圈进去。

2024-02-19 00:30:36 315

原创 【openCV学习】33.多边形逼近算法(DP算法)

在使用findContours提取轮廓后的轮廓过于复杂不够平滑,可以利用Douglas_Peucher(简称DP)算法对该轮廓进行多边形逼近,使其变成一个平滑但又不失真的轮廓。对于一个轮廓,找一个起点和终点,这里定义为A和B,然后连接起点和终点,组成线段AB,然后找到这个轮廓上距离线段AB最近的点,这里记为C,计算C到线段AB的距离,这里记为h。可以看到红色的轮廓虽然十分贴近原图,但是其拐点较多,而绿色的图形则更加平滑,并且还保留了手部的图形特征。绿色的线条为进行阈值为15的多边形逼近后得到的轮廓。

2024-02-19 00:29:30 486

原创 【openCV学习】32.轮廓面积与长度的计算

【代码】【openCV学习】32.轮廓面积与长度的计算。

2024-02-19 00:27:44 359

原创 【openCV学习】31.查找轮廓与绘制轮廓

如果findContours的第三个参数选的不是SIMPLE而是NONE,那么contours里面存的是轮廓上所有点的坐标。要注意绘制轮廓是在原图上绘制的,如果想保留原图需要拷贝一份。其中RETR_TREE=3最常用。返回值轮廓是一系列轮廓拐点的坐标。

2024-02-19 00:25:56 351

原创 【openCV学习】30.黑帽操作

参数: img是原图,cv2.MORPH_BLACKHAT代表要进行黑帽操作,也可以把BLACKHAT改成其他的单词来进行形态学的其他运算。是卷积核,iterations代表迭代次数。黑帽 = 原图 - 闭运算图。就是只保留了闭运算去除的噪声。

2024-02-18 16:25:20 319

原创 【openCV学习】29.顶帽操作

参数: img是原图,cv2.MORPH_TOPHAT代表要进行顶帽操作,也可以把TOPHAT改成其他的单词来进行形态学的其他运算。是卷积核,iterations代表迭代次数。顶帽 = 原图 - 开运算后的图。也就是只保留了 开运算去除的噪声。

2024-02-18 16:24:25 314

原创 【openCV学习】28.形态学梯度

参数: img是原图,cv2.MORPH_GRADITENT代表要进行梯度运算,也可以把GRADITENT改成其他的单词来进行形态学的其他运算。图片中没有被腐蚀的部分不管是黑色还是白色,相减之后都是0(1-1=0,0-0=0),也就是黑色。被腐蚀掉的部分在原图中为1,在腐蚀图中为0,1-0=1,这样会呈现白色。在形态学中,梯度 = 原图 - 腐蚀后的图片。是卷积核,iterations代表迭代次数。求形态学梯度可以达到提取轮廓的效果。

2024-02-18 16:23:04 348

原创 【openCV学习】27.闭运算

参数: img是原图,cv2.MORPH_CLOSE代表要进行闭运算,也可以把OPEN改成其他的单词来进行形态学的其他运算。他的应用场景也是为了消除噪声,不过是为了消除 黑色部分的噪声,如下图。闭运算与开运算相反,是先进行膨胀后进行腐蚀。是卷积核,iterations代表迭代次数。

2024-02-18 16:20:21 389

原创 【openCV学习】26.开运算

参数: img是原图,cv2.MORPH_OPEN代表要进行开运算,也可以把OPEN改成其他的单词来进行形态学的其他运算。腐蚀过后把噪声去除,在对这张图片进行膨胀操作,把因为腐蚀而缩小的图片进行还原。是卷积核,iterations代表迭代次数。开运算提供了去除噪声的一种新的思虑。在一些情况下比高斯滤波的效果还要好。开运算是先腐蚀在膨胀。

2024-02-18 16:19:05 474

原创 【openCV学习】25.膨胀操作

可以看到白色的字体比之前要粗,且白色的噪声比之前要大。膨胀是与腐蚀相反的操作,效果是将二值图1的部分扩张。参数:图片,卷积核,迭代次数。参数与腐蚀eroad相同。

2024-02-18 16:17:50 385

原创 【openCV学习】24.腐蚀操作与形态学卷积核的获取

腐蚀是用一个全是1的卷积核去扫描一个二值图,由于卷积核全是1,当锚点为白色(1),但是卷积核覆盖的范围内只要有一个是黑色的(0),由于卷积运算中有乘法的部分,因为这一个0,锚点最终都会被计算成0,也就是被腐蚀成黑色的了。指的是卷积核中1组成的形状,其中MORPH_RECT为矩形,MORPH_ELLIPSE椭圆,MORPH_CROSS十字。如图所示,用一个5*5的卷积核去扫描这个图像,那么虚线外面的白色部分都会被腐蚀成黑色。参数:图片,卷积核,迭代次数,迭代次数表示腐蚀执行的次数。

2024-02-18 16:15:38 396

原创 【openCV学习】23.自适应阈值二值化

与全局二值化中的Type相同,blockSize是邻域大小(用来计算阈值所取的范围),C是常数,计算出阈值后再减去这个常数。参数:img是图片,maxValue是最大值,adaptiveMethod是自动取阈值的方法。从经验上来说,改变c的大小对结果的影响比较大。自适应阈值二值化只有一个返回值。

2024-02-18 16:13:59 377

原创 【openCV学习】22.全局二值化

通常设置一个阈值,超过这个阈值的像素点值设为一个数,小于这个阈值的像素点设为另一个书,这样处理过后的图片就是一个二值化的图片。参数:scr是图片,thresh是阈值,maxval是最大值,type是操作类型。THRESH_BINARY_INV:超过阈值变成0,小于阈值变成最大值。THRESH_BINARY:超过阈值变成最大值,小于阈值变成0。THRESH_TRUNC:超过阈值变成阈值,小于阈值保持不变。操作类型指的是超过阈值变成多少,小于阈值变成多少。有两个返回值,一个是阈值,一个是处理后的图片。

2024-02-18 16:12:59 398

原创 【openCV学习】21.各种算子

其中cv2.CV_64F这个参数代表计算完之后图片的内容的数据类型,这里用的是openCV中的float64。参数:图片,输出图片的数据类型,-1代表与输入图片的数据类型一致,ksize代表卷积核大小。参数中的0和1代表计算哪个方向的梯度,分别为dx和dy,哪个为1代表计算哪个方向的梯度。拉普拉斯算子不同于前两个需要分开计算x轴和y轴的梯度,它只需要一条语句就可以了。算子和Sobel算子一样,只不过改变了卷积核里面的值。参数:图片,两个阈值,阈值越小,细节越丰富。索贝尔算子 sobel"""

2024-02-18 16:12:02 375

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除