台灣免費電子遊戲交流論壇

 找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 213|回復: 0
打印 上一主題 下一主題

Python:pygame遊戲開發

[複製鏈接]

1737

主題

1737

帖子

5279

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
5279
跳轉到指定樓層
樓主
發表於 2023-10-9 16:17:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
“我有一個空想,那就是有生之年做出一款属於本身的遊戲。”不晓得屏幕前的你是不是曾有和我同樣的設法,总感觉市道市情上的遊戲不彻底合适你的胃口,想要本身開辟出一款属於本身的獨占的遊戲。此時,若是你正勤學了Python,那末你的機遇来了,python也是可以做遊戲的!本篇文章将先容Python一個很是有趣又功效壮大库,它所具有的模块几近包括了2D遊戲經常使用功效的實現,讓你用Python也能開辟出一款小型的2d遊戲,它的名字就是—— pygame。

Pygame 是一個專門用来開辟遊戲的 Python 模块,重要為開辟、設計 2D 電子遊戲而生,具备免费、開源,支撑多种操作體系,具备杰出的跨平台性等长處。它供给了诸多操作模块,好比图象模块(image)、声音模块(mixer)、输入/输出(鼠標、键盘中正通馬桶,、顯示屏)模块等。简略来讲,若是你利用pygame,理論上可以開辟設計市道市情上所有的2d類型遊戲(仅仅是理論上)。

可是,現實上,我進修pygame其實不是說要用它来開辟一款完善的遊戲,pygame過分於底层,很多功效都要本身来封装實現。或许你用pygame開辟一款超等玛丽時候,他人都能學會C#用unity開辟和平精英了(浮夸)。那末既然如斯,為甚麼還要来學它?

Pygame合适小型2d遊戲開辟,好比於飞機大战、饕餮蛇、扫雷等,遊戲越大,開辟越坚苦。以是,進修pygame你可以复刻一款小時辰玩的經典遊戲,好比超等玛丽,魂斗罗之類的,然後更改一些遊戲脚色及内容,哄哄家里的弟弟mm(就是装X呗)。

更首要的一點,我但愿你可以或许經由過程進修pygame深刻理解python面向工具的思惟,python面向工具是這門說话的精华之一。把握python面向工具的思惟,也是你樂成跨過python根本的標記之一,對付你後面選擇的進修標的目的(web開辟,主動化,爬虫等等)的入門很是有帮忙。有了python面向工具的安稳根本,進修python高档的工具你會感觉也就那末回事,有一法破万法的结果。

固然,值得一提的是若是你真的對遊戲開辟感樂趣,又有python根本,那末經由過程pygame你可以開端领會關於遊戲開辟的一些根本常識,比及用pygame開辟一两個小遊戲,再来思虑一下本身适不合适遊戲開辟,究竟结果遊戲開辟的精华都是相通的,那些高档遊戲引擎只是把一些根本功效封装好了讓你用,pygame只是必要你用本身的手去打造本身的东西箱。

在讲授详细代码以前,仍是要科普一些pygame里遊戲的根本常識。

你印象中的2d遊戲由哪些成份组成?起首要有一個窗口,它劃定遊戲画面占你的屏幕的尺寸巨细,也能够設計遊戲名字,布景等等。其次就是各類場景,一個遊戲可以看作是由很多個場景构成的,好比超等玛丽的起頭菜单場景,第一關,第二關等等。場景要有内容,好比布景,主角,仇人,枪弹,物品(如超等玛丽的砖块等等)。在後面就是主角與仇人或其它工具的各類交互動作,如白色玛丽會發射枪弹,踩到仇人压扁對方等等。最後则是贯串場景的各類音效,声音等等。

本篇文章不筹算太深刻pygame,旨在增长你對python的理解,和吸引你對pygame遊戲開辟的一點點樂趣,或你以前學過pygame但健忘了,但愿本篇文章可以帮到你。若是你想要體系進修pygame,建议先看B站免费教程,然後本身經由過程官網深刻進修pygame。

空话未几說,我将經由過程本身初學時學的一個例子来讓你實現pygame的開端入門。

  1. pip install pygame
複製代碼

一向都是經由過程pycharm安装python第三方库,的确不要太爽。

