当前位置: 首页 > news >正文

六、小白如何用Pygame制作一款跑酷类游戏(静态障碍物和金币的添加)

六、小白如何用Pygame制作一款跑酷类游戏(静态障碍物和金币的添加)


文章目录

  • 六、小白如何用Pygame制作一款跑酷类游戏(静态障碍物和金币的添加)
  • 前言
  • 一、图片素材的导入
  • 二、代码部分
    • 1.金币是一个动态的精灵,创建金币精灵类
    • 2.mian方法中导入金币精灵类和随机数包
    • 3.创建两个存放障碍图片对象的数组
    • 4.因为金币不唯一,所以创建一个精灵族来存放所有的金币精灵
    • 5.计划在右半边的时候加入静态的障碍(采用随机数随机添加金币和障碍物)
    • 6.runner_main 的全部代码
  • 三、实现效果


前言

本篇文章将主要介绍静态障碍物的添加,其中包括金币以及主角可以跨越的向上障碍物和需要滑行的向下障碍物。


一、图片素材的导入

创建存放金币图片的gold文件夹
创建存放障碍物图片的stone文件夹

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、代码部分

1.金币是一个动态的精灵,创建金币精灵类

在这里插入图片描述

代码如下:

import pygame
class Gold(pygame.sprite.Sprite):def __init__(self):super(Gold, self).__init__()self.image = pygame.image.load('material/image/gold/1.PNG').convert_alpha()self.images = [pygame.image.load('material/image/gold/{:d}.PNG'.format(i)).convert_alpha() for i inrange(1, 26)]self.rect = self.images[0].get_rect()self.rect.top=450self.loc=0def update(self, *args):if args[0] % 4 == 0:i = int(args[0] / 4)self.image=self.images[i % len(self.images)]

2.mian方法中导入金币精灵类和随机数包

from Gold import Gold
import random

3.创建两个存放障碍图片对象的数组

#存放向上的
uplist=[]
#存放向下的
downlist=[]
upadress=['up1.png','up2.png','up3.png','up4.png']
downadress=['platform1.png','platform2.png','platform3.png','platform4.png','platform5.png']
#根据图像的位置加入到相应的数组当中
for i in range(len(downadress)):stone_image_path= 'material/image/stone/'+downadress[i]stone_img_obj=pygame.image.load(stone_image_path).convert_alpha()downlist.append(stone_img_obj)
for i in range(len(upadress)):stone_image_path= 'material/image/stone/'+upadress[i]stone_img_obj=pygame.image.load(stone_image_path).convert_alpha()uplist.append(stone_img_obj)

4.因为金币不唯一,所以创建一个精灵族来存放所有的金币精灵

goldGroup = pygame.sprite.Group()

5.计划在右半边的时候加入静态的障碍(采用随机数随机添加金币和障碍物)

#于是在当右半边移动到左边尽头的时候确定下来接下来的对象#这里采用随机数的方法barrier = []for i in range(0,4):random_number = random.randint(1, 15)if 10 <= random_number <= 15:gold1=Gold()gold2=Gold()gold3=Gold()gold1.loc=i*barriarMargingold2.loc=i*barriarMargin+1*70gold3.loc=i*barriarMargin+2*70goldGroup.add(gold1)goldGroup.add(gold2)goldGroup.add(gold3)barrier.append(1)elif random_number == 1:barrier.append(2)elif random_number == 2:barrier.append(3)elif random_number == 3:barrier.append(4)elif random_number == 4:barrier.append(5)elif random_number == 5:barrier.append(6)elif random_number == 6:barrier.append(7)elif random_number == 7:barrier.append(8)elif random_number == 8:barrier.append(9)elif random_number == 9:barrier.append(10)if -1080<right<1080:for sprite in goldGroup:sprite.rect.left=sprite.loc+rightgoldGroup.draw(screen)goldGroup.update(index)for i in range(len(barrier)):if barrier[i]==2:a = uplist[0]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 465)elif barrier[i]==1:continueelif barrier[i]==3:a = uplist[1]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 460)elif barrier[i]==4:a = uplist[2]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 455)elif barrier[i]==5:a = uplist[3]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 460)elif barrier[i]==6:a = downlist[0]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 330)elif barrier[i]==7:a = downlist[1]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 350)elif barrier[i]==8:a = downlist[2]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 365)elif barrier[i]==9:a = downlist[3]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 350)elif barrier[i]==10:a = downlist[4]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 210)screen.blit(a, arect)#及时从金币精灵族移除不需要的金币精灵for goldsprite in goldGroup:if goldsprite.rect.right<=0:goldGroup.remove(goldsprite)

