Pygame入门-游戏代码结构及背景轮播、声音音效及图像动态效果
一、游戏代码结构
代码结构是代码的组织方式,也是游戏编程的思考框架。pygame官方文档中给出了以下建议,将游戏代码结构分为以下六个部分。
1导入游戏模块。
2资源处理类;定义一些类来处理最基本的资源,包括加载图像和声音,连接和断开网络,加载保存的游戏。
3游戏对象类;为你的游戏对象定义类。例如游戏对象、背景对象、玩家对象、敌人对象、道具对象、文本对象等。
4其他游戏功能;定义其他必要的功能,如游戏面板、菜单处理等。
5初始化游戏,包括pygame对象本身,背景,游戏对象(初始化类的实例)和任何其他你可能想要添加的小代码。
6主循环,你在其中放入任何输入处理(即观察用户敲击按键/鼠标按钮),用于更新游戏对象的代码,最后用于更新屏幕。
基于以上结构,对上一篇最后的代码,我们按照导入游戏模块、定义全局变量、定义游戏对象、定义游戏主循环四个模块了进行优化,其中定义游戏对象又进行了细分。
1.需要导入的游戏模块
import pygame
import sys
2.定义全局常量
分别为screen的size,目标区域的位置,目标区域的size,文本颜色,目标抵达状态。
BG_SIZE = (400, 500) # 背景尺寸
ON_TARGET = False # 初始化目标状态
TARGET_SIZE = (50, 50) # 目标区域大小
TARGET_POSITION = (300, 200) # 目标位置
TEXT_COLOR = (255, 0, 0) # 文本颜色
3.定义游戏对象
定义一个Game对象,并定义__init__、event_handler、start三个函数,分别完成所有对象的初始化、事件的监听与更新、游戏主循环。
下面详细介绍:
__init__主要完成游戏的初始化。包括窗口初始化、背景初始化、目标位置初始化、生成玩家实例、生成消息文本实例
代码如下:
>定义Game对象
class Game(object):# 游戏类def __init__(self):# 1.游戏主窗口self.screen = pygame.display.set_mode(BG_SIZE)self.image = pygame.image.load('./image/plane/background.png')self.rect = self.image.get_rect()self.stop_position = pygame.image.load('./image/driver/grass.jpg')self.stop_position = pygame.transform.scale(self.stop_position, TARGET_SIZE)self.stop_position_rect = self.stop_position.get_rect()self.stop_position_rect.topleft = TARGET_POSITIONself.hero = Car()self.label = Label()
在Game对象中继续定义event_handler函数。它的任务是使用pygame.event.get()方法监听事件,判断玩家是否点击了窗口的退出按钮,如果是则返回True。
def event_handler(self):# 定义事件捕获for event in pygame.event.get():if event.type == pygame.QUIT:return Truereturn False
在Game对象中定义start函数。它的任务是定义游戏主循环。包括设置循环和屏幕刷新速率、根据用户关闭窗口动作退出主循环、判断是否到达目标、捕获键盘动作、返回移动基数、刷新背景、目标、小车和文本对象、更新屏幕等。
代码如下:
def start(self):clock = pygame.time.Clock()while True:clock.tick(60)if self.event_handler():returnif self.hero.rect.topleft == TARGET_POSITION: # 判断汽车是否移动到目标位置ON_TARGET = Trueelse:ON_TARGET = Falsekeys = pygame.key.get_pressed()move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 获得水平移动基数,向右为正move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 获得垂直移动基数,向下为正self.hero.update(move_hori, move_vert)self.label.update(ON_TARGET)self.screen.blit(self.image, self.rect)self.screen.blit(self.stop_position, self.stop_position_rect)self.screen.blit(self.hero.image, self.hero.rect)self.screen.blit(self.label.image, self.label.image_rect)pygame.display.update()
>定义小车对象
定义了初始化和更新两个函数。
在__init__函数主要用于创建小车surface对象并缩放图片大小,设置小车移动速度。
在update函数主要用于更新小车的坐标位置。具体代码如下:
class Car(object):# 定义玩家对象def __init__(self):self.image = pygame.image.load('./image/driver/car1.png').convert_alpha()self.image = pygame.transform.scale(self.image, (50, 50))self.rect = self.image.get_rect()self.speed = 10def update(self, *args):self.rect.x += args[0] * self.speedself.rect.y += args[1] * self.speed
>定义文本对象
同样定义了初始化和更新两个函数。
在__init__函数主要用于创建生成系统字体对象、文本surface。
在update函数主要用于根据是否到达目标值,刷新文本信息。具体代码如下:
class Label(object):# 定义文本对象def __init__(self):self.font = pygame.font.SysFont('仿宋gb_2312', 25)self.image = self.font.render('go to the target', True, TEXT_COLOR)self.image_rect = self.image.get_rect()self.image_rect.topleft = (100, 100)def update(self, is_on_target):if is_on_target:text = 'well done'else:text = 'go to the target'self.image = self.font.render(text, True, TEXT_COLOR)self.image_rect = self.image.get_rect()self.image_rect.topleft = (100, 100)
4.定义游戏主程序
def main():pygame.init()Game().start()pygame.quit()if __name__ == '__main__':main()
二、动态效果实现
在游戏中动态效果主要有背景的变化、图像的变化、文本的变化和音乐音效等。以下举例总结一些实现以上动态效果的方法。
1.背景连续滚动
实例:高速飞车
背景连续滚动是通过两个拼接的背景上下移动实现的,如下图所示。
步骤一:制作Background对象
class Background(object):def __init__(self, is_alt):self.image = pygame.image.load('./image/driver/road.png').convert_alpha()self.image = pygame.transform.scale(self.image, BG_SIZE)self.speed = 5 # 设置屏幕移动速度self.rect = self.image.get_rect()if is_alt: # 背景初始化时,一个背景在上,一个背景在屏幕内self.rect.y = - self.rect.heightdef update(self):self.rect.y += self.speed # 在背景更新时,实现背景向下移动if self.rect.y >= self.rect.height: # 当背景刚好移除屏幕时,将背景重新放置到屏幕的上方self.rect.y = - self.rect.height
步骤二:在Game类中生成2个背景实例
self.road_1,self.road_2 = Background(True),Background(False)
Game类初始化的完整代码如下:
class Game(object):# 游戏类def __init__(self):# 1.游戏主窗口self.screen = pygame.display.set_mode(BG_SIZE)self.road_1,self.road_2 = Background(True),Background(False)self.speed = 5self.hero = Car() # 生成汽车实例self.hero.rect.midbottom = self.screen.get_rect().midbottom # 在初始化时,将汽车放在屏幕底部中间位置
步骤三:在游戏主循环中添加两个背景更新动作
self.road_1.update()self.road_2.update()self.screen.blit(self.road_1.image, self.road_1.rect)self.screen.blit(self.road_2.image, self.road_2.rect)
完整代码:
import pygame# 定义全局常量
BG_SIZE = (400, 500) # 背景尺寸class Game(object):# 游戏类def __init__(self):# 1.游戏主窗口self.screen = pygame.display.set_mode(BG_SIZE)self.road_1, self.road_2 = Background(True), Background(False)self.speed = 5self.hero = Car()self.hero.rect.midbottom = self.screen.get_rect().midbottomdef event_handler(self):# 定义事件捕获for event in pygame.event.get():if event.type == pygame.QUIT:return Truereturn Falsedef start(self):clock = pygame.time.Clock()while True:clock.tick(60)if self.event_handler():returnkeys = pygame.key.get_pressed()move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 获得水平移动基数,向右为正move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 获得垂直移动基数,向下为正self.road_1.update()self.road_2.update()self.hero.update(move_hori, move_vert)self.screen.blit(self.road_1.image, self.road_1.rect)self.screen.blit(self.road_2.image, self.road_2.rect)self.screen.blit(self.hero.image, self.hero.rect)pygame.display.update()class Background(object):def __init__(self, is_alt):self.image = pygame.image.load('./image/driver/road.png').convert_alpha()self.image = pygame.transform.scale(self.image, BG_SIZE)self.speed = 5self.rect = self.image.get_rect()if is_alt:self.rect.y = - self.rect.heightdef update(self):self.rect.y += self.speedif self.rect.y >= self.rect.height:self.rect.y = - self.rect.heightclass Car(object):# 定义玩家对象def __init__(self):self.image = pygame.image.load('./image/driver/car1.png').convert_alpha()self.image = pygame.transform.scale(self.image, (50, 50))self.rect = self.image.get_rect()self.speed = 10def update(self, *args):self.rect.x += args[0] * self.speedself.rect.y += args[1] * self.speedclass Label(object):# 定义文本对象def __init__(self):passdef update(self, is_on_target):passdef main():pygame.init()Game().start()pygame.quit()if __name__ == '__main__':main()
2.添加音乐音效
在高速飞车游戏添加四个音乐效果。背景音乐、汽车发动音效、汽车加速行驶音效、汽车喇叭音效。
pygame.mixer.music用以播放背景音乐,pygame.mixer.sound用以播放音效。两者在功能上略有差别。
mixer.Sound
pygame.mixer.Sound 载入音效文件
pygame.mixer.Sound.play 开始声音播放
pygame.mixer.Sound.stop 停止声音播放
pygame.mixer.Sound.fadeout 淡出后停止声音播放
pygame.mixer.Sound.set_volume 设置声音的播放音量
pygame.mixer.Sound.get_volume 获取播放音量
pygame.mixer.Sound.get_num_channels 计算声音播放了多少次
pygame.mixer.Sound.get_length 获取声音的长度
pygame.mixer.Sound.get_raw 返回声音样本的字符串副本
mixer.music
pygame.mixer.music.load 加载音乐文件
pygame.mixer.music.unload 卸载当前加载的音乐以释放资源
pygame.mixer.music.play 开始播放音乐
pygame.mixer.music.rewind 重新开始播放音乐
pygame.mixer.music.stop 停止音乐播放
pygame.mixer.music.pause 暂停音乐播放
pygame.mixer.music.unpause 恢复播放音乐
pygame.mixer.music.fadeout 淡出后停止音乐播放
pygame.mixer.music.set_volume 设置音乐音量
pygame.mixer.music.get_volume 获取音乐音量
pygame.mixer.music.get_busy 检查音乐是否正在播放
pygame.mixer.music.set_pos 设置播放位置
pygame.mixer.music.get_pos 获取音乐播放时间
pygame.mixer.music.queue 将声音文件排队以跟随当前
pygame.mixer.music.set_endevent 让音乐在播放停止時发送一个事件
pygame.mixer.music.get_endevent 获取在播放停止时发送的事件
准备工作
创建一个文件夹,将所有用到的音乐文件放到这个文件夹中。
创建Musicplayer对象
完成音乐音效初始化和设置音乐播放、音效播放、音效停止三个函数。
音效初始化主要是载入音乐、音效文件,为了便于音效文件的文件,可以使用字典进行管理。
代码如下:
class Musicplayer(object):def __init__(self):pygame.mixer.music.load('./wav/bgm.mp3') # 载入背景音乐文件self.sound_dict = {} # 生成一个空字典,用于管理音效对象。self.sound_dict['car_engine_start'] = pygame.mixer.Sound('./wav/car_engine_start.mp3') # 载入汽车启动音效self.sound_dict['car_speed_up'] = pygame.mixer.Sound('./wav/car_speed_up.wav') # 载入汽车加速行驶音效self.sound_dict['car_beep'] = pygame.mixer.Sound('./wav/car_beep.wav') # 载入汽车喇叭音效
- 背景音乐播放函数
def play_music(self):pygame.mixer.music.play(-1) # 当参数为-1时,将循环播放pygame.mixer.music.set_volume(0.2) # 设置播放音量,参数0-1.0之间,1为最大。
- 音效播放
为了灵活控制不同音效的播放,可将播放的音效名称作为参数传入。
def play_sound(self, wav_name):self.sound_dict[wav_name].play()
修改Game对象的start函数设置音乐
游戏开始后播放背景音乐,播放汽车引擎发动音效
def start(self):clock = pygame.time.Clock()self.music_player.play_music() # 播放背景音乐self.music_player.play_sound('car_engine_start') # 播放汽车发动音效speed = 0 # 设置速度初始值为0,目的是与汽车加速音效相配合
在当汽车任意方向移动基数不为0时,播放汽车加速音效,speed不断加速,最高速度不超过50,将speed作为背景的向下移动速度。
if keys[pygame.K_SPACE]:self.music_player.play_sound('car_beep')if move_hori != 0 or move_vert != 0:self.music_player.play_sound('car_speed_up')if speed > 50:speed = 50else:speed += 1else:speed = 0self.road_1.update(speed)self.road_2.update(speed)
修改Background背景对象代码
class Background(object):def __init__(self, is_alt):self.image = pygame.image.load('./image/driver/road.png').convert_alpha()self.image = pygame.transform.scale(self.image, BG_SIZE)self.rect = self.image.get_rect()if is_alt:self.rect.y = - self.rect.heightdef update(self,speed = 0):self.rect.y += speedif self.rect.y >= self.rect.height:self.rect.y = - self.rect.height
完整代码如下
import pygame
# 定义全局常量
BG_SIZE = (400, 500) # 背景尺寸class Game(object):# 游戏类def __init__(self):# 1.游戏主窗口self.screen = pygame.display.set_mode(BG_SIZE)self.road_1, self.road_2 = Background(True), Background(False)self.hero = Car()self.music_player = Musicplayer()self.hero.rect.midbottom = self.screen.get_rect().midbottomdef event_handler(self):# 定义事件捕获for event in pygame.event.get():if event.type == pygame.QUIT:return Truereturn Falsedef start(self):clock = pygame.time.Clock()self.music_player.play_music()self.music_player.play_sound('car_engine_start')speed = 0while True:clock.tick(60)if self.event_handler():returnkeys = pygame.key.get_pressed()move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 获得水平移动基数,向右为正move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 获得垂直移动基数,向下为正if keys[pygame.K_SPACE]:self.music_player.play_sound('car_beep')if move_hori != 0 or move_vert != 0:self.music_player.play_sound('car_speed_up')if speed > 50:speed = 50else:speed += 1else:speed = 0self.road_1.update(speed)self.road_2.update(speed)self.hero.update(move_hori, move_vert)self.screen.blit(self.road_1.image, self.road_1.rect)self.screen.blit(self.road_2.image, self.road_2.rect)self.screen.blit(self.hero.image, self.hero.rect)pygame.display.update()class Background(object):def __init__(self, is_alt):self.image = pygame.image.load('./image/driver/road.png').convert_alpha()self.image = pygame.transform.scale(self.image, BG_SIZE)self.rect = self.image.get_rect()if is_alt:self.rect.y = - self.rect.heightdef update(self,speed = 0):self.rect.y += speedif self.rect.y >= self.rect.height:self.rect.y = - self.rect.heightclass Musicplayer(object):def __init__(self):pygame.mixer.music.load('./wav/bgm.mp3')self.sound_dict = {}self.sound_dict['car_engine_start'] = pygame.mixer.Sound('./wav/car_engine_start.mp3')self.sound_dict['car_speed_up'] = pygame.mixer.Sound('./wav/car_speed_up.wav')self.sound_dict['car_beep'] = pygame.mixer.Sound('./wav/car_beep.wav')def play_music(self):pygame.mixer.music.play(-1)pygame.mixer.music.set_volume(0.2)def play_sound(self, wav_name):self.sound_dict[wav_name].play()class Car(object):# 定义玩家对象def __init__(self):self.image = pygame.image.load('./image/driver/car1.png').convert_alpha()self.image = pygame.transform.scale(self.image, (50, 50))self.rect = self.image.get_rect()self.speed = 10def update(self, *args):self.rect.x += args[0] * self.speedself.rect.y += args[1] * self.speedself.rect.x = 0 if self.rect.x <= 0 else self.rect.xself.rect.y = 0 if self.rect.y <= 0 else self.rect.yif self.rect.right > BG_SIZE[0]:self.rect.right = BG_SIZE[0]if self.rect.bottom > BG_SIZE[1]:self.rect.bottom = BG_SIZE[1]def main():pygame.init()Game().start()pygame.quit()if __name__ == '__main__':main()
3.动画效果
飞机在飞行时喷出的火焰会发生变化,子弹发射后会飞行一段距离,击中敌人后敌人会受伤甚至被摧毁。以上都属于动画效果。
实现动画效果主要有两种方式,一是图片的变换,二是图片的运动。
实例1:飞机飞行效果
飞机飞行火焰的变化属于图片的轮播效果。实现图片轮播有两种方式,一种是将动画所有帧组成一张长图,按照一定速度同一个方向循环前进,但同一时间只有一帧能被看到,就像坐地铁时看到的广告,视觉上就像是连续播放的视频。第二种将连续动画按关键帧分割成一张张图片,并按找一定频率在图片中依次切换,这和我们平时看动画片是类似的。
以下以第二种方法为例进行介绍。
该方法的操作步骤:
对象初始化
在对象初始化时,生成一张空列表,将图片Surface依次添加到列表中,并设置第一张图片为初始时显示的图片。
class Plane(object):# 定义玩家对象def __init__(self, rect):self.images = []self.now_frame = 0 # 初始图片的索引self.images.append(pygame.image.load('./image/plane/me1.png').convert_alpha())self.images.append(pygame.image.load('./image/plane/me2.png').convert_alpha())self.image = self.images[self.now_frame]self.rect = self.image.get_rect()self.speed = 10
修改游戏主循环代码
对图片切换的间隔进行设置,例如每10帧更换一次。
方法时,在循环中设置当前帧计数器frame_count,初始为0,利用与10取余数的方法,每次循环frame_count会+1,到第10次时归为0。最后将frame_count==0返回给对象的update函数。
def start(self):clock = pygame.time.Clock()frame_count = 0while True:clock.tick(40)if self.event_handler():returnframe_count = (frame_count + 1) % 10self.hero.update(frame_count==0, move_hori, move_vert)
设置对象更新函数
当对象update函数被调用时,先判断args[0]是否为真,即判断frame_count == 0 是否为真,如果为True则代表此次时过去了10帧,需切换图片;如果为false,则直接返回。
更新的方式是从头开始轮播图片,如果当前不是最后一张图片,则切换到下一张;如果是最后一张图片,则切换到第一张。
def update(self, *args):if not args[0]:returnif self.now_frame < range(len(self.images))[-1]:self.now_frame += 1self.image = self.images[self.now_frame]else:self.now_frame = range(len(self.images))[0]self.image = self.images[self.now_frame]
本篇主要内容如上,主要介绍了游戏代码的典型结构,总结了背景连续滚动、声音效果和图像动态效果的实现方法。下一篇将对Pygame的精灵和精灵组实现方法进行。
上例完整代码如下:
import pygame
import time
import os
# 定义全局常量
BG_SIZE = (400, 500) # 背景尺寸
INIT_RECT = pygame.Rect(200, 250, 60, 60)class Game(object):# 游戏类def __init__(self):# 1.游戏主窗口self.screen = pygame.display.set_mode(BG_SIZE)self.road_1, self.road_2 = Background(True), Background(False)self.hero = Plane(INIT_RECT)self.hero.rect.midbottom = self.screen.get_rect().midbottomdef event_handler(self):# 定义事件捕获for event in pygame.event.get():if event.type == pygame.QUIT:return Truereturn Falsedef start(self):clock = pygame.time.Clock()frame_count = 0while True:clock.tick(40)if self.event_handler():returnkeys = pygame.key.get_pressed()move_hori = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT] # 获得水平移动基数,向右为正move_vert = keys[pygame.K_DOWN] - keys[pygame.K_UP] # 获得垂直移动基数,向下为正self.road_1.update()self.road_2.update()frame_count = (frame_count + 1) % 10self.hero.update(frame_count == 0, move_hori, move_vert)self.screen.blit(self.road_1.image, self.road_1.rect)self.screen.blit(self.road_2.image, self.road_2.rect)self.screen.blit(self.hero.image, self.hero.rect)pygame.display.update()class Background(object):def __init__(self, is_alt):self.image = pygame.image.load('./image/plane/background.png').convert_alpha()self.image = pygame.transform.scale(self.image, BG_SIZE)self.rect = self.image.get_rect()if is_alt:self.rect.y = - self.rect.heightdef update(self,speed = 1):self.rect.y += speedif self.rect.y >= self.rect.height:self.rect.y = - self.rect.heightclass Plane(object):# 定义玩家对象def __init__(self, rect):self.images = []self.now_frame = 0self.images.append(pygame.image.load('./image/plane/me1.png').convert_alpha())self.images.append(pygame.image.load('./image/plane/me2.png').convert_alpha())self.image = self.images[self.now_frame]self.rect = self.image.get_rect()self.speed = 10def update(self, *args):if not args[0]:returnif self.now_frame < range(len(self.images))[-1]:self.now_frame += 1print(self.now_frame)self.image = self.images[self.now_frame]else:self.now_frame = range(len(self.images))[0]print(self.now_frame)self.image = self.images[self.now_frame]self.rect.x += args[1] * self.speedself.rect.y += args[2] * self.speedself.rect.x = 0 if self.rect.x <= 0 else self.rect.xself.rect.y = 0 if self.rect.y <= 0 else self.rect.yif self.rect.right > BG_SIZE[0]:self.rect.right = BG_SIZE[0]if self.rect.bottom > BG_SIZE[1]:self.rect.bottom = BG_SIZE[1]class Label(object):# 定义文本对象def __init__(self):passdef update(self, is_on_target):passdef main():pygame.init()Game().start()pygame.quit()
Pygame入门-游戏代码结构及背景轮播、声音音效及图像动态效果相关推荐
- 【每日一练】39—七夕节背景轮播图效果的实现
作者 | 杨小爱 写在前面 今天是七夕节,在这里,我先祝大家七夕节快乐,有情人终成眷属.我们节也要过,学习也要继续,因此,今天我们来实现一个漂亮的七夕幻灯轮播图效果,这个效果我个人觉得非常实用,如果你 ...
- Bootstrap搭建背景轮播的登录界面
Bootstrap搭建精美背景轮播的登录界面 博主经常需要开发项目,然而博主是个后端狗,一些常用的,比如登录界面什么的,老是找来找去麻烦,直接先写一个精美背景轮播的登录界面放着,以后好复用. 先上效果 ...
- python中的pygame弹球游戏代码_pygame弹球游戏
pygame弹球游戏 写的很简陋 pip install pygame 安装pygame模块 代码,复制运行即可 import pygame import random pygame.init() w ...
- python中的pygame弹球游戏代码_pygame实现弹球游戏
本文实例为大家分享了pygame实现弹球游戏的具体代码,供大家参考,具体内容如下 pygame弹球游戏 写的很简陋 pip install pygame 安装pygame模块 代码,复制运行即可 im ...
- php图片左右滚动代码怎么写,css图片滚动代码怎么写?轮播图横向滚动展示
在日常工作中网页上的轮播图展示必不可少,那么对于刚入门的小白而言本篇文章关于css图片滚动代码的介绍更是浅显易懂.希望本篇文章对大家有所帮助. css图片滚动代码示例具体如下: css图片滚动代码示例 ...
- MVC5+HTML5 背景轮播图
参考文章:https://www.gouji.org/?post=317 使用css+js实现背景图片轮播 废话不多说,代码: <style>th {text-align: center; ...
- java图片特效轮播代码_JQuery实现图片轮播效果
[实例演示] 1 2 3 4 用JQuery操作DOM确实很方便,并且JQuery提供了非常人性化的API应付我们的各种需求,其中选择器在此示例-"JQuery实现图片轮播效果"上 ...
- 自动图片轮播php源码,js图片自动轮播代码分享(js图片轮播)
1.利用图片width显示位置来播放图片,技术:.offsetWidth .aBtn[i].index = i .setInterval() .oUl[0].style.left = .onclic ...
- 导航栏保持居中并使用swiper作为轮播图进行背景轮播背景
如图: 1.首先使用swiper,需要到这个网址https://www.swiper.com.cn/demo/index.html选择你想使用的轮播样式,接下来引入一些文件,可以到这个网址参考api下 ...
最新文章
- 网易资深Java架构师:jdkjrejvm的区别和联系
- php Spreadsheet 导出,PhpSpreadsheet 导出Excel
- 《深入理解计算机系统》第七章 链接
- 给刚博士毕业的年轻学者9点建议,最后一条:抓紧结婚,生娃!
- nginx 重启和配置include的位置
- 14-----表单输入绑定
- C语言复变函数PPT,复变函数的孤立点及其应用.doc
- journalctl
- 数据结构 图的邻接表
- 我是凡尘最美的莲花-记再读仓央嘉措
- 小米摄像头 rtmp_如何使用外部摄像头进行Amazon Live
- 在Linux上搭建一个自己的网站
- Android背景虚化的PopupWindow 可指定虚化区域
- C++中时间记录的常用操作
- 体验 软考免费刷题 电脑板
- 找学习资料的网址/地方
- 电脑设备中PCI简易通讯控制器驱动显示黄色感叹号图标怎么办【申明:来源于网络】
- 产品经理的工作职责是什么,需要具备什么能力?
- linux上安装python、igraph源码包_windows环境安装python-igraph全过程
- vue显示文本过长,超出部分省略号显示,悬停提示全部