甚麼是遊戲最小體系(不晓得有無這個名词)?可以理解為遊戲可以或许运行不报错的最小代码。

  1. # 导入库
  2. import pygame

  3. # 初始化操作,遊戲起頭以前,运行该代码举行初始化
  4. pygame.init()

  5. # 建立遊戲窗口,注重設置了window這個變量
  6. window = pygame.display.set_mode((600,400))

  7. # 設置遊戲題目
  8. pygame.display.set_caption('遊戲最小體系')

  9. # 给窗口設置布景色彩
  10. window.fill((255,255,255))
複製代碼

运行上面代码你會發明左上角呈現一個窗口,然後一闪即過,這是正常的。這里就要思虑python代码的运行,經由過程履行上述代码,你建立了一個玄色窗口,可是今世码履行完會產生甚麼,固然是python主動退出了。以是你要利用必定的法子不讓代码竣事运行,這就要添加“死轮回”了,這很好理解,while true 會一遍又一遍的运行内里的代码而不退出。

  1. # 连结遊戲运行状况(遊戲轮回)
  2. while True:

  3. # 检测事務產生,先把事務全数拿過来,再看產生的是哪一件事。
  4. for event in pygame.event.get():
  5. # 检测封闭按钮被點击的事務
  6. if event.type == pygame.QUIT:
  7. # 若是按下屏幕里的X号就會退出
  8. exit()
複製代碼

看到轮回内里添加的for轮回及if语句吗?它們有甚麼感化。因為轮回會一向履行,内里的代码會一遍又一遍举行检测,以是在内里便可以有不少操作了。這就是之条件到的主角與仇人或其它物品的交互部門,代码會一向检测產生了甚麼事變,并作出反响,也包含開辟遊戲常說的碰撞检测。

以是连系上面,最小體系就出来了,它只是一個黑屏,可是它是遊戲的根本框架。

  1. import pygame
  2. # 初始化操作
  3. pygame.init()

  4. # 建立遊戲窗口
  5. window = pygame.display.set_mode((600,400))

  6. # 設置遊戲題目
  7. pygame.display.set_caption('遊戲最小體系')

  8. # 設置布景色彩
  9. window.fill((255,255,255))

  10. # ========遊戲起頭页面静态结果==========

  11. # 连结遊戲运行状况(遊戲轮回)
  12. while True:
  13. # ===========遊戲帧的刷新===========
  14. # 检测事務
  15. for event in pygame.event.get():
  16. # 检测封闭按钮被點击的事務
  17. if event.type == pygame.QUIT:
  18. # 退出
  19. exit()
複製代碼


下面用一個简略的飞機大战遊戲,串一下pygame根本常識。

1.音樂,這里罗列一些經常使用函数,具體内容请到pygame官網检察。

2.精灵(spirte),pygame場景里的動态物體均可視為精灵,如主角,仇人,枪弹,可挪動布景等等,换句话說,精灵就是一些動态图片,你要對這些图片举行一些交互操作,如挪動,碰撞,爆炸等等。Pygame供给了一個處置精灵的模块,也就是sprite(pygame.sprite)模块。咱們利用该類Sprite来建立一個子類,真正到达處置精灵的目標,该子類供给了操作精灵的經常使用属性和法子,以下所示:

當遊戲中有大量的精灵時,操作它們将變得繁杂,此時經由過程构建精灵容器(group 類)也就是精灵组来同一辦理這些精灵。构建法子以下:

  1. # 建立精灵组
  2. group = pygame.sprite.Group()
  3. # 向组内添加一個精灵
  4. group.add(sprite1)
複製代碼

3.事務(键盘事務,鼠標事務)

键盘事務,這些會触及到的日程放置操作,好比遊戲批量的上下摆布,或人物中的進步、後继等操作,都必要键盘来共同履行。一個事務的關頭點,该事務可以举行持續的持續性節制。一個關頭點、组合属性等以持續性的方法供给一系列事務,一系列經常使用的属性将經由過程一系列的持續性事務举行排序。

  1. pygame.display.update()
  2. pygame.display.flip()
複製代碼

flip函数将從新绘制全部屏幕對應的窗口。update函数仅仅從新绘制窗口中有變革的區域。若是仅仅是几個物體在挪動,那末他只重绘此中挪動的部門,没有變革的部門,其實不举行重绘。update比flip速率更快。是以在一般的遊戲中,若是不是場景變革很是频仍的時辰,建议利用update函数,而不是flip函数。

