热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android游戏编程之从零开始_Python游戏编程之作品完结(五)

本教程是《Python游戏编程》系列的第5节,如果您还没有学习第4节,请看这里:Python游戏编程之事件监听(四)对于我们的赛车游戏&#

本教程是《Python游戏编程》系列的第5节,如果您还没有学习第4节,请看这里:Python游戏编程之事件监听(四)

对于我们的赛车游戏,现在的车辆还太少了,只有我们自己一辆,是时候需要添加更多的车辆了,开始吧!

我们前面讲过,每辆赛车都是一个对象,是从Car类中实例化出来的。

在主程序中,我们还将创建额外的四辆赛车,并将它们添加到名为“all_comming_cars”的列表中。每辆车将被赋予不同的颜色、速度和不同的起始位置(根据x和y坐标来控制),下面将列出完整的代码,你可以根据代码来比对学习。

这四辆车将从屏幕顶部开始运行,驶向屏幕底部,刚好与我们控制的小车方向相反。当它们到达屏幕底部时,将在屏幕顶部设置上新的颜色、速度和起始位置,这就会给你有一种各种各样源源不断的汽车的“幻象”。

游戏的整体速度将被存储在一个变量,新的事件处理程序将检测用户何时按下键盘上的上方向键或下方向键,从而使速度变量增加或减少0.05。

6b3852c262d4cb49fcb65b84b4eb8662.png

pygame

游戏完整代码

这是我们最新的Car类代码:

import pygameWHITE = (255, 255, 255)class Car(pygame.sprite.Sprite): def __init__(self, color, width, height, speed): super().__init__() self.image = pygame.Surface([width, height]) self.image.fill(WHITE) self.width = width self.height = height self.color = color self.speed = speed pygame.draw.rect(self.image, self.color, [0, 0, self.width, self.height]) self.rect = self.image.get_rect() def moveRight(self, pixels): self.rect.x += pixels def moveLeft(self, pixels): self.rect.x -= pixels def moveForward(self, speed): self.rect.y += self.speed * speed / 20 def moveBackward(self, speed): self.rect.y -= self.speed * speed / 20 def changeSpeed(self, speed): self.speed = speed def repaint(self, color): self.color = color pygame.draw.rect(self.image, self.color, [0, 0, self.width, self.height])

这是最新的主程序代码:

import pygame, random, sysfrom car import Carpygame.init()GREEN = (20, 255, 140)GREY = (210, 210, 210)WHITE = (255, 255, 255)RED = (255, 0, 0)PURPLE = (255, 0, 255)YELLOW = (255, 255, 0)CYAN = (0, 255, 255)BLUE = (100, 100, 255)speed = 1colorList = (RED, GREEN, PURPLE, YELLOW, CYAN, BLUE)SCREENWIDTH = 800SCREENHEIGHT = 600size = (SCREENWIDTH, SCREENHEIGHT)screen = pygame.display.set_mode(size)pygame.display.set_caption("F1赛车游戏")all_sprites_list = pygame.sprite.Group()playerCar = Car(RED, 60, 80, 70)playerCar.rect.x = 160playerCar.rect.y = SCREENHEIGHT - 100car1 = Car(PURPLE, 60, 80, random.randint(50, 100))car1.rect.x = 60car1.rect.y = -100car2 = Car(YELLOW, 60, 80, random.randint(50, 100))car2.rect.x = 160car2.rect.y = -600car3 = Car(CYAN, 60, 80, random.randint(50, 100))car3.rect.x = 260car3.rect.y = -300car4 = Car(BLUE, 60, 80, random.randint(50, 100))car4.rect.x = 360car4.rect.y = -900all_sprites_list.add(playerCar)all_sprites_list.add(car1)all_sprites_list.add(car2)all_sprites_list.add(car3)all_sprites_list.add(car4)all_coming_cars = pygame.sprite.Group()all_coming_cars.add(car1)all_coming_cars.add(car2)all_coming_cars.add(car3)all_coming_cars.add(car4)clock = pygame.time.Clock()while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_x: playerCar.moveRight(10) keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: playerCar.moveLeft(5) if keys[pygame.K_RIGHT]: playerCar.moveRight(5) if keys[pygame.K_UP]: speed += 0.05 if keys[pygame.K_DOWN]: speed -= 0.05 for car in all_coming_cars: car.moveForward(speed) if car.rect.y > SCREENHEIGHT: car.changeSpeed(random.randint(50, 100)) car.repaint(random.choice(colorList)) car.rect.y = -200 all_sprites_list.update() screen.fill(GREEN) pygame.draw.rect(screen, GREY, [40, 0, 400, SCREENHEIGHT]) pygame.draw.line(screen, WHITE, [140, 0], [140, SCREENHEIGHT], 5) pygame.draw.line(screen, WHITE, [240, 0], [240, SCREENHEIGHT], 5) pygame.draw.line(screen, WHITE, [340, 0], [340, SCREENHEIGHT], 5) all_sprites_list.draw(screen) pygame.display.flip() clock.tick(60)

下面是我们游戏的运行效果:

70c917a07bdabba4b0855b8ec239f78e.png

游戏作品运行效果

检测碰撞(彩蛋!)

最后,给你一个作业,我们现在的游戏,在碰到其他汽车后还没有反应,这可不行,多危险啊!像其他游戏一样,我们需要添加碰撞检测功能:目的是检查一个角色何时与其他角色发生碰撞,如果碰撞后,就需要扣分或者Game Over了!

0423c397f06428afc5053cc2aa60bd9e.png

汽车碰撞可不是好事

你需要在主程序循环的“游戏逻辑”部分中添加下面的代码,快去试试吧,祝你好远!

car_collision_list = pygame.sprite.spritecollide(playerCar,all_coming_cars,False)for car in car_collision_list:print("Car crash!")

好了,目前为止,我们已经完成了Pygame的F1赛车游戏,谢谢你的一路陪伴和学习,后面我会推出更多的精彩系列作品,快动手练习起来吧!

如果你喜欢我的文章,欢迎您关注我的头条号:@科技时代聊编程,也欢迎观看我的《跟我学Python,创意编程之旅》的系列原创编程视频,每天都有精彩视频等你喔!



推荐阅读
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
怡伶心怡67
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有