6.runner_main 的全部代码


import pygamefrom Gold import Gold
import random
from Myself import Myself
import ospygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((1080, 600))
pygame.display.set_caption('跑酷游戏')
#背景图
bg_image_path1 = 'material/image/background4.jpg'
bg_img_obj1 = pygame.image.load(bg_image_path1).convert_alpha()
#道路图
road_image_path= 'material/image/road1.png'
road_img_obj=pygame.image.load(road_image_path).convert_alpha()
#距离图
km_image_path= 'material/image/km.png'
km_img_obj=pygame.image.load(km_image_path).convert_alpha()
#按键图
keyUp_image_path= 'material/image/keyboardUpUp.png'
keyUp_img_obj=pygame.image.load(keyUp_image_path).convert_alpha()
keyLeft_image_path= 'material/image/keyboardLEFT.png'
keyLeft_img_obj=pygame.image.load(keyLeft_image_path).convert_alpha()
keyDown_image_path= 'material/image/keyboardDown.png'
keyDown_img_obj=pygame.image.load(keyDown_image_path).convert_alpha()
font_path = 'material/ziti/AlimamaFangYuanTiVF-Thin-2.ttf'  # 例如 'SimSun.ttf'
chinese_font = pygame.font.Font(font_path, 30)
text_surface = chinese_font.render('跳跃', True, (0, 0, 255))
text1_surface = chinese_font.render('疾跑', True, (0, 0, 255))
text2_surface = chinese_font.render('滑行', True, (0, 0, 255))
#创建两个存放障碍图片对象的数组
#存放向上的
uplist=[]
#存放向下的
downlist=[]
upadress=['up1.png','up2.png','up3.png','up4.png']
downadress=['platform1.png','platform2.png','platform3.png','platform4.png','platform5.png']
#根据图像的位置加入到相应的数组当中
for i in range(len(downadress)):stone_image_path= 'material/image/stone/'+downadress[i]stone_img_obj=pygame.image.load(stone_image_path).convert_alpha()downlist.append(stone_img_obj)
for i in range(len(upadress)):stone_image_path= 'material/image/stone/'+upadress[i]stone_img_obj=pygame.image.load(stone_image_path).convert_alpha()uplist.append(stone_img_obj)
#因为金币不唯一,所以创建一个精灵族来存放所有的金币精灵
goldGroup = pygame.sprite.Group()
barriarMargin=290
def init():fps = 60running = Trueindex = 0left = 0right = 1080margin = 3myself = Myself()pygame.mixer.music.load(os.path.join('material/music', 'bgm1.mp3'))pygame.mixer.music.play(-1)km = '0'#标志位是否暂停isPause = Falsebarrier = []while running:# 获取键盘的按下事件,与抬起不同keys = pygame.key.get_pressed()for event in pygame.event.get():if event.type == pygame.QUIT:running = False#空格键作为暂停键 当空格键抬起时触发暂停动作#如果当前是运动状态,抬起空格变为暂停#如果当前是暂停状态,抬起空格变为运动elif event.type == pygame.KEYUP:if not isPause:if event.key == pygame.K_SPACE:isPause = Trueelse:if event.key == pygame.K_SPACE:isPause = False#暂停状态下,道路不会向左滑动if isPause:margin=0else:margin=3#通过提升道路的滑动效果体现出疾跑的效果if keys[pygame.K_RIGHT]:margin=8screen.blit(bg_img_obj1, (0, 0))screen.blit(road_img_obj, (left, 465))screen.blit(road_img_obj, (right, 465))#键位介绍screen.blit(keyUp_img_obj, (900, 5))screen.blit(text_surface, (980, 23))screen.blit(keyLeft_img_obj, (900, 70))screen.blit(text1_surface, (980, 88))screen.blit(keyDown_img_obj, (900, 135))screen.blit(text2_surface, (980, 148))if left<=-1080:left=left+2160if right<=-1080:right=right+2160#计划在右半边的时候加入静态的障碍,所以要在某一时刻确定要加入的对象#于是在当右半边移动到左边尽头的时候确定下来接下来的对象#这里采用随机数的方法barrier = []for i in range(0,4):random_number = random.randint(1, 15)if 10 <= random_number <= 15:gold1=Gold()gold2=Gold()gold3=Gold()gold1.loc=i*barriarMargingold2.loc=i*barriarMargin+1*70gold3.loc=i*barriarMargin+2*70goldGroup.add(gold1)goldGroup.add(gold2)goldGroup.add(gold3)barrier.append(1)elif random_number == 1:barrier.append(2)elif random_number == 2:barrier.append(3)elif random_number == 3:barrier.append(4)elif random_number == 4:barrier.append(5)elif random_number == 5:barrier.append(6)elif random_number == 6:barrier.append(7)elif random_number == 7:barrier.append(8)elif random_number == 8:barrier.append(9)elif random_number == 9:barrier.append(10)if -1080<right<1080:for sprite in goldGroup:sprite.rect.left=sprite.loc+rightgoldGroup.draw(screen)goldGroup.update(index)for i in range(len(barrier)):if barrier[i]==2:a = uplist[0]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 465)elif barrier[i]==1:continueelif barrier[i]==3:a = uplist[1]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 460)elif barrier[i]==4:a = uplist[2]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 455)elif barrier[i]==5:a = uplist[3]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 460)elif barrier[i]==6:a = downlist[0]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 330)elif barrier[i]==7:a = downlist[1]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 350)elif barrier[i]==8:a = downlist[2]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 365)elif barrier[i]==9:a = downlist[3]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 350)elif barrier[i]==10:a = downlist[4]arect = a.get_rect()arect.topleft = (right + i*barriarMargin, 210)screen.blit(a, arect)#及时从金币精灵族移除不需要的金币精灵for goldsprite in goldGroup:if goldsprite.rect.right<=0:goldGroup.remove(goldsprite)# 暂停状态下,主角也要保持静止,也就是说主角直保持一个动作,因此要传递一个参数给主角精灵# 通过按下键盘的事件更改主角的状态,因此也需传递一个参数给主角来决定状态比如奔跑、跳跃以及滑行screen.blit(myself.image, myself.rect)myself.update(index,keys,isPause)screen.blit(km_img_obj, (10, 70))km_font = pygame.font.SysFont('arial', 30)km_num_surface = km_font.render(km, True, (0, 0, 255))screen.blit(km_num_surface, (80, 88))if index%6==0:km = str(int(km) + margin)index += 1pygame.display.update()clock.tick(fps)left -= marginright -= margin
if __name__=="__main__":init()

