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

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

Python:pygame遊戲開發

[複製鏈接]

1886

主題

1886

帖子

5732

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
5732
跳轉到指定樓層
樓主
發表於 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娛樂城, 廚餘回收再利用機關廚餘回收廢鐵回收, 未上市台北招牌設計, 推薦招牌, 歐冠杯決賽, 歐冠盃, 棋牌遊戲運彩投注站台灣美食台北美容鶯歌機車借款,

GMT+8, 2024-12-4 01:17 , Processed in 0.055766 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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