精华内容
下载资源
问答
  • 下面用纸筒做一个简单的小蝴蝶,做法很简单。制作过程:准备材料废纸筒、剪刀、胶、水彩笔,纸板。在纸筒上剪下五个圈圈剪完的样子见下图把里面粘贴修整一下,见下图白色纸板把一个小圆捏成下图形状,粘到纸板正中间...
    2b11004054066c5371a034e50dbda953.png

    幼儿园的手工,除了用卡纸做各种简单的小制作外,纸筒也是常用的手工材料。

    下面用纸筒做一个简单的小蝴蝶,做法很简单。

    d37bfcd46e66afa143817e36937a262a.png

    制作过程:

    准备材料

    废纸筒、剪刀、胶、水彩笔,纸板。

    79a8550c1a155f04d744d93b1da7c998.png

    在纸筒上剪下五个圈圈

    0ef893d031bc2f75b8056f1423e8129c.png

    剪完的样子见下图

    82384ec29b2677f4bb4edd8b1953afbf.png

    把里面粘贴修整一下,见下图

    f5d2469ab39ceade849bfd446091496d.png

    白色纸板

    f7918100dabf4dcf6784b80ceb286fbc.png

    把一个小圆捏成下图形状,粘到纸板正中间,见下图

    b13f10707f9e2a18afaddd5b849e74be.png

    图示位置粘上一个小圆圈

    8f64a2db432ed08084b20348d733c99a.png

    再粘上另一个小圆圈,当蝴蝶的两个翅膀,见下图

    49a9ee8fa3a0310876ae0b559803201d.png

    左边用相同的方法把另外两个小圆圈粘好,如下图所示

    10c33f77a2c54c8496ecfb42323e2c20.png

    再从纸筒上剪下两个小纸条,见下图

    3d49d9d0eb2c747c4aa0f35868ac8055.png

    在边缘图示位置涂胶,见下图

    3579c0742892ec8549d7587b45fa06c4.png

    把这两个小纸条分别粘到下图位置,当蝴蝶的触角

    一个小蝴蝶粘好了

    ddb836c413414d562b1c2ccdf44fe1cc.png

    注意在小圈底部涂胶时不太好涂,要小心细致些。

    也可以用水彩笔等颜料涂上颜色,也可以画上些花纹,大家可以随意发挥。

    b7151371229a28025d3d9d6caf2a1137.png

    这个小蝴蝶用的材料简单,做的方法也不难,只要细心些都能做好。

    快找个旧纸筒试试吧,做好了可以当手工作业。

    ——END——

    我喜欢手工,发的图文里都是自己做的小制作,多数是可以当孩子手工作业的简单小手工。

    喜欢就加关注,就能看到以前发的和以后发的了。

    展开全文
  • 下面用纸筒做一个简单的小蝴蝶,做法很简单。制作过程:准备材料废纸筒、剪刀、胶、水彩笔,纸板。在纸筒上剪下五个圈圈剪完的样子见下图把里面粘贴修整一下,见下图白色纸板把一个小圆捏成下图形状,粘到纸板正中间...
    7d7c3797b3937c6ece1df052af6ea77f.png

    幼儿园的手工,除了用卡纸做各种简单的小制作外,纸筒也是常用的手工材料。

    下面用纸筒做一个简单的小蝴蝶,做法很简单。

    ea131911ed739d110d6fe081f77fe24f.png

    制作过程:

    准备材料

    废纸筒、剪刀、胶、水彩笔,纸板。

    d47f55c5fad3cf1d74c092a0356b43c5.png

    在纸筒上剪下五个圈圈

    abd68617ad5c0a10194acc4781141ec1.png

    剪完的样子见下图

    59b04cef644c0fc3b669336cd5f92f63.png

    把里面粘贴修整一下,见下图

    15f22024d2a4915a0558fd69d3128bba.png

    白色纸板

    29be0a076ca59ea3cde7a00874f665ce.png

    把一个小圆捏成下图形状,粘到纸板正中间,见下图

    71f38c93223272d32b041bfbcbf66e34.png

    图示位置粘上一个小圆圈

    58ca1921816ce909ab10b10f8ab0fc97.png

    再粘上另一个小圆圈,当蝴蝶的两个翅膀,见下图

    5a7a03b4dcb03d7679c4d0fc8d9c3b8f.png

    左边用相同的方法把另外两个小圆圈粘好,如下图所示

    24bbd1b060371ceb87de6a73f787f461.png

    再从纸筒上剪下两个小纸条,见下图

    b2842fe7e6a65f19bd37cf936d159524.png

    在边缘图示位置涂胶,见下图

    72d564321e3cb3383d7e1a60f10eef70.png

    把这两个小纸条分别粘到下图位置,当蝴蝶的触角

    一个小蝴蝶粘好了

    375eca52ff73992be0bce9604ca69379.png

    注意在小圈底部涂胶时不太好涂,要小心细致些。

    也可以用水彩笔等颜料涂上颜色,也可以画上些花纹,大家可以随意发挥。

    34d2329a332352983268f0070e1f30e5.png

    这个小蝴蝶用的材料简单,做的方法也不难,只要细心些都能做好。

    快找个旧纸筒试试吧,做好了可以当手工作业。

    ——END——

    我喜欢手工,发的图文里都是自己做的小制作,多数是可以当孩子手工作业的简单小手工。

    喜欢就加关注,就能看到以前发的和以后发的了。

    展开全文
  • 我们使用PlayCanvas一个“掂球”的小游戏,在这个小游戏中玩家需要点击落下的足球使之停留在空中。 本教程包含如下主题: 1 场景(Scene)和层级(Hierarchy) 2 材质设置 3 游戏脚本 4 球体物理和输入 5 ...

    我们使用PlayCanvas做了一个“掂球”的小游戏,在这个小游戏中玩家需要点击落下的足球使之停留在空中。

    本教程包含如下主题:

    1 场景(Scene)和层级(Hierarchy)

    2 材质设置

    3 游戏脚本

    4 球体物理和输入

    5 声音和效果

    6 用户操作界面

    这不是一个手把手的教程,但我们将会讨论制作过程中的每一步,并解释他们组合起来是如何工作的。我们建议将游戏工程下载到您的个人账户下并且跟着做。


    第一部分:场景和层级

    PlayCanvas中的场景是用具有层级结构的不同实体Entity来描述的。每一个实体可以看作是应用程序中的一件东西,他们都有ID,名称和变换(transform)这几个属性。这里所谓的“变换”实际上就是三维空间中一个定义了位置、旋转和比例变换的矩阵。构造一个场景的过程,就是创建一些实体,并将其放在不同的层级结构中,正如编辑界面的左侧显示的树状结构一样。这种树状结构允许父节点影响子节点,即所有子节点继承了父节点的位置、旋转和缩放属性。同样的,当你禁用了一个父实体,他所有的子实体也就被禁用了。

    如下图所示,掂球游戏的场景中的层级结构共有7个顶级实体。


    摄像机实体(Camera Entity)

    程序运行后,屏幕上将显示与摄像机所对的视角相同的画面。这个游戏中,我们仅有一个固定的摄像机。

    定向光源实体(Directional Light Entity)

    3D模型需要光源照射才能显示出来。一个场景中同时使用的光源越多,则渲染场景所需的时间就越长。而这将会影响到你的游戏的帧率。因此,你不应该让过多的光源同时生效。这个游戏中,我们只使用了一个固定的定向光源。

    足球实体

    足球是游戏场景中主要的动态实体。足球实体包含三个与之绑定的组件。选择足球实体后可在编辑器右侧的属性面板中看到这些组件。他们是:

    声音组件:

    声音组件可以播放声音文件。每个声音组件都有一组插槽,每个插槽可以指定一个声音文件。你可以选择声音播放的设置,如音量或者快慢。足球仅有一个插槽,它指定了当球弹起时的声音文件。

    模型组件:

    模型组件用来为实体附着三维模型资源。当一个实体的模型组件生效时,其三维模型就会在实体所在的三维空间渲染。这里我们附着了一个足球的模型。

    脚本组件:

    脚本组件用来为实体绑定javascript脚本。每个实体都会创建一个javascript文件中定义的脚本实例,这样你就可以自定义实体的行为。更多关于脚本的细节,我们在第三部分介绍。

    背景

    背景实体拥有另一种模型组件。这次,他为游戏提供了一个背景的背板。实际上,背景是一个应用了一种材质的平板实体,这种材质的表面使用了足球场的纹理贴图。这里的材质使用了发光的选项,这样背景看起来才足够明亮,而且不会被光源和足球遮挡。

    特效实体

    特效实体是一种粒子效果,它在足球弹起时展现出来。细节在第四章介绍。

    音频

    音频实体绑定了更多的声音组件。它用来播放音乐和游戏结束时的声音。

    用户操作界面(UI)

    UI实体是多个其他实体的父实体,对应游戏的每个操作界面。第五部分详细介绍。







    展开全文
  • 本文介绍一个简单的编译时注解项目的制作过程。项目地址:github.com/wuapnjie/Ea…,我选择了Android API 25的新功能App Shortcut,使用注解来快速制作一个Shortcut。为什么选择Shortcut呢,因为我觉得很多应用只...

    最近学习了编译时注解框架的制作,写了一个小项目。阅读本文前希望大家有关于注解的相关知识。

    本文介绍一个简单的编译时注解小项目的制作过程。项目地址:github.com/wuapnjie/Ea…,我选择了Android API 25的新功能App Shortcut,使用注解来快速制作一个Shortcut。为什么选择Shortcut呢,因为我觉得很多应用只需要使用到静态加载的Shortcut就好了,而对于静态加载的Shortcut要写一个比较长的Xml配置文件,我觉得特别麻烦。

    先来看一下我们实现的效果。

    Java代码

    @ShortcutApplication
    @AppShortcut(resId = R.mipmap.ic_launcher,
            description = "First Shortcut")
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
              //API 调用
            ShortcutCreator.create(this);
        }
    }复制代码

    效果图:

    APT简单介绍

    APT,全称Annotation Processing Tool,它用来在编译时处理源代码中的注解信息,我们可以根据注解来生成一些Java文件,防止编写冗余的代码,比如ButterKnife项目,正是利用了APT工具,帮助我们少写了许多重复冗余的代码。本文中,通过注解来少写一些配置文件。

    项目结构

    本项目共分为4个Module,两个Java Library module,一个Android Library module和用于演示的Android Application module

    • easyshortcuts-api:Android Library module,用于供客户端的调用。
    • easyshortcuts-annotation:Java Library module,用于提供注解类。
    • easyshortcuts-compiler:Java Library module,用于编写处理注解并生成相关Processor的注解处理模块
    • 还有一个普通的应用模块

    其中easyshortcuts-apieasyshortcuts-compiler模块依赖easyshortcuts-annotation模块。

    注解模块的编写

    搭好项目后,第一个动手编写的应该是easyshortcuts-annotation模块,通过查看Android Developer官网上的Shortcut介绍后,发现通过Java代码,我们只可以通过ShortcutManager生成动态Shortcut,生成一个动态Shortcut的代码简单重复,每个Shortcut需要一个String类型的Id,图标的ResId,显示的文字,以及一个Intent的Action字段。

    @Retention(RetentionPolicy.SOURCE)
    @Target(ElementType.TYPE)
    public @interface AppShortcut {
        int resId();
    
        int rank() default 1;
    
        String description();
    
        String action() default Define.SHORTCUT_ACTION;
    }复制代码

    之后我用注解所在类的类名称作为Shortcut的Id。

    这里,我还建了一个注解ShortcutApplication,是一个没有任何字段的注解,这个注解应该用在用户第一个打开的Activity。因为这里使用了动态加载的方式创建Shortcut,所以必须要执行代码才可以生成Shortcut,所以应该在Launcher Activity使用。

    注解处理器的编写

    确定了注解后,我们要编写相应的注解处理器来处理注解并生成相应的Java文件,这里easyshortcuts-compiler依赖了google的auto-service库和square的javapoet库。

    compile "com.squareup:javapoet:$rootProject.ext.squareJavaPoetVersion"
    compile "com.google.auto.service:auto-service:$rootProject.ext.googleAutoServiceVersion"复制代码

    其中auto-service库可以很方便的帮助我们生成配置文件,javapoet库可以很方便的帮助我们自动生成Java代码。

    新建一个继承自AbstractProcessorShortcutProcessor,下面是一个基本的Processor应有的要素,我们的重点在与process()方法。

    //帮助我们生成配置文件的注解
    @AutoService(Processor.class)
    public class ShortcutsProcessor extends AbstractProcessor {
        private Filer mFiler;
        private Elements mElementUtils;
        private Messager mMessager;
        ……
    
        //在初始化时获得相关帮助对象
        @Override
        public synchronized void init(ProcessingEnvironment processingEnvironment) {
            super.init(processingEnvironment);
            mFiler = processingEnvironment.getFiler();
            mElementUtils = processingEnvironment.getElementUtils();
            mMessager = processingEnvironment.getMessager();
        }
    
          //根据相应的注解进行处理
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
               ……
            return true;
        }
    
          //返回要支持的注解
        @Override
        public Set<String> getSupportedAnnotationTypes() {
            Set<String> types = new LinkedHashSet<>();
            types.add(ShortcutApplication.class.getCanonicalName());
            types.add(AppShortcut.class.getCanonicalName());
            return types;
        }
    
          //返回Java语言的支持版本
        @Override
        public SourceVersion getSupportedSourceVersion() {
            return SourceVersion.latestSupported();
        }
    
        //辅助的日志打印方法
        private void printNote(String message) {
            mMessager.printMessage(Diagnostic.Kind.NOTE, message);
        }
    
        private void printError(String error) {
            mMessager.printMessage(Diagnostic.Kind.NOTE, error);
        }
    }复制代码

    process()方法中,要获取所有有相关注解的Element,并获取每个注解中附带的字段,最后根据这些信息生成一个Java文件。为了更好的获取储存这些字段,我建立了一个model类Shortcut

    public class Shortcut {
        private int mResId;
        private int mRank;
        private String mDescription;
        private String mAction;
        private TypeElement mTypeElement;
    
        public Shortcut(Element element) {
            mTypeElement = (TypeElement) element;
            AppShortcut appShortcut = mTypeElement.getAnnotation(AppShortcut.class);
            mResId = appShortcut.resId();
            mRank = appShortcut.rank();
            mDescription = appShortcut.description();
            mAction = appShortcut.action();
        }
    
          //相关的getXXX()方法
          ……
    
    }复制代码

    之后在process()方法中遍历所有带有相关注解的Element,并生成model对象

    for (Element element : roundEnvironment.getElementsAnnotatedWith(AppShortcut.class)) {
         //检查注解所标注的元素是否为我们需要
         if (!isValid(element)) {
             return false;
         }
         //解析这个element并生成相应的Shortcut对象
         parseShortcut(element);
    }复制代码

    最后根据所有Shortcut对象生成Java文件

    mShortcutClass.generateCode().writeTo(mFiler);复制代码

    生成代码我使用Javapoet,可以很方便的生成代码,以下代码通过查看Javapoet的README就可以很快理解。

    public JavaFile generateCode() {
            MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("create")
                    .addModifiers(Modifier.PUBLIC)
                    .addAnnotation(Override.class)
                    .addParameter(CONTEXT, "context")
                    .addStatement("$T shortcutManager = context.getSystemService($T.class)", SHORTCUT_MANAGER, SHORTCUT_MANAGER)
                    .addStatement("$T.Builder builder",SHORTCUT_INFO)
                    .addStatement("$T intent",INTENT);
    
            for (Shortcut shortcut : mShortcuts) {
                methodBuilder.
                        addStatement("builder = new $T.Builder(context,$S)", SHORTCUT_INFO, shortcut.getTypeElement().getSimpleName().toString())
                        .addStatement("intent = new $T(context, $T.class)", INTENT, TypeName.get(shortcut.getTypeElement().asType()))
                        .addStatement("intent.setAction($S)", shortcut.getAction())
                        .addStatement("builder.setIntent(intent)")
                        .addStatement("builder.setShortLabel($S)", shortcut.getDescription())
                        .addStatement("builder.setLongLabel($S)", shortcut.getDescription())
                        .addStatement("builder.setRank($L)", shortcut.getRank())
                        .addStatement("builder.setIcon($T.createWithResource(context, $L))", ICON, shortcut.getResId())
                        .addStatement("shortcutManager.addDynamicShortcuts(singletonList(builder.build()))");
            }
    
            TypeSpec shortcutClass = TypeSpec.classBuilder(mTypeElement.getSimpleName() + SUFFIX)
                    .addModifiers(Modifier.PUBLIC)
                    .addSuperinterface(CREATOR)
                    .addMethod(methodBuilder.build())
                    .build();
    
            String packageName = mElementUtils.getPackageOf(mTypeElement).getQualifiedName().toString();
    
            return JavaFile
                    .builder(packageName, shortcutClass)
                    .addStaticImport(Collections.class, "singletonList")
                    .build();
    }复制代码

    提供调用接口

    写完了注解的解释器后,我们每次编译都生成了一个Java类文件,但是我们并没有调用它,我们要提供一个接口来调用,本项目中提供了这样一个静态方法

    ShortcutCreator.create(this);复制代码
    public class ShortcutCreator {
        public static void create(Context context) {
            try {
                Class<?> targetClass = context.getClass();
                Class<?> creatorClass = Class.forName(targetClass.getName() + "$$Shortcut");
                Creator creator = (Creator) creatorClass.newInstance();
                creator.create(context);
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }复制代码

    由于我们利用APT自动生成的Java类的类名称是知道的且提供了默认的无参数构造器,所以我们很容易生成一个对象,并调用其相关方法来生成相应的Shortcut。

    总结

    编译时注解可以大大加快我们的开发效率,希望大家可以多制作一些编译时注解的库来造福广大开发者,让大家少些许多简单重复的代码。最后附上源码地址:github.com/wuapnjie/Ea…,希望对大家有所帮助。

    展开全文
  • 最近在视频里面介绍了如何做一个简单的小故事,由于有些内容比较重复,不想在视频里面全部讲一遍,所以专门写篇文章把整个制作过程写清楚吧。一般制作一个小故事我们都分三个步骤:编写剧本收集素材开始编程在...
  • 前言 /程序从17年上线到现在已经构造了新开发环境和开发者生态,现在已经有超过150万开发者加入到开发,程序应用数量超过100万,覆盖200多行业。虽然开发难度较app减少了很多,但是对于没有编程知识人来...
  • 制作一个简单的linux

    2013-03-30 17:50:33
    我这里是借助宿主机一个简单的Linux,我们只要知道一个Linux启动过程需要什么,这里制作就简单的多了。不过没有基础的也没关系,我写的很详细,没有基础的看了我写的步骤只要细心也是会出来的,我这里的小...
  • 看了篇挺实用makefile制作教程,由于原文是英文,所以了下简单翻译,供大家参考,不准确地方请多...Makefile是组织代码编译的一个简单方法。这个教程并不打算深入分析make用法,而旨在让初学者能在中项目
  • 所以打算用python做一个小工具解放我身心。 其实我不做后端技术工作好多年了,而且对python也没系统学习过,只停留在知道有这么个语言工具,简单易用、功能强大。所以这次学习了很多大神...
  • 微信小程序,热门中的热门,跟着微信,...以乔拓云模板来说,里面覆盖各行各业的小程序模板,多不甚数,且都是高级设计师静心设计的,找到一个适合自己的,再用自己的素材丰富模板,岂不美哉。 工具、材料: Huaw
  • 本文主要讲述了使用nodejs制作一个简单的文章发布系统,使用mongodb数据库,时间比较紧,功能的也比较简单,仅仅是增删改查,外加附近上传,有相同需求的小伙伴可以参考下
  • 今天编给大家介绍一个python制作界面库Tkinter,虽然出来效果没有Pygame和PyQT5那么绚酷,但程序、搞个前后端交互登录界面基本已经够用。这里基于Tkinter基本界面,编融合了一个密码生成业务...
  • 2.做一个简单的QT界面 如何创建一个QT工程 1.直接点击新建项目里面的application 2. 3.不能有中文名字 4.选择qwidget 5…pro文件里有哪些东西呢 6.Forms中的.ui文件 7.找到label 8.调整字体大小 9.居中对齐 ...
  • 怎么用dreamweaver软件做一个简单的垂直导航呢,其实我们要学会一些简单的代码,慢慢的去练习,孰能生巧,下面编就为大家详细介绍一下,不会的朋友可以参考本文,来看看吧
  • 前言 /程序从17年上线到现在已经构造了新开发环境和开发者生态,现在已经有超过150万开发者加入到开发,程序应用数量超过100万,覆盖200多行业。虽然开发难度较app减少了很多,但是对于没有编程知识人来...
  • 在学习react的道路上一直在摸索,除了阅读了阮一峰老师写的关于react的知识点之外,还学习搭建了一个简单的框架,作为巩固近端时间学习的一个简单的方法。(学习搭建框架的这篇教程并非属于笔者所创...
  • 1、新建一个Windows窗口程序2、调整窗口大小并画上一些组件,如图。3、将第二个编辑框输入方式设置为密码输入。4、复制下面代码,然后双击按钮,再粘贴上去。==============================================.版本 2....
  • 首先,我使用这个办法有一个小缺点,就是会占用一个cartridge(在online版本中挺珍贵资源啊),但这样我可以将一些我们公共代码全部抽取出来放进去,当我们需要建立另外一个gear并需要使用相同模块时候,...
  • 学canvas学了有一个多礼拜了,觉得canvas真心好玩。学canvas的人想法估计都跟我差不多,抱着写游戏的态度去学canvas的。所以运动学啊、碰撞检测啊、一些简单的算法神马的是基础啊。以前没过游戏的我学起来还真心...
  • 引言这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来发现打地鼠这...
  • 下面编就为大家带来一篇python3使用pyqt5制作一个简单浏览器实例。编觉得挺不错,现在就分享给大家,也给大家个参考。一起跟随编过来看看吧
  • 一、电子印章制作1、圆圈制作首先我们在Excel中点击【插入】——【形状】——【椭圆】,按住【Shift键】画一个正圆,然后我们点击【填充】——【无填充】,【轮廓】——【红色】,选择4.5磅...
  • 编写了一个简单的游戏”,就叫它游戏吧,只有一个操作,可以实现方块的移动 import sys,pygame pygame.init() #窗口初始化 size=width,height=600,600 screen=pygame.display.set_mode(size) #...
  • Python制作一个简单的GUI-【上篇】

    万次阅读 多人点赞 2018-11-13 18:48:36
    Python简单GUI1 学习初衷2 配置环境2.1 所用工具说明2.2 配置步骤3 创建一个简单的GUI小程序3.1 写一个简单的小算法(.py文件)3.2 GUI界面的制作3.21 一个简单的GUI3.22 .ui转为.py文件3.23 在pycharm中展示自己...
  • PHP是一款功能强大的后端编程软件,我们在学习PHP的过程中要经过很多实际的战斗,现在让我们做一个日历来巩固PHP的基础,今天爱站技术频道编为大家整理了教你如何制作一个简单的PHP日历,希望能帮到大家。...
  • 今天编给大家介绍一个python制作界面库Tkinter,虽然出来效果没有Pygame和PyQT5那么绚酷,但程序、搞个前后端交互登录界面基本已经够用。这里基于Tkinter基本界面,编融合了一个密码生成业务...
  • 多年来由于始终不敢相信2G+1M的阿里云服务器的性能,一直想要自己尝试做一个简单的HTTP安全模块,防止好事者通过浏览器或者程序使用http访问刷我的服务器,恰逢今日有空,打算在原本的一个自己开发的..
  • 这篇文章主要为大家详细介绍了简单python后台管理程序的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下、作业需求二、流程图三、源码与具体思路import shutilimport osimport sysUSER_LOGIN = {'is_...
  • java中使用fx制作一个简单的时钟发布时间:2020-11-16 14:23:15来源:亿速云阅读:76作者:Leah这篇文章将为大家详细讲解有关java中使用fx制作一个简单的时钟,文章内容质量较高,因此编分享给大家个参考,希望...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,809
精华内容 1,123
关键字:

做一个简单的小制作