【Pygame实战】只有一个币,投《勇者大冒险》还是《街霸》?(经典复刻,谁的青春回来了?)
導語
不知道大家有沒有這樣的經歷,在學校電腦課上打開一個叫做4399的神秘網站,然后精心挑選
一款小游戲在老師講課時默默玩耍。
這種驚心動魄的感覺像極了偷情(滑稽.jpg),而《黃金礦工》、《暴打小朋友》、《森林冰
火人》、《閃翼拳皇》等等小游戲就是我在電腦課上的情人,其中一款叫做《合金彈頭》的游
戲讓我印象尤為深刻。?
所有文章完整的素材+源碼都在👇👇
粉絲白嫖源碼福利,請移步至CSDN社區或文末公眾hao即可免費。
它最讓我感到興奮的是可以切換各種槍械,那種隨著戰斗的進行鳥槍換炮的成就感是無與倫比
的,也是這款游戲讓我第一次感受到了突突突的快感。
最近跟著這款游戲仿造了一款《勇者大冒險》游戲,這是一款橫版射擊游戲,一上手后我就感
受到了當初玩合金彈頭的味道,小編的青春回來了。好啦,話不多說了哈,我們正式開干叭👇
正文
一、運行環境
小編使用的環境:Python3、Pycharm社區版、Pygame模塊。內置模塊 你安裝 好python環
境就可以了。
模塊安裝:pip install -i https://pypi.douban.com/simple/ +pygame二、素材(圖片等)
這款《勇者大冒險》大型游戲有超多的圖片素材的下面只是小部分截圖太大了。
當然要有音樂的啦👇
?三、代碼展示
1)boss主程序py
# coding: utf-8import pygame import sys from random import randint from pygame.sprite import Sprite from pygame.sprite import Group from bullet import *# 控制怪物動畫的速度MAN_PAO_SPEED_THRESHOLD = 5# 定義代表怪物類型的常量(如果程序還需要增加更多怪物,只需在此處添加常量即可) TYPE_BOSS = 2class Boss(Sprite):boss_produce = Truedef __init__ (self, view_manager):super().__init__()# 定義子彈爆炸時的幀數self.bullet_number=0# 定義boss未被加載初始未true# boss血量self.hp=20# 定義怪物X、Y坐標的屬性self.x = 0self.y = 0# 定義怪物是否已經死亡的旗標self.is_die = False# 繪制怪物圖片的左上角的X坐標self.start_x = 0# 繪制怪物圖片的左上角的Y坐標self.start_y = 0# 繪制怪物圖片的右下角的X坐標self.end_x = 0# 繪制怪物圖片的右下角的Y坐標self.end_y = 0# 該變量控制用于控制動畫刷新的速度self.draw_count = 0# 定義當前正在繪制怪物動畫的第幾幀的變量self.draw_index = 0# 用于記錄死亡動畫只繪制一次,不需要重復繪制# 每當怪物死亡時,該變量會被初始化為等于死亡動畫的總幀數# 當怪物的死亡動畫幀播放完成時,該變量的值變為0。self.die_max_draw_count = sys.maxsize# 定義怪物射出的子彈self.bullet_list = Group()# 定義Boss速度的初始值self.SPEED=5# -------下面代碼初始化BOSS X、Y坐標------self.y = 0self.x = view_manager.screen_width/2# 畫怪物的方法def draw(self, screen, view_manager,player):self.draw_anim(screen, view_manager, view_manager.boss_imagesif not self.is_die else view_manager.boss_die_images,player)# 根據怪物的動畫幀圖片來繪制怪物動畫def draw_anim(self, screen, view_manager, bitmap_arr,player):# 如果怪物已經死,且沒有播放過死亡動畫#(self.die_max_draw_count等于初始值表明未播放過死亡動畫)if self.is_die and self.die_max_draw_count == sys.maxsize:# 將die_max_draw_count設置與死亡動畫的總幀數相等self.die_max_draw_count = len(bitmap_arr) # ⑤self.draw_index %= len(bitmap_arr)# 獲取當前繪制的動畫幀對應的位圖bitmap = bitmap_arr[self.draw_index] # ①if bitmap == None:return# 對繪制怪物動畫幀位圖的X坐標進行微調self.x -=self.SPEED# 如果到達屏幕邊界則反方向行進if self.x <=-376 or self.x >= view_manager.screen_width+120:self.SPEED = -self.SPEED# 對繪制怪物動畫幀位圖的Y坐標進行微調draw_y = self.y# 畫怪物動畫幀的位圖if self.SPEED>0:bitmap=pygame.transform.flip(bitmap,True,False)screen.blit(bitmap, (self.x, draw_y))self.start_x = self.xself.start_y = draw_yself.end_x = self.start_x + bitmap.get_width()self.end_y = self.start_y + bitmap.get_height()self.draw_count += 1# 控制人、飛機的發射子彈的速度if self.draw_count >= TYPE_BOSS: # ③# boss只在最后一幀才發射子彈if self.draw_index == len(bitmap_arr)-1 and self.x%40==0:self.add_bullet()self.draw_index += 1 # ②self.draw_count = 0 # ④# 每播放死亡動畫的一幀,self.die_max_draw_count減1。# 當self.die_max_draw_count等于0時,表明死亡動畫播放完成。if self.is_die:self.die_max_draw_count -= 1 # ⑥# 如果boss死亡 加載win的畫面if self.die_max_draw_count<=0:screen.blit(view_manager.win[0], (0, 0))pygame.display.flip()while True:for event in pygame.event.get():if event==pygame.QUIT:pygame.quit()sys.exit()# 繪制子彈self.draw_bullets(screen, view_manager,player)# 判斷怪物是否被子彈打中的方法def is_hurt(self, x, y): return self.start_x < x < self.end_x and self.start_y < y < self.end_y# 此boos對應的子彈是6def bullet_type(self):return 6# 定義發射子彈的方法def add_bullet(self):# 如果沒有子彈if self.bullet_type() <= 0:return# 計算子彈的X、Y坐標draw_x = self.x+30draw_y = self.y+120# 創建子彈對象,由于這個boos是從上往下發射子彈所以不需要翻轉圖片這里pdir參數給以個3讓他不執行翻轉# 讓飛機只有從左往右飛時發射導彈if self.SPEED<0:bullet = Bullet(self.bullet_type(), draw_x, draw_y, 3)# 將子彈添加到該怪物發射的子彈Group中self.bullet_list.add(bullet)# 更新所有子彈的位置:將所有子彈的X坐標減少shift距離(子彈左移)def update_shift(self, shift):self.y-=shiftfor bullet in self.bullet_list:if bullet != None:bullet.y = self.y# 繪制子彈的方法def draw_bullets(self, screen, view_manager,player) :# 遍歷該怪物發射的所有子彈for bullet in self.bullet_list.copy():# 如果子彈已經越過屏幕if bullet.boss_bang:# 刪除已經移出屏幕的子彈self.bullet_list.remove(bullet)# 繪制所有子彈for bullet in self.bullet_list.sprites():if bullet.y<= view_manager.screen_height-250:# 獲取子彈對應的位圖bitmap = bullet.bitmap(view_manager)# 繪制子彈的位圖screen.blit(bitmap, (bullet.x, bullet.y))bullet.move(True)# 子彈移動if bitmap == None:continueelif len(self.bullet_list.sprites())>1:self.bullet_number+=1if self.bullet_number%5==0 and bullet.bullet_bang>0:bullet.bullet_bang-=1self.check_bullet(player)bitmap = view_manager.boss_die_images[bullet.bullet_bang]if bullet.bullet_bang==0:bullet.boss_bang=True# 繪制子彈的位圖screen.blit(bitmap, (bullet.x, bullet.y))# 判斷子彈是否與玩家控制的角色碰撞(判斷子彈是否打中角色)def check_bullet(self, player):# 遍歷所有子彈for bullet in self.bullet_list.copy():if bullet == None or not bullet.is_effect:continue# 如果玩家控制的角色被子彈打到if player.is_hurt(bullet.x-20, bullet.x+120, bullet.y, bullet.y+80):# 子彈設為無效bullet.isEffect = Falseplayer.hp = player.hp - 15# 刪除已經擊中玩家控制的角色的子彈self.bullet_list.remove(bullet)2)玩家設置
# coding: utf-8 import pygame import sys from random import randint from pygame.sprite import Sprite from pygame.sprite import Group import pygame.fontfrom bullet import * import monster_manager as mm# 定義角色的最高生命值 MAX_HP = 9999999999999999999 # 定義控制角色動作的常量 # 此處只控制該角色包含站立、跑、跳等動作 ACTION_STAND_RIGHT = 1 ACTION_STAND_LEFT = 2 ACTION_RUN_RIGHT = 3 ACTION_RUN_LEFT = 4 ACTION_JUMP_RIGHT = 5 ACTION_JUMP_LEFT = 6 # 定義角色向右移動的常量 DIR_RIGHT = 1 # 定義角色向左移動的常量 DIR_LEFT = 2# 定義控制角色移動的常量 # 此處控制該角色只包含站立、向右移動、向左移動三種移動方式 MOVE_STAND = 0 MOVE_RIGHT = 1 MOVE_LEFT = 2 MAX_LEFT_SHOOT_TIME = 6class Player(Sprite):def __init__(self, view_manager, name, hp):super().__init__()self.boos_time_updata_y = Falseself.bullet_clear = 0# Boos時間時地圖不在跟隨移動角色可以自由移動,規定x軸,y軸坐標self.boss_time_move_x=0self.boss_time_move_y=0# BOSS時間self.pesses_boss_time=False# BOSS時間self.name = name # 保存角色名字的成員變量self.hp = hp # 保存角色生命值的成員變量self.view_manager = view_manager# 保存角色所使用槍的類型(以后可考慮讓角色能更換不同的槍)self.gun = 0# 保存角色當前動作的成員變量(默認向右站立)self.action = ACTION_STAND_RIGHT# 代表角色X坐標的屬性self._x = -1# 代表角色Y坐標的屬性self.y = -1# 保存角色射出的所有子彈self.bullet_list = Group()# 保存角色移動方式的成員變量self.move = MOVE_STAND# 控制射擊狀態的保留計數器# 每當用戶發射一槍時,left_shoot_time會被設為MAX_LEFT_SHOOT_TIME,然后遞減# 只有當left_shoot_time變為0時,用戶才能發射下一槍self.left_shoot_time = 0# 保存角色是否跳動的屬性self._is_jump = False# 保存角色是否跳到最高處的成員變量self.is_jump_max = False# 控制跳到最高處的停留時間self.jump_stop_count = 0# 當前正在繪制角色腳部動畫的第幾幀self.index_leg = 0# 當前正在繪制角色頭部動畫的第幾幀self.index_head = 0# 當前繪制頭部圖片的X坐標self.current_head_draw_x = 0# 當前繪制頭部圖片的Y坐標self.current_head_draw_y = 0# 當前正在畫的腳部動畫幀的圖片self.current_leg_bitmap = None# 當前正在畫的頭部動畫幀的圖片self.current_head_bitmap = None# 該變量控制用于控制動畫刷新的速度self.draw_count = 0# 加載中文字體self.font = pygame.font.Font('images/msyh.ttf', 20)# 計算該角色當前方向:action成員變量為奇數代表向右def get_dir(self):return DIR_RIGHT if self.action % 2 == 1 else DIR_LEFTdef get_x(self):return self._xdef set_x(self, x_val):self._x = x_val % (self.view_manager.map.get_width() +self.view_manager.X_DEFAULT)# 如果角色移動到屏幕最左邊if self._x < self.view_manager.X_DEFAULT:self._x = self.view_manager.X_DEFAULTx = property(get_x, set_x)def get_is_jump(self):return self._is_jumpdef set_is_jump(self, jump_val):self._is_jump = jump_valself.jump_stop_count = 6is_jump = property(get_is_jump, set_is_jump)# 返回該角色在游戲界面上的位移def shift(self):if self.x <= 0 or self.y <= 0:self.init_position()return self.view_manager.X_DEFAULT - self.x# 判斷角色是否已經死亡def is_die(self):return self.hp <= 0# 初始化角色的初始化位置,角色能跳的最大高度def init_position(self):self.x = self.view_manager.screen_width * 15 / 100self.y = self.view_manager.screen_height * 75 / 100# 畫角色的方法def draw(self, screen):if not self.pesses_boss_time:# 繪制角色向右站立的動畫圖片if self.action == ACTION_STAND_RIGHT:self.draw_anim(screen, self.view_manager.leg_stand_images,self.view_manager.head_stand_images, DIR_RIGHT)# 繪制角色向左站立的動畫圖片elif self.action == ACTION_STAND_LEFT:self.draw_anim(screen, self.view_manager.leg_stand_images,self.view_manager.head_stand_images, DIR_LEFT)# 繪制角色向右跑動的動畫圖片elif self.action == ACTION_RUN_RIGHT:self.draw_anim(screen, self.view_manager.leg_run_images,self.view_manager.head_run_images, DIR_RIGHT)# 繪制角色向左跑動的動畫圖片elif self.action == ACTION_RUN_LEFT:self.draw_anim(screen, self.view_manager.leg_run_images,self.view_manager.head_run_images, DIR_LEFT)# 繪制角色向右跳動的動畫圖片elif self.action == ACTION_JUMP_RIGHT:self.draw_anim(screen, self.view_manager.leg_jump_images,self.view_manager.head_jump_images, DIR_RIGHT)# 繪制角色向左跳動的動畫圖片elif self.action == ACTION_JUMP_LEFT:self.draw_anim(screen, self.view_manager.leg_jump_images,self.view_manager.head_jump_images, DIR_LEFT)else:# 繪制角色向右站立的動畫圖片if self.action == ACTION_STAND_RIGHT:self.draw_anim(screen, self.view_manager.leg_stand_images,self.view_manager.look_up_images, DIR_RIGHT)# 繪制角色向左站立的動畫圖片elif self.action == ACTION_STAND_LEFT:self.draw_anim(screen, self.view_manager.leg_stand_images,self.view_manager.look_up_images, DIR_LEFT)# 繪制角色向右跑動的動畫圖片elif self.action == ACTION_RUN_RIGHT:self.draw_anim(screen, self.view_manager.leg_run_images,self.view_manager.look_up_images, DIR_RIGHT)# 繪制角色向左跑動的動畫圖片elif self.action == ACTION_RUN_LEFT:self.draw_anim(screen, self.view_manager.leg_run_images,self.view_manager.look_up_images, DIR_LEFT)# 繪制角色向右跳動的動畫圖片elif self.action == ACTION_JUMP_RIGHT:self.draw_anim(screen, self.view_manager.leg_jump_images,self.view_manager.look_up_images, DIR_RIGHT)# 繪制角色向左跳動的動畫圖片elif self.action == ACTION_JUMP_LEFT:self.draw_anim(screen, self.view_manager.leg_jump_images,self.view_manager.look_up_images, DIR_LEFT)# 繪制角色的動畫幀def draw_anim(self, screen, leg_arr, head_arr_from, pdir):head_arr = head_arr_fromif not self.pesses_boss_time:# 射擊狀態停留次數每次減1if self.left_shoot_time > 0 :head_arr = self.view_manager.head_shoot_imagesself.left_shoot_time -= 1else:head_arr = self.view_manager.head_stand_imagesself.left_shoot_time -= 1else:# 射擊狀態停留次數每次減1if self.left_shoot_time > 0:head_arr = self.view_manager.look_up_shoot_imagesself.left_shoot_time -= 1else:head_arr = self.view_manager.look_up_imagesself.left_shoot_time -= 1self.index_leg %= len(leg_arr)self.index_head %= len(head_arr)# 先畫腳bitmap = leg_arr[self.index_leg]draw_x = self.view_manager.X_DEFAULTdraw_y = self.y - bitmap.get_height()if self.pesses_boss_time:draw_x=self.boss_time_move_x# draw_y=self.y# 根據角色方向判斷是否需要翻轉圖片if pdir == DIR_RIGHT:# 對圖片執行鏡像(第二個參數控制水平鏡像,第三個參數控制垂直鏡像)bitmap_mirror = pygame.transform.flip(bitmap, True, False)screen.blit(bitmap_mirror, (draw_x, draw_y))else:screen.blit(bitmap, (draw_x, draw_y)) self.current_leg_bitmap = bitmap# 再畫頭bitmap2 = head_arr[self.index_head]draw_x -= (bitmap2.get_width() - bitmap.get_width() >> 1)if self.action == ACTION_STAND_LEFT:draw_x += 6draw_y = draw_y - bitmap2.get_height() + 10# 根據角色方向判斷是否需要翻轉圖片if self.get_dir() == DIR_RIGHT:# 對圖片執行鏡像(第二個參數控制水平鏡像,第三個參數控制垂直鏡像)bitmap2_mirror = pygame.transform.flip(bitmap2, True, False)screen.blit(bitmap2_mirror, (draw_x, draw_y))else:screen.blit(bitmap2, (draw_x, draw_y)) self.current_head_draw_x = draw_xself.current_head_draw_y = draw_yself.current_head_bitmap = bitmap2# self.draw_count控制該方法每調用4次才會切換到下一幀位圖self.draw_count += 1if self.draw_count >= 4:self.draw_count = 0self.index_leg += 1self.index_head += 1# 畫子彈self.draw_bullet(screen)# 畫左上角的角色、名字、血量self.draw_head(screen)# 繪制左上角的角色、名字、生命值的方法def draw_head(self, screen):if self.view_manager.head == None:return# 對圖片執行鏡像(第二個參數控制水平鏡像,第三個參數控制垂直鏡像)head_mirror = pygame.transform.flip(self.view_manager.head, True, False)# 畫頭像screen.blit(head_mirror, (0, 0))# 將名字渲染成圖像name_image = self.font.render(self.name, True, (230, 23, 23))# 畫名字screen.blit(name_image, (self.view_manager.head.get_width(), 10))# 將生命值渲染成圖像hp_image = self.font.render("HP:" + str(self.hp), True, (230, 23, 23))# 畫生命值screen.blit(hp_image, (self.view_manager.head.get_width(), 30))# 判斷該角色是否被子彈打中的方法def is_hurt(self, start_x, end_x, start_y, end_y):if self.current_head_bitmap == None or self.current_leg_bitmap == None:return False# 計算角色的圖片所覆蓋的矩形區域player_start_x = self.current_head_draw_xplayer_end_x = player_start_x + self.current_head_bitmap.get_width()player_start_y = self.current_head_draw_yplayer_end_y = player_start_y + self.current_head_bitmap.get_height() + \self.current_leg_bitmap.get_height()# 如果子彈出現的位置與角色圖片覆蓋的矩形區域有重疊,即可判斷角色被子彈打中return (player_start_x < start_x < player_end_x \or player_start_x < end_x < player_end_x) \and (player_start_y < start_y < player_end_y \or player_start_y < end_y < player_end_y)# 發射子彈的方法def add_bullet(self, view_manager):if not self.pesses_boss_time:# 計算子彈的初始X坐標bullet_x = self.view_manager.X_DEFAULT + 50 if self.get_dir() \== DIR_RIGHT else self.view_manager.X_DEFAULT - 50else:bullet_x = self.boss_time_move_xif not self.pesses_boss_time:# 創建子彈對象bullet = Bullet(BULLET_TYPE_1, bullet_x, self.y - 60, self.get_dir())else:# 創建子彈對象bullet = Bullet(7, bullet_x+20, self.y-100, self.get_dir())# 將子彈添加到用戶發射的子彈Group中self.bullet_list.add(bullet)# 發射子彈時,將self.left_shoot_time設置為射擊狀態最大值self.left_shoot_time = MAX_LEFT_SHOOT_TIME# 播放射擊音效view_manager.sound_effect[0].play()# 畫子彈def draw_bullet(self, screen):delete_list = []if self.pesses_boss_time:if self.bullet_clear < 2:self.bullet_clear += 1# 遍歷角色發射的所有子彈for bullet in self.bullet_list.sprites():# 將所有越界的子彈收集到delete_list列表中if bullet.x < 0 or bullet.x > self.view_manager.screen_width:delete_list.append(bullet)if self.bullet_clear == 1:print(self.bullet_clear)self.bullet_list.remove(bullet)# 清除所有越界的子彈self.bullet_list.remove(delete_list)# 遍歷用戶發射的所有子彈for bullet in self.bullet_list.sprites():# 獲取子彈對應的位圖bitmap = bullet.bitmap(self.view_manager)# 子彈移動bullet.move(self.pesses_boss_time)# 畫子彈,根據子彈方向判斷是否需要翻轉圖片if bullet.dir == DIR_LEFT and not self.pesses_boss_time:# 對圖片執行鏡像(第二個參數控制水平鏡像,第三個參數控制垂直鏡像)bitmap_mirror = pygame.transform.flip(bitmap, True, False)screen.blit(bitmap_mirror, (bullet.x, bullet.y))else:screen.blit(bitmap, (bullet.x, bullet.y))# 處理角色移動的方法def move_position(self, screen):# 如果不是boss時間讓怪物移動怪物if not self.pesses_boss_time:if self.move == MOVE_RIGHT:# 更新怪物的位置mm.update_posistion(screen, self.view_manager, self, 6)# 更新角色位置self._x += 6if not self.is_jump:# 不跳的時候,需要設置動作self.action = ACTION_RUN_RIGHTelif self.move == MOVE_LEFT:if self.x - 6 < self.view_manager.X_DEFAULT:# 更新怪物的位置mm.update_posistion(screen, self.view_manager, self, \-(self.x - self.view_manager.X_DEFAULT))else:# 更新怪物的位置mm.update_posistion(screen, self.view_manager, self, -6)# 更新角色位置self.x -= 6if not self.is_jump:# 不跳的時候,需要設置動作self.action = ACTION_RUN_LEFTelif self.action != ACTION_JUMP_RIGHT and self.action != ACTION_JUMP_LEFT:if not self.is_jump:# 不跳的時候,需要設置動作self.action = ACTION_STAND_RIGHT# 否則玩家動else:if self.move == MOVE_RIGHT:# # 更新角色位置self.boss_time_move_x+=6if not self.is_jump:# 不跳的時候,需要設置動作self.action = ACTION_RUN_RIGHTelif self.move == MOVE_LEFT:# 更新角色位置self.boss_time_move_x -= 6if not self.is_jump:# 不跳的時候,需要設置動作self.action = ACTION_RUN_LEFTelif self.action != ACTION_JUMP_RIGHT and self.action != ACTION_JUMP_LEFT:if not self.is_jump:# 不跳的時候,需要設置動作self.action = ACTION_STAND_RIGHT# 處理角色移動與跳的邏輯關系def logic(self, screen):if self.boos_time_updata_y:self.y = 500self.x = 100self.boos_time_updata_y = Falseif not self.is_jump:self.move_position(screen)return# 如果還沒有跳到最高點if not self.is_jump_max:self.action = ACTION_JUMP_RIGHT if self.get_dir() == \DIR_RIGHT else ACTION_JUMP_LEFT# 更新Y坐標self.y -= 8# 設置子彈在Y方向上具有向上的加速度self.set_bullet_y_accelate(-2)# 已經達到最高點if self.y <= self.view_manager.Y_JUMP_MAX:self.is_jump_max = Trueelse:self.jump_stop_count -= 1# 如果在最高點停留次數已經使用完if self.jump_stop_count <= 0:# 更新Y坐標self.y += 8# 設置子彈在Y方向上具有向下的加速度self.set_bullet_y_accelate(2)# 已經掉落到最低點if self.y >= self.view_manager.Y_DEFALUT:# 恢復Y坐標self.y = self.view_manager.Y_DEFALUTself.is_jump = Falseself.is_jump_max = Falseself.action = ACTION_STAND_RIGHTelse:# 未掉落到最低點,繼續使用跳的動作self.action = ACTION_JUMP_RIGHT if self.get_dir() == \DIR_RIGHT else ACTION_JUMP_LEFT# 控制角色移動self.move_position(screen)# 更新子彈的位置(子彈位置同樣會受到角色的位移的影響)def update_bullet_shift(self, shift):for bullet in self.bullet_list:bullet.x = bullet.x - shift# 給子彈設置垂直方向上的加速度# 游戲的設計是:當角色跳動時,子彈會具有垂直方向上的加速度def set_bullet_y_accelate(self, accelate):for bullet in self.bullet_list:if bullet.y_accelate == 0:bullet.y_accelate = accelate3)主程序運行
# coding: utf-8import pygame import sys from view_manager import ViewManager import game_functions as gf import monster_manager as mm import boss_manager as bs from player import *def run_game():# 初始化游戲pygame.init()# 初始化混音器模塊pygame.mixer.init()# 加載背景音樂pygame.mixer.music.load('music/background.mp3')# 創建ViewManager對象view_manager = ViewManager()# 設置顯示屏幕,返回Surface對象screen = pygame.display.set_mode((view_manager.screen_width, view_manager.screen_height))# 設置標題pygame.display.set_caption('勇者大冒險')# 創建玩家角色player = Player(view_manager, 'P1', MAX_HP)while(True):pygame.time.delay(15)# 處理游戲事件gf.check_events(screen, view_manager, player)# 更新游戲屏幕gf.update_screen(screen, view_manager, mm, player,bs)# 播放背景音樂if pygame.mixer.music.get_busy() == False:pygame.mixer.music.play() run_game()四、效果展示
游戲說明:空格射擊子彈、反向鍵移動即可。更多好玩兒的等大家自己體驗的啦~
1)游戲界面
?2)開始游戲
?3)跳躍射擊
?4)BOSS時刻
PS:如果你以前喜歡過《魂斗羅》、《合金彈頭》的話,這款游戲絕對值得擁有。
那種像素游戲中的突突突可能就是青春中簡單的浪漫吧,還記得當初上電腦課最快樂的時刻,
也莫過于反復的死亡,反復地期待著下一周的課,終于在某一周的課上打通了游戲,那時會手
舞足蹈,引起老師關注,然后被一頓臭罵,但心底的最深處還是掩藏不住得激動。相信這款游
戲也能給你帶來相同的感動。
總結
不得不說剛一手我就愛上了這款游戲,在敵人的槍林彈雨中來回跳躍的感覺屬實刺激。之前已
經寫過N篇游戲的文章代碼啦!要來挑一挑你喜歡的嘛?
老規矩的撒!來看文章匯總得免費的源碼素材的哈👇
老規矩,木子的文章匯總可以看到分類好的各種不同類型的文章,滴滴我大部分源碼都在滴。
🎯完整的免費源碼領取處:找我吖!文末公眾hao可自行領取,滴滴我也可!
🔨推薦往期文章——
?項目1.0《小蜜蜂歷險記》
【Pygame實戰】強烈推薦:教你用百行代碼編寫一款《小蜜蜂歷險記》不信?來看看(玩兒嗨了~)
項目1.1? 撲克牌游戲
【Pygame實戰】打撲克牌嘛?贏了輸了?這款打牌游戲,竟讓我廢寢忘食。
項目1.2? 英文單詞猜猜看小游戲
【Pygame實戰】再次祭出舍不得分享的學習小技巧,用游戲玩出英文能力(O基礎也能輕松get)
項目8.3? 泡泡機游戲
【Pygame實戰】超有趣的泡泡游戲來襲——愿你童心不泯,永遠快樂簡單哦~
🎄文章匯總——
匯總合集??Python—2022 |已有文章匯總 | 持續更新,直接看這篇就夠了
(更多內容+源碼都在?文章匯總哦!!歡迎閱讀喜歡的文章🎉~)
總結
以上是生活随笔為你收集整理的【Pygame实战】只有一个币,投《勇者大冒险》还是《街霸》?(经典复刻,谁的青春回来了?)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 系统硬件信息检测工具,Lin
- 下一篇: mediawiki 页面的导出和离线浏览