三、实现效果

在这里插入图片描述
在这里插入图片描述

相关文章:

  • 深入浅出:LDAP 协议全面解析
  • LangChain 单智能体模式示例【纯代码】
  • IPv6 公网设置技巧
  • 初识javascript
  • Sharding-JDBC 系列专题 - 第一篇:简介与快速入门
  • Cribl 对Windows-xml log 进行 -Removing filed-06
  • DSP28335入门学习——第一节:工程项目创建
  • SpringBoot 3 与 SpringDoc 打造完美接口文档
  • Centos9 离线安装 MYSQL8
  • Spring Boot集成MongoDB及实战技巧与性能调优
  • android framework开发的技能要求
  • 哈希表实现
  • 微前端框架 Wujie
  • python3GUI--仿网课答题播放器 By:PyQt5(分享)
  • System.out 详解
  • ts与面向对象
  • trivy开源安全漏洞扫描器——筑梦之路
  • 操作系统:进程是一个非常重要的抽象概念
  • QML 样式库
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类尺寸QSizeF)
  • 嫦娥八号任务合作项目,这十个入选
  • 俄罗斯戏剧《大师与玛格丽特》来沪,剧长8小时一天内演完
  • 一夜跌去200美元,黄金巨震冲上热搜!涨势已近尾声?
  • 2025航天文化艺术论坛在上海举办
  • 最高法:学校未及时发现并制止校园暴力行为,需承担侵权责任
  • 迎世界读书日,2025年首都大学生系列读书活动发布