• 关于

    截取当前屏幕图片

    的搜索结果

问题

控制台介绍  应用编辑器页面

反向一觉 2019-12-01 20:56:42 1002 浏览量 回答数 0

回答

对,网页保存为图片的功能需要有,经常要用到的,很多时候网页太长,旺旺截图或者QQ截图等截图工具只能截取当前屏幕的,不能截到完整的网页 支持,等下

hsxqy 2019-12-02 02:47:17 0 浏览量 回答数 0

回答

首先要推荐几个常用的快键切换: 桌面操作: Win+上/下:使应用窗口在最大化,正常状态以及最小化之间进行切换;Win+左/右:使应用窗口在占据左/右半边屏幕以及正常状态之间进行切换;Win+左/右 > Win+上/下:使应用窗口占据屏幕四个角落1/4的屏幕区域;Win+逗号:启动Aero Peek,窥探桌面 ;Win+Tab:显示所有已打开的应用和桌面;Win+Ctrl+D:新建桌面;Win+Ctrl+F4:关闭正在使用的桌面;Win+Ctrl+左/右:在已打开的桌面之间进行切换;Win+ Shift +左/右:将应用窗口移动到左边或右边的显示器中;Win+ Shift +上:在垂直方向最大化窗口 日常操作: Win + E:打开资源管理器窗口;Win + Ctrl + F:打开查找计算机窗口;Win + L:锁定电脑;Win + M:最小化所有窗口,Win + Shift + M用于取消最小化所有窗口;Win + Pause:打开系统属性;Win + Print Screen:截屏并保存到用户图片文件夹下;Win + X: 任务栏隐藏菜单Win+W: 可截取当前屏幕,并方便地调用便签、草图板及编辑截图。 使用小娜来节省时间:小娜操作: Win + C:打开Cortana微软小娜,并开始聆听......Win + Q:打开Cortana;Win + S:打开Cortana; 使用小娜来节省时间:很多常用操作都可以用语音操作天气、货币换算、启动程序、口述后,直接进行简单的计算(可以不用启动计算器了)、查快递(说单号)、翻译单词或短句 可以直接用语音来安排计划 ,说出时间地点添加提醒,到时就能定期提醒。设定任意文件夹到快速访问TC 最常用的一个功能就是快速访问,这回Win10直接自带了。双击需要设定快速访问的文件夹,然后在左侧最上方的【快速访问】点击右键,会出来【将当前文件夹固定到快速访问】的选项,点击就行。相同操作还可以把这个文件夹【固定到“开始”屏幕】。可以把常用文件夹都设成快速访问,能让你平时的操作速度提高不少。设置里的所有设置选项都能固定到开始屏幕,设置选项上按右键就能把他固定到开始屏幕。

独步清客 2019-12-02 00:43:44 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

