Python游戏开发,pygame模块,Python实现化学滑雪小游戏
2021/7/17 14:35:53
本文主要是介绍Python游戏开发,pygame模块,Python实现化学滑雪小游戏,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
往期回顾
Python实现“小兔子和Bun”游戏
Python实现八音符小游戏
Python实现拼图小游戏
前言:
本期我们将制作一个简单的滑雪游戏。
废话不多说,让我们愉快地开始吧~
结果
老规矩还是我们先看看效果图
开发工具
**Python版本:**3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理介绍
游戏规则:
玩家通过“AD”键或者“←→”操控前进中的滑雪者,努力避开路上的树,尽量捡到路上的小旗。
如果碰到树,则得分减50,如果捡到小旗子,则得分加10。
逐步实现:
Step1:定义精灵类
由于游戏涉及到碰撞检测(滑雪者与树和小旗之间的碰撞),因此我们定义两个精灵类,分别用于代表滑雪者和障碍物(即树和小旗):
'''滑雪者类''' class SkierClass(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) # 滑雪者的朝向(-2到2) self.direction = 0 self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1] self.image = pygame.image.load(self.imagepaths[self.direction]) self.rect = self.image.get_rect() self.rect.center = [320, 100] self.speed = [self.direction, 6-abs(self.direction)*2] '''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前''' def turn(self, num): self.direction += num self.direction = max(-2, self.direction) self.direction = min(2, self.direction) center = self.rect.center self.image = pygame.image.load(self.imagepaths[self.direction]) self.rect = self.image.get_rect() self.rect.center = center self.speed = [self.direction, 6-abs(self.direction)*2] return self.speed '''移动滑雪者''' def move(self): self.rect.centerx += self.speed[0] self.rect.centerx = max(20, self.rect.centerx) self.rect.centerx = min(620, self.rect.centerx) '''障碍物类''' class ObstacleClass(pygame.sprite.Sprite): def __init__(self, img_path, location, attribute): pygame.sprite.Sprite.__init__(self) self.img_path = img_path self.image = pygame.image.load(self.img_path) self.location = location self.rect = self.image.get_rect() self.rect.center = self.location self.attribute = attribute self.passed = False '''移动''' def move(self, num): self.rect.centery = self.location[1] - num
其中,滑雪者在前进过程中应当拥有向左,向右偏移的能力,并且在偏移时滑雪者向前的速度应当减慢才更加合乎常理,这样才能供玩家操作。同时,滑雪者应当拥有不同的姿态来表现自己滑行时的状态:
直线:
左偏一点:
左偏很多:
右偏一点:
右偏很多:
另外,尽管滑雪者的左右移动通过移动滑雪者本身实现,但是滑雪者的向前移动是通过移动障碍物实现的。
Step2:随机创建障碍物
现在我们需要定义一个随机创建障碍物的函数,以便在游戏主循环中调用:
其中障碍物创建两次的目的是便于画面衔接。
然后我们就可以定义主循环了:
'''游戏主循环''' while True: # --事件捕获 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT or event.key == pygame.K_a: speed = skier.turn(-1) elif event.key == pygame.K_RIGHT or event.key == pygame.K_d: speed = skier.turn(1) '''--更新当前游戏帧的数据''' skier.move() distance += speed[1] if distance >= 640 and obstaclesflag == 0: obstaclesflag = 1 obstacles0 = createObstacles(20, 29) obstacles = AddObstacles(obstacles0, obstacles1) if distance >= 1280 and obstaclesflag == 1: obstaclesflag = 0 distance -= 1280 for obstacle in obstacles0: obstacle.location[1] = obstacle.location[1] - 1280 obstacles1 = createObstacles(10, 19) obstacles = AddObstacles(obstacles0, obstacles1) for obstacle in obstacles: obstacle.move(distance) '''--碰撞检测''' hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False) if hitted_obstacles: if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed: score -= 50 skier.setFall() updateFrame(screen, obstacles, skier, score) pygame.time.delay(1000) skier.setForward() speed = [0, 6] hitted_obstacles[0].passed = True elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed: score += 10 obstacles.remove(hitted_obstacles[0]) '''--更新屏幕''' updateFrame(screen, obstacles, skier, score) clock.tick(cfg.FPS)
主循环的内容包括:
事件监听、障碍物的更新、碰撞检测以及分数的展示等内容,总之还是很容易实现的。
Step4:其他
开始、结束界面这些,就靠大家自己发挥了,我就写了一个简单的开始界面:
'''显示游戏开始界面''' def ShowStartInterface(screen, screensize): screen.fill((255, 255, 255)) tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5) cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20) title = tfont.render(u'滑雪游戏', True, (255, 0, 0)) content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255)) trect = title.get_rect() trect.midtop = (screensize[0]/2, screensize[1]/5) crect = content.get_rect() crect.midtop = (screensize[0]/2, screensize[1]/2) screen.blit(title, trect) screen.blit(content, crect) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: return pygame.display.update()
文章到这里就结束了,感谢你的观看,Python24个小游戏系列,下篇文章分享经典90坦克大战
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
⑥ 两天的Python爬虫训练营直播权限
All done~点赞+评论~详见个人简介或者私信获取完整源代码。。
这篇关于Python游戏开发,pygame模块,Python实现化学滑雪小游戏的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型
- 2024-12-23使用python部署一个usdt合约,部署自己的usdt稳定币
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享