• 小尝试一下 cocos2d


    好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下。小结一下了解到的情况。

    基本概念

    首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 pyglet 达到你想要的效果。但是,没必要重复造轮子。

    cocos2d 的基本概念包括了 director、scene、layer。框架的作者认为,写游戏和排练电影动画片差不多。director 呢就是导演的意思,scene 就是场景,layer 就是层次。对此,我们可以简单理解为,一个游戏有且只有一个导演(director),然后呢,这个游戏可以有多个场景(scene),比如 level1、level2、level3 等等。每个 scene 呢,是可以分为很多个层(layer)“布景”的,白色背景墙是一层,移动的路人是一层,我们的主角是一层。

    scene 由很多个 layer 组成。

    director 控制 scene 的顺序,以及 show 或者 hide。

    我们可以添加一个可以执行各种动作的主角 sprite;事实上,文档的另一部分中,也把它们叫做 actor。

    或者一段文字说明 label。

    或者是一个菜单 menu。

    还有,鼠标和键盘都可以直接使用 pyglet 的模块。(cocos.layer can automatically listen to director.window events: in your layer subclass set the is_event_handler class member to True and cocos will take care.)

    当然,有这三样,就可以写很多游戏了。

    我的实践

    下面是一个简单实践,在 cocos2d 自带的 samples 基础上改的。程序的第一幕,是一个小人,在屏幕上出现,并旋转;转到下一幕的条件是按键 Enter。当按键 Enter 按下时,director 开始放映第二幕——第二幕只有一层,着一层的内容在 HelloWorld() 中有定义。

    from __future__ import division, print_function, unicode_literals
    
    import sys
    import os
    
    sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
    
    import cocos
    from cocos.actions import *
    
    from pyglet.window import key
    
    class HelloSprite(cocos.layer.ColorLayer):
    
        is_event_handler = True
    
        def __init__(self):
    
            super(HelloSprite, self).__init__(64, 64, 224, 255)
    
            sprite = cocos.sprite.Sprite('grossinis_sister2.png')
    
            sprite.position = 320, 240
    
            sprite.scale = 2
    
            self.add(sprite)
    
            scale = ScaleBy(3, duration=2)
    
            sprite.do(Repeat(scale + Reverse(scale)))
    
        def on_key_release(self, keys, mod):
    
            # ENTER: replace scene
            if keys == key.ENTER:
                cocos.director.director.replace(cocos.scene.Scene(HelloWorld()))
                return True
    
    class HelloWorld(cocos.layer.Layer):
    
        def __init__(self):
            super(HelloWorld, self).__init__()
    
            label = cocos.text.Label('Hello, Cocos!',
                                     font_size=32,
                                     anchor_x='center', anchor_y='center')
    
            label.position = 320, 240
            self.add(label)
    
    
    if __name__ == "__main__":
        cocos.director.director.init()
    
        hello_layer = HelloSprite()
    
        hello_layer.do(RotateBy(360, duration = 10))
    
        first_scene = cocos.scene.Scene(hello_layer)
    
        cocos.director.director.run(first_scene)
  • 相关阅读:
    解决url传递过程中加号变空格的问题<转>
    windows下CEF3的关闭流程《转》
    mfc封装cef浏览器 关闭整个窗口程序得时候又重启mfc 应用的程序
    雷神免费资源
    LCA的 RMQ解法模版
    最新的js焦点图库
    whereis+whatis+man
    Anroid 手机助手 详细解析 概述(二)
    <c:forEach varStatus="status">中 varStatus的属性简介
    JBoss 系列四十九:JBoss 7/WildFly 中端口使用列表
  • 原文地址:https://www.cnblogs.com/pied/p/5660809.html
Copyright © 2020-2023  润新知