以下整理汇总有关Mac的五十条使用技巧,能帮你更熟练的使用Mac电脑。 精确调节音量当你调节音量的同时按住Option-Shift键,将使你的音量调节单位变为原来的1/4。 通过歌词搜索音乐在Leopard下,Spotlight已经可以通过歌词来搜索音乐文件了。 向Mail中添加附件简单地通过拖拽,将文件拖到Mail图标上,Mail会自动将文件作为附件发送。 在没有鼠标或触摸板的情况下工作按Control-F1调出全键盘模式,然后按Control - F2进入菜单,或按Control - F3进入Dock。 慢放或快放在Quicktime里,你可以通过触摸板的手指滑动或利用鼠标滚轮使画面一帧一帧地前进或后退,甚至停止。 在Mail中提升或降低引用级别当我们回复邮件时,原始邮件内容被引用在邮件下方,我们可以通过按Command- '或Command-Option- '组合键“提升或降低”任意引用内容的级别。 利用地址栏(Pathbar)移动文件在Finder中,你可以通过简单拖拽文件到地址栏显示的层级文件夹中,完成文件的移动。 利用Preview(预览)剪裁图片在Preview中,选中你想要剪裁的区域,然后按Command-K,工作完成。 让你的Mac说“Hello”打开Terminal(终端),在命令行输入:say Hello,回车。你的Mac就会向你问候了。当然你也可以将hello换成其它的单词。试试看。 横向移动在cocoa程序中,例如Pages,当页面太大出现了横向滚动条时,你可以按下Shift键,再利用鼠标滚轮就可以横向移动页面了。当然,有些程序例如Photoshop,Shift键不管用,你需要按下Command键。 让Mail替你读邮件如果你实在太懒了不想自己看邮件,你可以选中邮件文字,然后选择“编辑” - “阅读”- “开始阅读”,然后你的Mac会为你朗读这些文字。遗憾的是,它不懂汉语。 Safari中建立新标签在Safari的标签栏的空白处双击鼠标,会建立一个新标签(类似于Firefox)。 放大/缩小屏幕显示按住Control键,滚动鼠标转轮就可以放大、缩小你的屏幕显示了。 隐藏所有其它窗口窗口太多太乱,按下Command-Option-H组合键,除了当前窗口以外的其它窗口会自动隐藏(不是缩小)。 使隐藏的程序在Dock上透明在Terminal(终端)中输入以下内容:defaults write com.apple.Dock showhidden -bool YES执行后,所有隐藏的程序图标在Dock上变成透明的了。 将常用项目拖到Finder的工具栏是的,你可以轻松将一些常用文件夹拖放到Finder工具栏。如果不想要了,按住Command键后再拖离工具栏就行了。 从iTunes音乐库中删除歌曲当你想要删除iTunes中的歌曲,只需要高亮歌曲名称,然后按Option-Delete,就可以从iTunes库中将歌曲完全删除。 强迫Safari在新Tab中打开链接在Terminal(终端)中输入defaults write com.apple.Safari TargetedClicksCreateTabs -bool true,执行后,Safari将始终在新Tab中打开链接。(有时候,我们在Firefox中就是这么设置的) 快速清空垃圾桶如果你在清空垃圾桶是不想看到任何烦人的提示,你可以按下:Command-Option-Shift-Delete组合键,世界清净了。(当然,这样做之前你必须确定垃圾桶里的是真正的废品) 利用Preview快速提取图标漂亮精致的图标文件其实可以用在很多场合,如文书、演示等等。不需要任何第三方软件,仅仅利用Preview,你就可以轻松做到。 移除抗锯齿当我们利用Ctrl和鼠标滚轮放大屏幕的时候,系统自动的“抗锯齿”功能自动启用,让你感觉每个字都很模糊的样子,这时候,你可以按下:Command-Option-Backslash(反斜杠””)关闭“抗锯齿”功能 Eliza的精神病办公室A. 打开Terminal(终端) B. 输入:emacsC. 按Shift-EscapeD. 输入:xdoctorE. 回答Eliza的所有问题,记得要礼貌些+ Q: z8 u; b' ^) E/ ^; [5 VF. 这是免费的:) 快速订阅RSS到Mail当你在Safari的地址栏最右侧看到RSS图标时,点击它就可以快速在Mail中订阅这个地址。 调出快捷键清单在大多数程序中,如果你想要一份详细的程序快捷键清单,那么你可以点击Leopard的help菜单,在搜索框输入:shortcuts,然后这个程序的所有快捷键就会展示给你,很酷吧。 让Mac定时启动/关闭进入Preference(设置)- Energy Saver(节能),按Schedule(计划)。 快速黑屏按下组合键Control-Shift-Eject(弹出光驱键),你的Mac屏幕就迅速黑屏了,移动鼠标或敲击任意键会自动恢复。这个功能可以在你暂时离开时节约能源,保护隐私,延长显示屏寿命。 在Finder中打开Spotlight搜索结果当你通过Spotlight搜索到文件后,按回车键就是打开这个文件,如果你按住Command然后再回车,系统会自动在Finder中打开该文件所在目录,并且高亮显示该文件。这是一个很有用的技巧。 在Mail中引用部分文字收到一封邮件,你可以选定其中的一部分内容,然后点reply(回复),你选的那部分内容会自动在回函中被引用。 把屏幕保护当成桌面这是一个超酷的功能,首先设置一个你喜欢的屏幕保护,然后进入Terminal(终端),输入:/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background6,看看桌面,是不是变成屏幕保护了? 不想玩儿了,就按Control - C退出。 通过Dock隐藏其它程序窗口按住Command-Option的同时,点击Dock上的程序,当程序打开时会自动隐藏其它已打开的窗口,世界再一次清净了。 自动调整Finder侧边栏宽度按下组合键Command-Option-Control-T。 区分单页和多页的PDF多页的PDF图标在左边有一个黑色夹边,而单页的没有。 快速清空Help搜索框在搜索框中输入字符,直接按回车后会打开相关内容,但是如果你按着Option键再回车,则会快速清空搜索框,你可以重新输入。 在Spotlight结果里的不同分组中跳动如果你按住Command键的同时按上下方向键,你可以在Spotlight搜索结果里的不同分组中跳动。这句话很拗口,试一试容易懂。 在Spotlight中按修改日期搜索如果你想搜索所有在2008年10月23日以前修改的文件,你可以在Spotlight中输入: <=10/23/08( l3 `) b, B, A以此类推,如果是以后的文件,把 “<” 换成 “>” 就行了。 在Finder中按名称搜索在Finder中按下组合键Command-Shift-F可以帮助你快速跳到按名称搜索框。 慢动作按住Shift键的同时执行一些命令,可以放慢动作给你看。目前已知可行的一些命令是:Spaces、Exposé、Dashboard、最小化、关闭Widgets、打开最小化的窗口。 组合Exposé 和 Space'当你按F8键激活Space后,你仍然可以Exposé所选择的Space,试试看,很有趣。 在Space中移动所有相关程序窗口假如你开了3个Safari窗口,按F8激活Space,然后按住Shift键,拖动Safari窗口到另一个Space,这时所有的3个Safari窗口都移过去了。 将不同Space中的窗口收集到一起如果在你每个Space中都有窗口,现在你想把所有窗口全部移动到一个Space中,怎么办?按F8激活Space,然后再按C键。 改变删除方向在PC中,都有一个Delete按键可以删除光标后面的字符,但在Mac电脑中Delete按键只能删除光标前面的字符。有时候很不方便。其实当你按下Fn键后再敲Delete键,就可以向后删除了。 多重选择在大多数程序中,特别是Cocoa程序,你可以按住Command键多重选择项目,包括:文件、文字等等。 获得当前日期和时间在Terminal中输入:0 @) r4 d9 l+ _3 v7 N6 q2 g4 ]! [/ h9 K: D: @5 d# r* p3 g date3 S# X- z0 r5 o% l 0 [0 ~. t$ x- d- Y得到当前Mac日期和时间; J0 B$ O$ r4 W, ]. B! W2 H- ^ }date -jnu O6 `- M, [" b8 a+ j 2 V- d. 3 w9 b1 S4 e得到当前的世界标准时间(格林威治时间UTC) C( i- i7 o4 v, I* G6 v4 c( A, L: |! E1 E7 k 快速跳入Applications Folder(程序目录)' x" u3 I3 P* W/ R( Q- N5 N1 K在Finder下,按下组合键Command-Shift-A,可以快速进入程序目录。 自动计算如果你高亮选择一个公式,比如:5*15+20.5,然后按下组合键Command-Shift-8,你的Mac会自动将高亮部分替换成正确的计算结果 95.5。注意:这需要你的电脑已开启Script Editor功能。 鼠标取词翻译系统自带的字典也支持鼠标取词翻译。当你把光标悬停在一个单词上,按下Command-Control-D,这个单词的解释就会弹出来,这时候,按住Command-Control不放,移动光标就可以对其它单词进行取词翻译了。 用Grab进行截屏Grab是Mac自带的程序,和通常的屏幕截屏不一样,用Grab截屏的好处是可以截取带有光标的屏幕,光标的样式可以在设置里选择。当然,利用Grab时间延迟功能,也能截取带菜单的截图。 获得你的Mac序列号“关于本机” ,然后双击版本号位置。 如果你忘记登陆密码放入系统安装光盘,重启Mac的同时按住C键。然后选择“安装”- “重设密码”。 最后一招,快速关机你可能每天都能用得着:Command-Control-Option-Eject(弹出光驱键)。

独步清客 2019-12-02 00:43:43 0 浏览量 回答数 0

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1

回答

01状态机介绍 游戏中的状态机一般都是有限状态机,简写为FSM(有限状态机),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 状态机的每一个状态至少需要有以下三个操作: 启动:当从其他状态进入这个状态时,需要进行的初始化操作; 更新:在这个状态运行时进行的更新操作; 清理:当从这个状态退出时,需要进行的清除操作。 状态需要的变量: 下一个:表示这个状态退出后要转到的下一个状态; 坚持:在状态间转换时需要传递的数据; 完成:表示这个状态是否结束,状态机会根据这个值来决定转换状态。 游戏界面状态机的状态转换图如下,箭头表示可能的状态转换方向:(注意有个转换不太好画出来:超时状态可以转换到Game Over状态。) 这几个状态的意思比较简单,下面把游戏界面的截图发一下。 主菜单:主菜单,启动程序就进入这个状态,可以用上和下键选择玩家1或玩家2,按回车键开启游戏。 加载屏幕:游戏开始前的加载界面。 游戏运行:游戏运行时的状态,在代码实现中是Level类。 游戏结束:人物死亡且生命数量为0时到这个状态。 超时:在游戏中时间超时会到这个状态,这个和Game Over类似,就不截图了。 02状态机代码实现 因为这篇文章的目的是游戏界面的状态机实现,所以专门写了一个state_demo.py文件,让大家可以更加方便的看代码。 游戏启动代码 开始是pygame的初始化,设置屏幕大小为c.SCREEN_SIZE(800,600)。所有的常量都保存在单独的constants.py中。 import os import pygame as pg import constants as c 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() load_all_gfx函数查找指定目录下所有符合后缀名的图片,使用pg.image.load函数加载,保存在图形set中。 GFX保存在资源/图形目录找到的所有图片,后面获取各种图形时会用到。 def load_all_gfx(directory, colorkey=(255,0,255), accept=('.png', '.jpg', '.bmp', '.gif')): 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 GFX = load_all_gfx(os.path.join("resources","graphics")) 下面是demo的入口函数,先创建了一个保存所有状态的state_dict设置,调用setup_states函数设置启动状态是MAIN_MENU。 if __name__=='__main__': game = Control() state_dict = {c.MAIN_MENU: Menu(), c.LOAD_SCREEN: LoadScreen(), c.LEVEL: Level(), c.GAME_OVER: GameOver(), c.TIME_OUT: TimeOut()} game.setup_states(state_dict, c.MAIN_MENU) game.main() 状态类 先定义一个状态基类,按照上面说的状态需要的三个操作分别定义函数(启动,更新,清理)。在init函数中定义了上面说的三个变量(next,persist,```js done),还有start_time和current_time用于记录时间。 class State(): def init(self): self.start_time = 0.0 self.current_time = 0.0 self.done = False self.next = None self.persist = {} @abstractmethod def startup(self, current_time, persist): '''abstract method''' def cleanup(self): self.done = False return self.persist @abstractmethod def update(sefl, surface, keys, current_time): '''abstract method''' 看一个状态类LoadScreen的具体实现,这个状态的显示效果如图3。 startup函数保存了预期的persist,设置next为Level状态类,start_time保存进入该状态的开始时间。初始化一个Infoclass,这个就是专门用来显示界面信息的。 update函数根据在这个状态已运行的时间(current_time-self.start_time),决定显示内容和是否结束状态(self.done = True)。 ```js class LoadScreen(State): def __init__(self): State.__init__(self) self.time_list = [2400, 2600, 2635] 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_info_state() self.overhead_info = Info(self.game_info, info_state) def set_next_state(self): return c.LEVEL def set_info_state(self): return c.LOAD_SCREEN def update(self, surface, keys, current_time): if (current_time - self.start_time) < self.time_list[0]: surface.fill(c.BLACK) self.overhead_info.update(self.game_info) self.overhead_info.draw(surface) elif (current_time - self.start_time) < self.time_list[1]: surface.fill(c.BLACK) elif (current_time - self.start_time) < self.time_list[2]: surface.fill((106, 150, 252)) else: self.done = True 信息类 下面介绍的信息类,界面的显示大部分都是由它来完成,初始化函数中create_info_labels函数创建通用的信息,create_state_labels函数对于不同的状态,会初始化不同的信息。 class Info(): def __init__(self, game_info, state): self.coin_total = game_info[c.COIN_TOTAL] self.total_lives = game_info[c.LIVES] self.state = state self.game_info = game_info self.create_font_image_dict() self.create_info_labels() self.create_state_labels() self.flashing_coin = FlashCoin(280, 53) create_font_image_dict函数从之前加载的图片GFX ['text_images']中,截取字母和数字对应的图形,保存在一个设置中,在后面创建文字时会用到。 def create_font_image_dict(self): self.image_dict = {} image_list = [] image_rect_list = [# 0 - 9 (3, 230, 7, 7), (12, 230, 7, 7), (19, 230, 7, 7), (27, 230, 7, 7), (35, 230, 7, 7), (43, 230, 7, 7), (51, 230, 7, 7), (59, 230, 7, 7), (67, 230, 7, 7), (75, 230, 7, 7), # A - Z (83, 230, 7, 7), (91, 230, 7, 7), (99, 230, 7, 7), (107, 230, 7, 7), (115, 230, 7, 7), (123, 230, 7, 7), (3, 238, 7, 7), (11, 238, 7, 7), (20, 238, 7, 7), (27, 238, 7, 7), (35, 238, 7, 7), (44, 238, 7, 7), (51, 238, 7, 7), (59, 238, 7, 7), (67, 238, 7, 7), (75, 238, 7, 7), (83, 238, 7, 7), (91, 238, 7, 7), (99, 238, 7, 7), (108, 238, 7, 7), (115, 238, 7, 7), (123, 238, 7, 7), (3, 246, 7, 7), (11, 246, 7, 7), (20, 246, 7, 7), (27, 246, 7, 7), (48, 246, 7, 7), # -* (68, 249, 6, 2), (75, 247, 6, 6)] character_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -*' for character, image_rect in zip(character_string, image_rect_list): self.image_dict[character] = get_image(GFX['text_images'], *image_rect, (92, 148, 252), 2.9) get_image函数从一个大的表面工作表中按照面积(x,y,宽度,高度)截取的部分图片放入表面图像对应的起始位置(0,0),并按比例参数调整大小。 pygame的blit函数介绍如下: pg.Surface.blit(source, dest, area=None, special_flags=0) -> Rect draw one image onto another def get_image(sheet, x, y, width, height, colorkey, scale): image = pg.Surface([width, height]) rect = image.get_rect() image.blit(sheet, (0, 0), (x, y, width, height)) image.set_colorkey(colorkey) image = pg.transform.scale(image, (int(rect.width*scale), int(rect.height*scale))) return image 看一下create_info_labels函数中其中一个字符串'MARIO'是如何在界面上显示的。 create_label函数参数(x,y)表示字符串在界面上的起始位置,从self.image_dict中根据字符获取对应的表面对象。 set_label_rects函数会设置字符串中每一个表面对象rect的(x,y)值。 pygame.Rect 对象中常用的成员变量(x,y),表示这个Surface的左上角的位置。 top, bottom: 表示Surface 在y轴上最上边和最下边的值, 所以top和y 值是一样的 left, right: 表示Surface 在x轴上最左边和最右边的值,所以left 和x 值是一样的 下面的坐标图可以看到,在左上角是整个屏幕的原点(0,0),图中标识了附件矩形的四个顶点的坐标。 def create_info_labels(self): ... self.mario_label = [] ... self.create_label(self.mario_label, 'MARIO', 75, 30) def create_label(self, label_list, string, x, y): for letter in string: label_list.append(Character(self.image_dict[letter])) self.set_label_rects(label_list, x, y) def set_label_rects(self, label_list, x, y): for i, letter in enumerate(label_list): letter.rect.x = x + ((letter.rect.width + 3) * i) letter.rect.y = y if letter.image == self.image_dict['-']: letter.rect.y += 7 letter.rect.x += 2 控制类 Control是状态机类,main函数是游戏的主循环,setup_states函数设置游戏启动时运行的状态。 class Control(): def __init__(self): self.screen = pg.display.get_surface() self.done = False self.clock = pg.time.Clock() self.fps = 60 self.current_time = 0.0 self.keys = pg.key.get_pressed() self.state_dict = {} self.state_name = None self.state = None def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state self.state = self.state_dict[self.state_name] def main(self): while not self.done: self.event_loop() self.update() pg.display.update() self.clock.tick(self.fps) event_loop函数负责监听输入(键盘输入和退出按钮),slef.keys保存键盘输入。 如果检测到当前状态结束,就调用flip_state函数进行旧状态的清理操作,并转换到下一个状态。更新函数会检测状态的完成值,调用状态的更新函数。 def update(self): self.current_time = pg.time.get_ticks() if self.state.done: self.flip_state() self.state.update(self.screen, self.keys, self.current_time) def flip_state(self): previous, self.state_name = self.state_name, self.state.next persist = self.state.cleanup() self.state = self.state_dict[self.state_name] self.state.startup(self.current_time, persist) def event_loop(self): for event in pg.event.get(): if event.type == pg.QUIT: self.done = True elif event.type == pg.KEYDOWN: self.keys = pg.key.get_pressed() elif event.type == pg.KEYUP: self.keys = pg.key.get_pressed() 03完整代码 有两个文件constants.py和state_demo.py,constants.py保存了所有的字符串定义和常量。 constants.py GAME_TIME_OUT表示游戏的超时时间,这边为了demo演示,设成5秒,实际是300秒。 SCREEN_HEIGHT = 600 SCREEN_WIDTH = 800 SCREEN_SIZE = (SCREEN_WIDTH,SCREEN_HEIGHT) ORIGINAL_CAPTION = "Super Mario Bros" GAME_TIME_OUT = 5 ## COLORS ## # R G B BLACK = ( 0, 0, 0) SIZE_MULTIPLIER = 2.5 BRICK_SIZE_MULTIPLIER = 2.69 BACKGROUND_MULTIPLER = 2.679 GROUND_HEIGHT = SCREEN_HEIGHT - 62 #STATES FOR ENTIRE GAME MAIN_MENU = 'main menu' LOAD_SCREEN = 'load screen' TIME_OUT = 'time out' GAME_OVER = 'game over' LEVEL = 'level' #MAIN MENU CURSOR STATES PLAYER1 = '1 PLAYER GAME' PLAYER2 = '2 PLAYER GAME' #GAME INFO DICTIONARY KEYS COIN_TOTAL = 'coin total' SCORE = 'score' TOP_SCORE = 'top score' LIVES = 'lives' CURRENT_TIME = 'current time' LEVEL_NUM = 'level num' PLAYER_NAME = 'player name' PLAYER_MARIO = 'mario' PLAYER_LUIGI = 'luigi' ITEM_SHEET = 'item_objects' state_demo.py 上面讲的状态类,状态机类都放在这里。 import os import pygame as pg from abc import ABC, abstractmethod import constants as c class State(): def __init__(self): self.start_time = 0.0 self.current_time = 0.0 self.done = False self.next = None self.persist = {} @abstractmethod def startup(self, current_time, persist): '''abstract method''' def cleanup(self): self.done = False return self.persist @abstractmethod def update(sefl, surface, keys, current_time): '''abstract method''' class Menu(State): def __init__(self): 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_NUM: 1, c.PLAYER_NAME: c.PLAYER_MARIO} self.startup(0.0, persist) def startup(self, current_time, persist): self.next = c.LOAD_SCREEN self.persist = persist self.game_info = persist self.overhead_info = Info(self.game_info, c.MAIN_MENU) self.setup_background() self.setup_player() self.setup_cursor() def setup_background(self): self.background = 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 = SCREEN.get_rect(bottom=SCREEN_RECT.bottom) self.image_dict = {} image = get_image(GFX['title_screen'], 1, 60, 176, 88, (255, 0, 220), c.SIZE_MULTIPLIER) rect = image.get_rect() rect.x, rect.y = (170, 100) self.image_dict['GAME_NAME_BOX'] = (image, rect) def setup_player(self): self.player_list = [] player_rect_info = [(178, 32, 12, 16), (178, 128, 12, 16)] for rect in player_rect_info: image = get_image(GFX['mario_bros'], *rect, c.BLACK, 2.9) rect = image.get_rect() rect.x, rect.bottom = 110, c.GROUND_HEIGHT self.player_list.append((image, rect)) self.player_index = 0 def setup_cursor(self): self.cursor = pg.sprite.Sprite() self.cursor.image = get_image(GFX[c.ITEM_SHEET], 24, 160, 8, 8, c.BLACK, 3) rect = self.cursor.image.get_rect() rect.x, rect.y = (220, 358) self.cursor.rect = rect self.cursor.state = c.PLAYER1 def update(self, surface, keys, current_time): self.current_time = current_time self.game_info[c.CURRENT_TIME] = self.current_time self.player_image = self.player_list[self.player_index][0] self.player_rect = self.player_list[self.player_index][1] 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.player_image, self.player_rect) surface.blit(self.cursor.image, self.cursor.rect) self.overhead_info.draw(surface) def update_cursor(self, keys): if self.cursor.state == c.PLAYER1: self.cursor.rect.y = 358 if keys[pg.K_DOWN]: self.cursor.state = c.PLAYER2 self.player_index = 1 self.game_info[c.PLAYER_NAME] = c.PLAYER_LUIGI elif self.cursor.state == c.PLAYER2: self.cursor.rect.y = 403 if keys[pg.K_UP]: self.cursor.state = c.PLAYER1 self.player_index = 0 self.game_info[c.PLAYER_NAME] = c.PLAYER_MARIO if keys[pg.K_RETURN]: self.done = True class LoadScreen(State): def __init__(self): State.__init__(self) self.time_list = [2400, 2600, 2635] 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_info_state() self.overhead_info = Info(self.game_info, info_state) def set_next_state(self): return c.LEVEL def set_info_state(self): return c.LOAD_SCREEN def update(self, surface, keys, current_time): if (current_time - self.start_time) < self.time_list[0]: surface.fill(c.BLACK) self.overhead_info.update(self.game_info) self.overhead_info.draw(surface) elif (current_time - self.start_time) < self.time_list[1]: surface.fill(c.BLACK) elif (current_time - self.start_time) < self.time_list[2]: surface.fill((106, 150, 252)) else: self.done = True class GameOver(LoadScreen): def __init__(self): LoadScreen.__init__(self) self.time_list = [3000, 3200, 3235] def set_next_state(self): return c.MAIN_MENU def set_info_state(self): return c.GAME_OVER class TimeOut(LoadScreen): def __init__(self): LoadScreen.__init__(self) self.time_list = [2400, 2600, 2635] def set_next_state(self): if self.persist[c.LIVES] == 0: return c.GAME_OVER else: return c.LOAD_SCREEN def set_info_state(self): return c.TIME_OUT class Level(State): def __init__(self): State.__init__(self) def startup(self, current_time, persist): self.game_info = persist self.persist = self.game_info self.player = None self.overhead_info = Info(self.game_info, c.LEVEL) self.setup_background() def setup_background(self): self.background = GFX['level_1'] self.bg_rect = self.background.get_rect() self.background = pg.transform.scale(self.background, (int(self.bg_rect.width*c.BACKGROUND_MULTIPLER), int(self.bg_rect.height*c.BACKGROUND_MULTIPLER))) self.bg_rect = self.background.get_rect() self.level = pg.Surface((self.bg_rect.w, self.bg_rect.h)).convert() self.viewport = SCREEN.get_rect(bottom=self.bg_rect.bottom) def update(self, surface, keys, current_time): self.game_info[c.CURRENT_TIME] = self.current_time = current_time self.overhead_info.update(self.game_info, self.player) if self.overhead_info.time <= 0: self.update_game_info() self.done = True self.draw(surface) def update_game_info(self): self.persist[c.LIVES] -= 1 if self.persist[c.LIVES] == 0: self.next = c.GAME_OVER elif self.overhead_info.time == 0: self.next = c.TIME_OUT else: self.next = c.LOAD_SCREEN def draw(self, surface): self.level.blit(self.background, self.viewport, self.viewport) surface.blit(self.level, (0,0), self.viewport) self.overhead_info.draw(surface) class Character(pg.sprite.Sprite): def __init__(self, image): pg.sprite.Sprite.__init__(self) self.image = image self.rect = self.image.get_rect() class Info(): def __init__(self, game_info, state): self.coin_total = game_info[c.COIN_TOTAL] self.total_lives = game_info[c.LIVES] self.state = state self.game_info = game_info self.create_font_image_dict() self.create_info_labels() self.create_state_labels() self.flashing_coin = FlashCoin(280, 53) def create_font_image_dict(self): self.image_dict = {} image_list = [] image_rect_list = [# 0 - 9 (3, 230, 7, 7), (12, 230, 7, 7), (19, 230, 7, 7), (27, 230, 7, 7), (35, 230, 7, 7), (43, 230, 7, 7), (51, 230, 7, 7), (59, 230, 7, 7), (67, 230, 7, 7), (75, 230, 7, 7), # A - Z (83, 230, 7, 7), (91, 230, 7, 7), (99, 230, 7, 7), (107, 230, 7, 7), (115, 230, 7, 7), (123, 230, 7, 7), (3, 238, 7, 7), (11, 238, 7, 7), (20, 238, 7, 7), (27, 238, 7, 7), (35, 238, 7, 7), (44, 238, 7, 7), (51, 238, 7, 7), (59, 238, 7, 7), (67, 238, 7, 7), (75, 238, 7, 7), (83, 238, 7, 7), (91, 238, 7, 7), (99, 238, 7, 7), (108, 238, 7, 7), (115, 238, 7, 7), (123, 238, 7, 7), (3, 246, 7, 7), (11, 246, 7, 7), (20, 246, 7, 7), (27, 246, 7, 7), (48, 246, 7, 7), # -* (68, 249, 6, 2), (75, 247, 6, 6)] character_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -*' for character, image_rect in zip(character_string, image_rect_list): self.image_dict[character] = get_image(GFX['text_images'], *image_rect, (92, 148, 252), 2.9) def create_info_labels(self): self.score_text = [] self.coin_count_text = [] self.mario_label = [] self.world_label = [] self.time_label = [] self.stage_label = [] self.create_label(self.score_text, '000000', 75, 55) self.create_label(self.coin_count_text, '*00', 300, 55) self.create_label(self.mario_label, 'MARIO', 75, 30) self.create_label(self.world_label, 'WORLD', 450, 30) self.create_label(self.time_label, 'TIME', 625, 30) self.create_label(self.stage_label, '1-1', 472, 55) self.info_labels = [self.score_text, self.coin_count_text, self.mario_label, self.world_label, self.time_label, self.stage_label] def create_state_labels(self): if self.state == c.MAIN_MENU: self.create_main_menu_labels() elif self.state == c.LOAD_SCREEN: self.create_player_image() self.create_load_screen_labels() elif self.state == c.LEVEL: self.create_level_labels() elif self.state == c.GAME_OVER: self.create_game_over_labels() elif self.state == c.TIME_OUT: self.create_time_out_labels() def create_player_image(self): self.life_times_image = get_image(GFX['text_images'], 75, 247, 6, 6, (92, 148, 252), 2.9) self.life_times_rect = self.life_times_image.get_rect(center=(378, 295)) self.life_total_label = [] self.create_label(self.life_total_label, str(self.total_lives), 450, 285) if self.game_info[c.PLAYER_NAME] == c.PLAYER_MARIO: rect = (178, 32, 12, 16) else: rect = (178, 128, 12, 16) self.player_image = get_image(GFX['mario_bros'], *rect, (92, 148, 252), 2.9) self.player_rect = self.player_image.get_rect(center=(320, 290)) def create_main_menu_labels(self): mario_game = [] luigi_game = [] top = [] top_score = [] self.create_label(mario_game, c.PLAYER1, 272, 360) self.create_label(luigi_game, c.PLAYER2, 272, 405) self.create_label(top, 'TOP - ', 290, 465) self.create_label(top_score, '000000', 400, 465) self.state_labels = [mario_game, luigi_game, top, top_score, *self.info_labels] def create_load_screen_labels(self): world_label = [] self.stage_label2 = [] self.create_label(world_label, 'WORLD', 280, 200) self.create_label(self.stage_label2, '1-1', 430, 200) self.state_labels = [world_label, self.stage_label2, *self.info_labels, self.life_total_label] def create_level_labels(self): self.time = c.GAME_TIME_OUT self.current_time = 0 self.clock_time_label = [] self.create_label(self.clock_time_label, str(self.time), 645, 55) self.state_labels = [*self.info_labels, self.clock_time_label] def create_game_over_labels(self): game_label = [] over_label = [] self.create_label(game_label, 'GAME', 280, 300) self.create_label(over_label, 'OVER', 400, 300) self.state_labels = [game_label, over_label, *self.info_labels] def create_time_out_labels(self): timeout_label = [] self.create_label(timeout_label, 'TIME OUT', 290, 310) self.state_labels = [timeout_label, *self.info_labels] def create_label(self, label_list, string, x, y): for letter in string: label_list.append(Character(self.image_dict[letter])) self.set_label_rects(label_list, x, y) def set_label_rects(self, label_list, x, y): for i, letter in enumerate(label_list): letter.rect.x = x + ((letter.rect.width + 3) * i) letter.rect.y = y if letter.image == self.image_dict['-']: letter.rect.y += 7 letter.rect.x += 2 def update(self, level_info, level=None): self.level = level self.handle_level_state(level_info) def handle_level_state(self, level_info): self.score = level_info[c.SCORE] self.update_text(self.score_text, self.score) self.update_text(self.coin_count_text, level_info[c.COIN_TOTAL]) self.update_text(self.stage_label, level_info[c.LEVEL_NUM]) self.flashing_coin.update(level_info[c.CURRENT_TIME]) if self.state == c.LOAD_SCREEN: self.update_text(self.stage_label2, level_info[c.LEVEL_NUM]) if self.state == c.LEVEL: if (level_info[c.CURRENT_TIME] - self.current_time) > 1000: self.current_time = level_info[c.CURRENT_TIME] self.time -= 1 self.update_text(self.clock_time_label, self.time, True) def update_text(self, text, score, reset=False): if reset and len(text) > len(str(score)): text.remove(text[0]) index = len(text) - 1 for digit in reversed(str(score)): rect = text[index].rect text[index] = Character(self.image_dict[digit]) text[index].rect = rect index -= 1 def draw(self, surface): self.draw_info(surface, self.state_labels) if self.state == c.LOAD_SCREEN: surface.blit(self.player_image, self.player_rect) surface.blit(self.life_times_image, self.life_times_rect) surface.blit(self.flashing_coin.image, self.flashing_coin.rect) def draw_info(self, surface, label_list): for label in label_list: for letter in label: surface.blit(letter.image, letter.rect) class FlashCoin(pg.sprite.Sprite): def __init__(self, x, y): pg.sprite.Sprite.__init__(self) self.frame_index = 0 self.frames = [] self.load_frames() self.image = self.frames[self.frame_index] self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.animation_timer = 0 def load_frames(self): sheet = GFX[c.ITEM_SHEET] frame_rect_list = [(1, 160, 5, 8), (9, 160, 5, 8), (17, 160, 5, 8), (9, 160, 5, 8)] for frame_rect in frame_rect_list: self.frames.append(get_image(sheet, *frame_rect, c.BLACK, c.BRICK_SIZE_MULTIPLIER)) def update(self, current_time): time_list = [375, 125, 125, 125] if self.animation_timer == 0: self.animation_timer = current_time elif (current_time - self.animation_timer) > time_list[self.frame_index]: self.frame_index += 1 if self.frame_index == 4: self.frame_index = 0 self.animation_timer = current_time self.image = self.frames[self.frame_index] class Control(): def __init__(self): self.screen = pg.display.get_surface() self.done = False self.clock = pg.time.Clock() self.fps = 60 self.current_time = 0.0 self.keys = pg.key.get_pressed() self.state_dict = {} self.state_name = None self.state = None def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state self.state = self.state_dict[self.state_name] def update(self): self.current_time = pg.time.get_ticks() if self.state.done: self.flip_state() self.state.update(self.screen, self.keys, self.current_time) def flip_state(self): previous, self.state_name = self.state_name, self.state.next persist = self.state.cleanup() self.state = self.state_dict[self.state_name] self.state.startup(self.current_time, persist) def event_loop(self): for event in pg.event.get(): if event.type == pg.QUIT: self.done = True elif event.type == pg.KEYDOWN: self.keys = pg.key.get_pressed() elif event.type == pg.KEYUP: self.keys = pg.key.get_pressed() def main(self): while not self.done: self.event_loop() self.update() pg.display.update() self.clock.tick(self.fps) def get_image(sheet, x, y, width, height, colorkey, scale): image = pg.Surface([width, height]) rect = image.get_rect() image.blit(sheet, (0, 0), (x, y, width, height)) image.set_colorkey(colorkey) image = pg.transform.scale(image, (int(rect.width*scale), int(rect.height*scale))) return image def load_all_gfx(directory, colorkey=(255,0,255), accept=('.png', '.jpg', '.bmp', '.gif')): 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 # pygame related initial code 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() GFX = load_all_gfx(os.path.join("resources","graphics")) if __name__=='__main__': game = Control() state_dict = {c.MAIN_MENU: Menu(), c.LOAD_SCREEN: LoadScreen(), c.LEVEL: Level(), c.GAME_OVER: GameOver(), c.TIME_OUT: TimeOut()} game.setup_states(state_dict, c.MAIN_MENU) game.main() 用到的图片 图片文件名要保存为对应的,不然代码中会找到,并且保存到state_demo.py所在目录下的resources \ graphics子目录中。如果能上github,可以直接下载resources \ graphics目录中的图片。 1,item_objects.png 2,level_1.png 3,mario_bros.png 4,text_images.png 5,tile_set.png 6,title_screen.png 编译环境:python3.7 + pygame1.9。 原文链接

珍宝珠 2019-12-25 10:11:52 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板