问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请问使用Python (Pygame)在mac上写小的游戏,调用pygame.sprite.group...

发布网友 发布时间:2022-05-07 20:15

我来回答

4个回答

懂视网 时间:2022-04-18 10:50

不得不承认《Python游戏编程入门》这本书翻译、排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里。

先是素材:

背景

精灵

所有素材均取自此书

接下来就是精灵类的创建了:

 (self)
 self.master_image === -1= 1= 1=== 1============rect == (rect.width // width) * (rect.height // height) - 1 update(self, current_time, rate=30 current_time > self.last_time ++= 1 self.frame >== self.frame !== (self.frame % self.columns) *= (self.frame // self.columns) *=== self.frame

将精灵类“放置”到游戏屏幕上,并加上背景

pygame.init()
screen = pygame.display.set_mode((800, 600))
font = pygame.font.Font(None, 24)
framerate = pygame.time.Clock()

bg = pygame.image.load("background.png").convert_alpha()
pl = pygame.image.load('caveman.png').convert_alpha()# 创建精灵组group = pygame.sprite.Group()


player = MySprite(screen)
player.load("caveman.png", 50, 64, 8)
player.first_frame = 1player.last_frame = 7player.position = 400, 303group.add(player)while True:for event in pygame.event.get():if event.type == QUIT:
  sys.exit()# 设置帧数framerate.tick(30)
 ticks = pygame.time.get_ticks()

这样的话精灵就在画布上了,我们得让它能左右移动:

keys = pygame.key.get_pressed()if keys[K_ESCAPE]:
 sys.exit()if keys[K_RIGHT]:
 player.X += 8if keys[K_LEFT]:if player.X > 0:
  player.X -= 8

然后实现跳跃及二段跳跃

这里需要说下二段跳跃的注意点:

1.直到落地前,只能跳两次,也就是说精灵进行二次跳跃后不能再跳了

2.按下空格后,精灵的加速度重置

,这需要修改前面的代码:

jump_vel = 0.0# 设置一个记录跳跃次数的变量space_number = 0# 跳跃判断player_jumping = False
player_start_y = player.Ywhile True:for event in pygame.event.get():if event.type == QUIT:
  sys.exit()if event.type == KEYDOWN:if event.key == K_SPACE:# 跳跃次数小于2次时,if space_number < 2:
   jump_vel = -15.0space_number += 1player_jumping = True

 keys = pygame.key.get_pressed()if keys[K_ESCAPE]:
 sys.exit()if keys[K_RIGHT]:
 player.X += 8if keys[K_LEFT]:if player.X > 0:
  player.X -= 8# 设置帧数framerate.tick(30)
 ticks = pygame.time.get_ticks()# 当按下空格后,jump_vel变量不断变大,直到接触地面if player_jumping:
 player.Y += jump_vel
 jump_vel += 2# 落地后,重置跳跃速度和其他判断变量if player.Y >= player_start_y:
  player_jumping = False
  player.Y = player_start_y
  jump_vel = 0
  space_number = 0# 创建背景 screen.blit(bg, (0, 0))# 精灵组更新group.update(ticks, 50)
 group.draw(screen)

 pygame.display.update()

所有代码:

import sys, time, random, math, pygamefrom pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, target):
 pygame.sprite.Sprite.__init__(self)
 self.master_image = None
 self.frame = 0
 self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0
 self.last_frame = 0
 self.columns = 1self.last_time = 0#   使用property方法,让精灵类对坐标操作更方便def _getx(self):return self.rect.xdef _setx(self, value):
 self.rect.x = value

 X = property(_getx, _setx)def _gety(self):return self.rect.ydef _sety(self, value):
 self.rect.y = value

 Y = property(_gety, _sety)def _getpos(self):return self.rect.topleftdef _setpos(self, pos):
 self.rect.topleft = pos

 position = property(_getpos, _setpos)def load(self, filename, width, height, columns):
 self.master_image = pygame.image.load(filename).convert_alpha()
 self.frame_width = width
 self.frame_height = height
 self.rect = Rect(0, 0, width, height)
 self.columns = columns
 rect = self.master_image.get_rect()
 self.last_frame = (rect.width // width) * (rect.height // height) - 1def update(self, current_time, rate=30):#   更新帧数if current_time > self.last_time + rate:
  self.frame += 1if self.frame > self.last_frame:
  self.frame = self.first_frame
  self.last_time = current_time# 当帧数发生改变时,创建新的图片if self.frame != self.old_frame:
  frame_x = (self.frame % self.columns) * self.frame_width
  frame_y = (self.frame // self.columns) * self.frame_height
  rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)
  self.image = self.master_image.subsurface(rect)
  self.old_frame = self.frame

pygame.init()
screen = pygame.display.set_mode((800, 600))
font = pygame.font.Font(None, 24)
framerate = pygame.time.Clock()

bg = pygame.image.load("background.png").convert_alpha()
pl = pygame.image.load('caveman.png').convert_alpha()# 创建精灵组group = pygame.sprite.Group()


player = MySprite(screen)
player.load("caveman.png", 50, 64, 8)
player.first_frame = 1player.last_frame = 7player.position = 400, 303group.add(player)


jump_vel = 0.0# 设置一个记录跳跃次数的变量space_number = 0# 跳跃判断player_jumping = False
player_start_y = player.Ywhile True:for event in pygame.event.get():if event.type == QUIT:
  sys.exit()if event.type == KEYDOWN:if event.key == K_SPACE:# 跳跃次数小于2次时,if space_number < 2:
   jump_vel = -15.0space_number += 1player_jumping = True

 keys = pygame.key.get_pressed()if keys[K_ESCAPE]:
 sys.exit()if keys[K_RIGHT]:
 player.X += 8if keys[K_LEFT]:if player.X > 0:
  player.X -= 8# 设置帧数framerate.tick(30)
 ticks = pygame.time.get_ticks()# 当按下空格后,jump_vel变量不断变大,直到接触地面if player_jumping:
 player.Y += jump_vel
 jump_vel += 2# 落地后if player.Y >= player_start_y:
  player_jumping = False
  player.Y = player_start_y
  jump_vel = 0
  space_number = 0
  rush_number = 0# 创建背景 screen.blit(bg, (0, 0))# 精灵组更新group.update(ticks, 50)
 group.draw(screen)

 pygame.display.update()

这样,一个粗糙的、会二段跳的精灵就完成了。

很感谢这本书提供单次跳跃的思路,让我有思考二段跳的想法。其实像二段跳这类看上去容易,但实现其实还是需要思考一番的。

热心网友 时间:2022-04-18 07:58

一次移动是"跳过"移动速度这么多的像素,而不过逐个像素的移动
方法groupcollide()是检测两个精灵组中精灵们的矩形冲突
速度过快导致精灵单次移动就直接跨越了另一个精灵,就不存在两个精灵矩形的冲突,就不会检测到
就像走路的时候跨过了一坨泥一样
这么说能明白吗?

热心网友 时间:2022-04-18 09:16

也不算低端。看你怎么做。。
图片关键是素材,绘画。你行么?
如果游戏的中心是一个逻辑,比如战斗类型的,牵扯到拓扑人物,以及人物数据,环境数据。
然后就是其中的算法
游戏还得有个故事。当然主要看你的目的。
其次还有些配音。文字。之类的。
理论上pygame不能做rpg这种货色,如果对画质要求高的 话。
黑白棋五子棋。这也是游戏啊。主要是逻辑。和规则。
不懂你要做啥游戏。。。

热心网友 时间:2022-04-18 10:51

突然想起 量子 哈哈哈哈
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 如何利用python做一个输入自己姓名和出生年月日来判断自己的前世的游... 淘宝上卖游戏点卡的都是怎么赚钱的? 掌心宝贝校园教师安装监控给园长带来了多大的帮助 《神奇宝贝之校园生活录》txt下载在线阅读全文,求百度网盘云资源 掌心宝贝校园在线监控给孩子安全带来多大保障? 掌心宝贝校园在线监控对硬件的要求高吧 怎么使用掌心宝贝app 打开孩子在学校的视频 掌心宝贝最主要的作用是什么 小说《星辰变》里面的逍遥天尊和侯费是关系? 遮天小说中的生命禁区中有哪些至尊 宦倾天下电子书txt全集下载 遮天,里的九秘是哪九种,分别有什么用处。 洪荒逍遥傲世录_by逍遥天尊_txt全文阅读,百度网盘免费下载 异界逍遥天尊的阶位是什么? 给个异界逍遥天尊txt下载的链接 修罗神王受谁所托收费费为徒 星辰变圣皇和天尊谁更厉害 MySql数据库逻辑类型是什么? 电钟和电子表有怎样的发展过程? 最早的电子手表是怎样诞生的? 谁有半条命(Half 黑道圣徒2怎么用手机输入作弊密码? 黑道圣徒2载具储存库在哪里? 高一学C语言好还是学RPG maker好? 罪恶都市里100个隐藏包裹是什么东东啊? 眼睑浮肿是怎么回事?如何检查诊断及中西医治疗 眼睑浮肿的介绍 ...要实现用手机账号注册功能并且要发送实时验证码,短信包的接口有了... 经常眼睑会出现肿的问题 连续几天早上起来眼睑浮肿怎么回事? vivoy28如何强制启用4xmsaa vivo Y67如何打开允许模拟位置 VIVOy67开发者怎么打开? vivoy67怎么开飞行模式 招商银行的YOUNG(青年版)信用卡在手机客户端可以申请吗?一般多少信用度? 对方连接我的手环,能检测到对方手机号吗? 我的手环连接不上手机怎么办?一直显示连接APP重新升级 行车记录仪光明星X7S怎么样 小微金融服务智慧平台能查询到哪些信息 anznx行车记录仪使用说明- 问一问