pygame可用函数有不少,可是真的不難,用文字讲述很贫苦,以是我只是罗列了一些經常使用函数與法子,當你用到的時辰記得辞官網或baidu搜搜便可以了,把完备代码附鄙人面,仅供参考。

  1. # 导入两個库
  2. import pygame
  3. import random

  4. # 常量,屏幕宽高
  5. WIDTH, HEIGHT = 800, 600
  6. # 初始化操作
  7. pygame.init()
  8. pygame.mixer.init()
  9. # 建立遊戲窗口
  10. screen = pygame.display.set_mode((WIDTH, HEIGHT))

  11. # 設置遊戲題目
  12. pygame.display.set_caption('飞機大战')

  13. # 添加音樂
  14. pygame.mixer.music.load('./sound/bgLoop.wav')
  15. pygame.mixer.music.set_volume(0.5)  # 音量
  16. pygame.mixer.music.play(-1, 0)

  17. # 添加體系時钟,用於設置帧的刷新
  18. FPS = 40
  19. clock = pygame.time.Clock()

  20. # 建立用户自界說事務,每隔2000毫秒触發一次事務,随機建立仇人
  21. CREATE_ENEMY = pygame.USEREVENT
  22. # 每隔2000毫秒,會通报一個旌旗燈号
  23. pygame.time.set_timer(CREATE_ENEMY, 2000)

  24. # 對付精灵界說了主角,枪弹,仇人,爆炸,可挪動布景四個。
  25. #class Hero(pygame.sprite.Sprite)
  26. #class Bullet(pygame.sprite.Sprite)
  27. #class Enemy(pygame.sprite.Sprite)
  28. #class Explode(pygame.sprite.Sprite)
  29. #class BackGround(pygame.sprite.Sprite)
  30. # 主角
  31. class Hero(pygame.sprite.Sprite):
  32. def __init__(self, speed):
  33. super().__init__()  # 挪用父類的初始化法子
  34. self.image = pygame.image.load('./image/plane.png')
  35. self.rect = self.image.get_rect()
  36. # 對图片举行一些尺寸處置
  37. self.rect.width *= 0.5
  38. self.rect.height *= 0.5
  39. self.image = pygame.transform.scale(self.image, (self.rect.width, self.rect.height))
  40. # 主角初始化位置
  41. self.rect.x, self.rect.y = 0, 100
  42. self.speed = speed
  43. self.ready_to_fire = 0

  44. def update(self, *args):
  45. keys = pygame.key.get_pressed()
  46. if keys[pygame.K_UP]:
  47. self.rect.y -= self.speed
  48. if keys[pygame.K_DOWN]:
  49. self.rect.y += self.speed
  50. if keys[pygame.K_LEFT]:
  51. self.rect.x -= self.speed
  52. if keys[pygame.K_RIGHT]:
  53. self.rect.x += self.speed
  54. if keys[pygame.K_SPACE]:
  55. if self.ready_to_fire == 0:
  56. self.fire()
  57. self.ready_to_fire += 1
  58. if 南坎水管不通,self.ready_to_fire > 5:
  59. self.ready_to_fire = 0
  60. else:
  61. self.ready_to_fire = 0
  62. if self.rect.x < 0:
  63. self.rect.x = 0
  64. if self.rect.y < 0:
  65. self.rect.y = 0
  66. if self.rect.y > HEIGHT - self.rect.height:
  67. self.rect.y = HEIGHT - self.rect.height
  68. # 枪弹發射
  69. def fire(self):
  70. bullet = Bullet(10)
  71. bullet.rect.x = self.rect.right
  72. bullet.rect.centery = self.rect.centery
  73. bullet_sprite.add(bullet)
  74. # 音效
  75. sound = pygame.mixer.Sound('./sound/laser.wav')
  76. sound.play()

  77. class Bullet(pygame.sprite.Sprite):
  78. def __init__(self, speed):
  79. super().__init__()
  80. self.image = pygame.image.load('./image/bullet.png')
  81. self.rect = self.image.get_rect()
  82. self.speed = speed

  83. def update(self, *args):
  84. self.rect.x += self.speed
  85. if self.rect.x > WIDTH:
  86. self.kill()

  87. class Enemy(pygame.sprite.Sprite):
  88. def __init__(self, speed):
  89. super().__init__()
  90. self.image = pygame.image.load('./image/enemy1.png')
  91. self.rect = self.image.get_rect()
  92. self.rect.x = 800
  93. self.rect.y = random.randint(0, HEIGHT)
  94. self.speed = speed

  95. def update(self, *args):
  96. self.rect.x -= self.speed
  97. if self.rect.right < 0:
  98. self.kill()

  99. class Explode(pygame.sprite.Sprite):
  100. def __init__(self):
  101. super().__init__()
  102. self.images = [pygame.image.load('./image/explode' + str(i) + '.png') for i in range(1, 4)]
  103. self.image_index = 0
  104. self.image = self.images[self.image_index]
  105. self.rect = self.image.get_rect()
  106. self.readt_to_change = 0
  107. sound = pygame.mixer.Sound('./sound/enemyExplode.wav')
  108. sound.play()

  109. def update(self, *args):
  110. if self.image_index < 2:
  111. self.readt_to_change += 1
  112. if self.readt_to_change % 4 == 0:
  113. self.image_index += 1
  114. self.image = self.images[self.image_index]
  115. else:
  116. self.kill()

  117. class BackGround(pygame.sprite.Sprite):
  118. def __init__(self):
  119. super().__init__()
  120. self.image = pygame.image.load('./image/background.jpg')
  121. self.rect = self.image.get_rect()
  122. self.ready_to_move = 0

  123. def update(self, *args):
  124. self.rect.x -= 3
  125. if self.rect.right <= 0:
  126. self.rect.x = self.rect.width

  127. # 初始化精灵组
  128. bg_sprite = pygame.sprite.Group()
  129. hero_sprite = pygame.sprite.Group()
  130. enemy_sprite = pygame.sprite.Group()
  131. bullet_sprite = pygame.sprite.Group()
  132. explode_sprite = pygame.sprite.Group()

  133. # 界說人物

  134. hero1 = Hero(4)
  135. hero_sprite.add(hero1)

  136. enemy1 = Enemy(5)
  137. enemy2 = Enemy(7)

  138. bg1 = BackGround()
  139. bg2 = BackGround()
  140. bg2.rect.x = bg2.rect.width
  141. bg_sprite.add(bg1, bg2)

  142. # 连结遊戲运行状况(遊戲轮回)
  143. while True:
  144. # ===========遊戲帧的刷新===========
  145. clock.tick(FPS)

  146. # 检测事務
  147. for event in pygame.event.get():
  148. 外約茶妹,    # 检测封闭按钮被點击的事務
  149. if event.type == py台北借錢, game.QUIT:
  150. # 退出
  151. pygame.quit()
  152. exit()
  153. if event.type == CREATE_ENEMY:
  154. enemy_sprite.add(Enemy(random.randint(1, 7)))

  155. # 碰撞检测,返回字典,获得两者信息
  156. collision = pygame.sprite.groupcollide(enemy_sprite, bullet_sprite, True, True)
  157. for enemy in collision.keys():
  158. explode = Explode()
  159. explode.rect = enemy.rect
  160. explode_sprite.add(explode)

  161. # screen.fill((0,0,0))
  162. for group in [bg_sprite, hero_sprite, enemy_sprite, bullet_sprite, explode_sprite]:
  163. group.update()
  164. group.draw(screen)
  165. pygame.display.update()
