python 超级玛丽,超级玛丽游戏代码教程
这篇文章主要介绍了利用大蟒实现超级玛丽游戏的示例代码,帮助大家更好的理解和使用大蟒开发游戏,感兴趣的朋友可以跟随小编一起学习一下
目录
效果演示基础源码1.基础设置(工具部分)2.设置背景音乐以及场景中的文字(设置部分)3.设置游戏规则(加载_屏幕)4。设置游戏内菜单等(主菜单主要的。调用以上函数实现
效果演示
基础源码
1.基础设置(tools部分)
这个部分设置马里奥以及游戏中蘑菇等怪的的移动设置。
导入操作系统
将简介及安装导入为程序制导
按键绑定={
行动:pg .K_s,
跳:pg .K_a,
左:pg .K_LEFT,
右:pg .k _对,
向下:pg .K_DOWN
}
类别控制(对象):
整个项目的控制类。包含游戏循环,并包含
事件_循环根据需要将事件传递给状态。翻转逻辑
美国也在这里。
def __init__(self,caption):
自我。屏幕=pg。展示。get _ surface()
self.done=False
self.clock=pg.time.Clock()
自我说明=说明
self.fps=60
self.show_fps=False
自电流时间=0.0
self.keys=pg.key.get_pressed()
self.state_dict={}
self.state_name=无
自我状态=无
def setup_states(self,state_dict,start_state):
自我状态_字典=状态_字典
self.state_name=起始状态
自我。状态=自我。state _ dict[自我。状态_名称]
定义更新(自身):
自我。当前时间=pg。时间。get _ ticks()
if self.state.quit:
self.done=True
elif self.state.done:
self.flip_state()
self.state.update(self.screen,self.keys,self.current_time)
定义翻转状态(自身):
上一个,自我。状态名=自我。state _ name,self.state.next
persist=self.state.cleanup()
自我。状态=自我。state _ dict[自我。状态_名称]
自我。状态。启动(自我。当前时间,持续)
self.state.previous=先前
定义事件循环(自身):
对于pg.event.get():中的事件
if event.type==pg .QUIT:
self.done=True
elif event.type == pg.KEYDOWN:
self.keys = pg.key.get_pressed()
self.toggle_show_fps(event.key)
elif event.type == pg.KEYUP:
self.keys = pg.key.get_pressed()
self.state.get_event(event)
def toggle_show_fps(self, key):
if key == pg.K_F5:
self.show_fps = not self.show_fps
if not self.show_fps:
pg.display.set_caption(self.caption)
def main(self):
"""Main loop for entire program"""
while not self.done:
self.event_loop()
self.update()
pg.display.update()
self.clock.tick(self.fps)
if self.show_fps:
fps = self.clock.get_fps()
with_fps = "{} - {:.2f} FPS".format(self.caption, fps)
pg.display.set_caption(with_fps)
class _State(object):
def __init__(self):
self.start_time = 0.0
self.current_time = 0.0
self.done = False
self.quit = False
self.next = None
self.previous = None
self.persist = {}
def get_event(self, event):
pass
def startup(self, current_time, persistant):
self.persist = persistant
self.start_time = current_time
def cleanup(self):
self.done = False
return self.persist
def update(self, surface, keys, current_time):
pass
def load_all_gfx(directory, colorkey=(255,0,255), accept=(.png, jpg, bmp)):
graphics = {}
for pic in os.listdir(directory):
name, ext = os.path.splitext(pic)
if ext.lower() in accept:
img = pg.image.load(os.path.join(directory, pic))
if img.get_alpha():
img = img.convert_alpha()
else:
img = img.convert()
img.set_colorkey(colorkey)
graphics[name]=img
return graphics
def load_all_music(directory, accept=(.wav, .mp3, .ogg, .mdi)):
songs = {}
for song in os.listdir(directory):
name,ext = os.path.splitext(song)
if ext.lower() in accept:
songs[name] = os.path.join(directory, song)
return songs
def load_all_fonts(directory, accept=(.ttf)):
return load_all_music(directory, accept)
def load_all_sfx(directory, accept=(.wav,.mpe,.ogg,.mdi)):
effects = {}
for fx in os.listdir(directory):
name, ext = os.path.splitext(fx)
if ext.lower() in accept:
effects[name] = pg.mixer.Sound(os.path.join(directory, fx))
return effects
2.设置背景音乐以及场景中的文字(setup部分)
该部分主要设置场景中的背景音乐,以及字体的显示等设置。
import osimport pygame as pg
from . import tools
from .import constants as c
ORIGINAL_CAPTION = c.ORIGINAL_CAPTION
os.environ[SDL_VIDEO_CENTERED] = 1
pg.init()
pg.event.set_allowed([pg.KEYDOWN, pg.KEYUP, pg.QUIT])
pg.display.set_caption(c.ORIGINAL_CAPTION)
SCREEN = pg.display.set_mode(c.SCREEN_SIZE)
SCREEN_RECT = SCREEN.get_rect()
FONTS = tools.load_all_fonts(os.path.join("resources","fonts"))
MUSIC = tools.load_all_music(os.path.join("resources","music"))
GFX = tools.load_all_gfx(os.path.join("resources","graphics"))
SFX = tools.load_all_sfx(os.path.join("resources","sound"))
3.设置游戏规则(load_screen)
from .. import setup, toolsfrom .. import constants as c
from .. import game_sound
from ..components import info
class LoadScreen(tools._State):
def __init__(self):
tools._State.__init__(self)
def startup(self, current_time, persist):
self.start_time = current_time
self.persist = persist
self.game_info = self.persist
self.next = self.set_next_state()
info_state = self.set_overhead_info_state()
self.overhead_info = info.OverheadInfo(self.game_info, info_state)
self.sound_manager = game_sound.Sound(self.overhead_info)
def set_next_state(self):
"""Sets the next state"""
return c.LEVEL1
def set_overhead_info_state(self):
"""sets the state to send to the overhead info object"""
return c.LOAD_SCREEN
def update(self, surface, keys, current_time):
"""Updates the loading screen"""
if (current_time - self.start_time) < 2400:
surface.fill(c.BLACK)
self.overhead_info.update(self.game_info)
self.overhead_info.draw(surface)
elif (current_time - self.start_time) < 2600:
surface.fill(c.BLACK)
elif (current_time - self.start_time) < 2635:
surface.fill((106, 150, 252))
else:
self.done = True
class GameOver(LoadScreen):
"""A loading screen with Game Over"""
def __init__(self):
super(GameOver, self).__init__()
def set_next_state(self):
"""Sets next state"""
return c.MAIN_MENU
def set_overhead_info_state(self):
"""sets the state to send to the overhead info object"""
return c.GAME_OVER
def update(self, surface, keys, current_time):
self.current_time = current_time
self.sound_manager.update(self.persist, None)
if (self.current_time - self.start_time) < 7000:
surface.fill(c.BLACK)
self.overhead_info.update(self.game_info)
self.overhead_info.draw(surface)
elif (self.current_time - self.start_time) < 7200:
surface.fill(c.BLACK)
elif (self.current_time - self.start_time) < 7235:
surface.fill((106, 150, 252))
else:
self.done = True
class TimeOut(LoadScreen):
"""Loading Screen with Time Out"""
def __init__(self):
super(TimeOut, self).__init__()
def set_next_state(self):
"""Sets next state"""
if self.persist[c.LIVES] == 0:
return c.GAME_OVER
else:
return c.LOAD_SCREEN
def set_overhead_info_state(self):
"""Sets the state to send to the overhead info object"""
return c.TIME_OUT
def update(self, surface, keys, current_time):
self.current_time = current_time
if (self.current_time - self.start_time) < 2400:
surface.fill(c.BLACK)
self.overhead_info.update(self.game_info)
self.overhead_info.draw(surface)
else:
self.done = True
4.设置游戏内菜单等(main_menu)
import pygame as pg
from .. import setup, tools
from .. import constants as c
from .. components import info, mario
class Menu(tools._State):
def __init__(self):
"""Initializes the state"""
tools._State.__init__(self)
persist = {c.COIN_TOTAL: 0,
c.SCORE: 0,
c.LIVES: 3,
c.TOP_SCORE: 0,
c.CURRENT_TIME: 0.0,
c.LEVEL_STATE: None,
c.CAMERA_START_X: 0,
c.MARIO_DEAD: False}
self.startup(0.0, persist)
def startup(self, current_time, persist):
"""Called every time the games state becomes this one. Initializes
certain values"""
self.next = c.LOAD_SCREEN
self.persist = persist
self.game_info = persist
self.overhead_info = info.OverheadInfo(self.game_info, c.MAIN_MENU)
self.sprite_sheet = setup.GFX[title_screen]
self.setup_background()
self.setup_mario()
self.setup_cursor()
def setup_cursor(self):
"""Creates the mushroom cursor to select 1 or 2 player game"""
self.cursor = pg.sprite.Sprite()
dest = (220, 358)
self.cursor.image, self.cursor.rect = self.get_image(
24, 160, 8, 8, dest, setup.GFX[item_objects])
self.cursor.state = c.PLAYER1
def setup_mario(self):
"""Places Mario at the beginning of the level"""
self.mario = mario.Mario()
self.mario.rect.x = 110
self.mario.rect.bottom = c.GROUND_HEIGHT
def setup_background(self):
"""Setup the background image to blit"""
self.background = setup.GFX[level_1]
self.background_rect = self.background.get_rect()
self.background = pg.transform.scale(self.background,
(int(self.background_rect.width*c.BACKGROUND_MULTIPLER),
int(self.background_rect.height*c.BACKGROUND_MULTIPLER)))
self.viewport = setup.SCREEN.get_rect(bottom=setup.SCREEN_RECT.bottom)
self.image_dict = {}
self.image_dict[GAME_NAME_BOX] = self.get_image(
1, 60, 176, 88, (170, 100), setup.GFX[title_screen])
def get_image(self, x, y, width, height, dest, sprite_sheet):
"""Returns images and rects to blit onto the screen"""
image = pg.Surface([width, height])
rect = image.get_rect()
image.blit(sprite_sheet, (0, 0), (x, y, width, height))
if sprite_sheet == setup.GFX[title_screen]:
image.set_colorkey((255, 0, 220))
image = pg.transform.scale(image,
(int(rect.width*c.SIZE_MULTIPLIER),
int(rect.height*c.SIZE_MULTIPLIER)))
else:
image.set_colorkey(c.BLACK)
image = pg.transform.scale(image,
(int(rect.width*3),
int(rect.height*3)))
rect = image.get_rect()
rect.x = dest[0]
rect.y = dest[1]
return (image, rect)
def update(self, surface, keys, current_time):
"""Updates the state every refresh"""
self.current_time = current_time
self.game_info[c.CURRENT_TIME] = self.current_time
self.update_cursor(keys)
self.overhead_info.update(self.game_info)
surface.blit(self.background, self.viewport, self.viewport)
surface.blit(self.image_dict[GAME_NAME_BOX][0],
self.image_dict[GAME_NAME_BOX][1])
surface.blit(self.mario.image, self.mario.rect)
surface.blit(self.cursor.image, self.cursor.rect)
self.overhead_info.draw(surface)
def update_cursor(self, keys):
"""Update the position of the cursor"""
input_list = [pg.K_RETURN, pg.K_a, pg.K_s]
if self.cursor.state == c.PLAYER1:
self.cursor.rect.y = 358
if keys[pg.K_DOWN]:
self.cursor.state = c.PLAYER2
for input in input_list:
if keys[input]:
self.reset_game_info()
self.done = True
elif self.cursor.state == c.PLAYER2:
self.cursor.rect.y = 403
if keys[pg.K_UP]:
self.cursor.state = c.PLAYER1
def reset_game_info(self):
"""Resets the game info in case of a Game Over and restart"""
self.game_info[c.COIN_TOTAL] = 0
self.game_info[c.SCORE] = 0
self.game_info[c.LIVES] = 3
self.game_info[c.CURRENT_TIME] = 0.0
self.game_info[c.LEVEL_STATE] = None
self.persist = self.game_info
5.main()
from . import setup,toolsfrom .states import main_menu,load_screen,level1
from . import constants as c
def main():
"""Add states to control here."""
run_it = tools.Control(setup.ORIGINAL_CAPTION)
state_dict = {c.MAIN_MENU: main_menu.Menu(),
c.LOAD_SCREEN: load_screen.LoadScreen(),
c.TIME_OUT: load_screen.TimeOut(),
c.GAME_OVER: load_screen.GameOver(),
c.LEVEL1: level1.Level1()}
run_it.setup_states(state_dict, c.MAIN_MENU)
run_it.main()
6.调用以上函数实现
import sysimport pygame as pg
from 小游戏.超级玛丽.data.main import main
import cProfile
if __name__==__main__:
main()
pg.quit()
sys.exit()
以上就是基于Python实现超级玛丽游戏的示例代码的详细内容,更多关于Python超级玛丽的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。