複製代碼

寫了不少,可是很水,我本身都不想讀下去,给本身找的来由是,它就像字典同樣,用到的時辰查查就好了。重點不是這個,重點是理解此中面向工具的用法,若是看不懂源码,還请不要贪玩,打好根本再進修,由於這一個飞機大战源码算是最简略(也最粗拙)的源码了。

若是你已看過一些pygame相干教程,必要一些源码练手,我将鄙人一篇收拾几個常见的小遊戲源码,供你進修参考。

想要获得飞機大战源码及素材的童鞋请存眷微信定阅号“Python编程札記”,後台复兴“005”另有更多有趣内容等着你!
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|台灣免費電子遊戲交流論壇  

台灣運彩官網手機a片 hello av girl運彩好朋友日本職棒比分, 法網直播線上直播王運動歐冠, 中華職棒即時比分, ptt網頁版, 中華職棒ptt, 日本職棒比分, 最新娛樂城, 真人百家樂, 3A娛樂城, 沙發修理廚餘回收再利用機關廚餘回收廢鐵回收, 未上市台北招牌設計, 推薦招牌, 歐冠杯下注運彩場中, 九州娛樂app, 歐冠盃投注, 歐冠盃決賽, 歐冠盃下注, 線上娛樂城台灣運動彩券首頁運動彩場中投注場中投注時間表台灣運彩足球賠率百家樂, 歐冠杯決賽, 歐冠盃, 棋牌遊戲運彩投注站台灣美食台北美容鶯歌機車借款, 蘆洲汽車借款, 真人百家樂現金版現金板

GMT+8, 2024-6-27 00:51 , Processed in 0.059736 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表