存档

2013年12月 的存档

三种被击效果

2013年12月31日 没有评论

// 闪烁
this.runAction(cc.Blink.create(0.01,1));

// shake震动
var move = cc.MoveBy.create(0.05, cc._p(8, 8));
var move_back = move.reverse();
var move_seq = cc.Sequence.create(move, move_back);
var move_rep = cc.RepeatForever.create(move_seq);
this.runAction(move_rep);

 

// 变色
var tint = cc.TintBy.create(0.05, -255, 0, 0);
var tint_back = tint.reverse();
var move_seq = cc.Sequence.create(tint, tint_back);
this.runAction(move_seq);

分类: cocos2d 标签:

Win7 + VirtualBox 安装 MacOS X 10.9 Mavericks 操作步骤

2013年12月28日 没有评论

今天试着用 Win7 + VirtualBox 4.3 + MacOSx 10.6 + hdiutil + Mavericks.app.dmg 纯手工制作用于 VirtualBox 虚拟机安装的 MacOSx 10.9 Mavericks ISO 安装盘镜像文件,本文中未使用github上那个基于 ruby 的 InstallESD 制作工具,也未用变色龙等启动工具,就只用到下载的
Mavericks.app.dmg 安装包、hdiutil 和几个 kexts 等核心文件来制作虚拟机安装盘 ISO/DMG 镜像。

由于纯手工安装 mavericks 的过程相当折腾,没有一两斤耐心,估计很难坚持到最后。不过,这一通折腾下来,相信自己对 MacOSX 系统的了解一定比只用鼠标乱戳更深入一些。

为了理清思路,折腾过程被人为分成了零~五共六个阶段。另外注意:试验电脑为联想 Thinkpad (Intel 芯片),家里没有基于 AMD 芯片的电脑,所以本文中操作步骤还没有在 AMD 电脑上作测试,结果亦未知。

下图为安装后虚拟机截屏:

Win7 + VirtualBox 安装 MacOS X 10.9 Mavericks 操作步骤


## 第零阶段:准备工作

首先将从 apple.com 或一些云网盘下载得到的 Mavericks 安装包文件 mavericks.app.dmg (约5GB) 放在一个 Win7 目录中(假设为 F:/downloads),不必将其复制进到 MacOSX 虚拟机中,以免使虚拟机 VDI 占用过大磁盘空间;

将此目录在 Win7 中共享出来,权限设置为当前用户拥有“读写”权限,稍后可以在 MacOSX 中以当前用户的身份连接到该共享目录;然后打开 VirtualBox,并启动 MacOSX 10.6,连接到这个 Win7 共享目录;具体方法是在 Finder 中选择“前往 – 连接到服务器”,输入 Win7 系统 IP 或主机名称,象这样:smb://t400s
或 smb://192.168.1.13,然后提示输入你在 Win7 中的登录帐户和密码;连接共享目录成功后,你的 Win7 目录就会出现在 /Volumes 目录下面,根据上面假设应该为:/Volumes/downloads

注意:要想 MacOSX 成功连接 Win7 共享目录,除了在 Win7 中正确设置共享帐户/权限等,还必须在 [MacOSX 控制面板/共享] 中勾选 [文件共享] 选项;在 Win7 中设置共享时,记住一定要勾选中“写”权限,因为下面命令会利用宿主机器的硬盘空间,而不必复制到虚拟机VDI中,前面说了,是为了避免虚拟机 VDI 文件搞的过大。

还有一点切记:在 MacOSx 中操作这个共享目录过程中,千万不要到 Win7 中再对这个共享目录作任何操作,哪怕是浏览都不可,否则极易导致 Win7 + VirtualBox 4.x 访问该共享目录出错,并且此问题似乎来自 netbios 核心驱动程序,挂了就不可修复,重启 VM 不管用,除非重启 Win7 再来。

下面假设挂载 Win7 共享目录一切顺利过关,然后进入该目录,下面所有命令均以此为当前目录;

# cd /Volumes/downloads

# ls -trlF (列一下目录看是否正常)

注意:当前目录 /Volumes/downloads 所在磁盘要留足够空间,最好留够20GB空闲磁盘空间,下面操作中涉及的 dmg/iso 文件都是尺寸在 6GB 左右的大块头儿。


## 第一阶段:初步制作 mavericks.sparseimage 启动盘镜像


挂载 MacOSX 10.9 下载包 mavericks.app.dmg 到 MacOSX 虚拟机的文件系统;

# hdiutil attach ./mavericks.app.dmg -noverify -nobrowse -mountpoint /Volumes/app

再挂载 mavericks.app.dmg 内部的 InstallESD.dmg (所在目录:/Volumes/app/Install/ OS/ X/ Mavericks.app/Contents/SharedSupport/)

# hdiutil attach /Volumes/app/Install/ OS/ X/ Mavericks.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/iesd

然后将 InstallESD.dmg 中的 BaseSystem.dmg 转换成 UDSP 格式的 dmg,大概2GB左右,耗时约5分钟;

# hdiutil convert /Volumes/iesd/BaseSystem.dmg -format UDSP -o ./mav.sparseimage

将转换得到的 mav.spareimage 空间扩至 8GB,以便稍后添加 packages 等内容;

# hdiutil resize -size 8g ./mav.sparseimage

再将转换得到的 mav.spareimage 挂载到文件系统,以便复制 packages 包文件进去,并对其内容进行适当调整;

# hdiutil attach ./mav.sparseimage -noverify -nobrowse -mountpoint /Volumes/mav

先删除 /Volumes/mav/System/Installation/Packages 文件,这只是一个符号连接,直接删除,稍后会复制进真正的 Packages 内容;

# rm /Volumes/mav/System/Installation/Packages

复制进真正的 Packages 内容,大概需要10多分钟;

# cp -rp /Volumes/iesd/Packages /Volumes/mav/System/Installation/

复制完成后,这个 mav.sparseimage 大概就超过5GB了,为了制作 ISO,需调整一下其尺寸;

#
hdiutil detach /Volumes/mav
(调整尺寸前必须先卸载 DMG,否则会提示资源暂时不可用)

# hdiutil resize -limits ./mav.sparseimage (先查询一下最小尺寸)

这个命令会显示出三个数字,象这样:Num1 Num2 Num3,这里只需要记下第一个数字 Num1,然后运行下面命令;

# hdiutil resize -size Num1b ./mav.sparseimage  (其中:将Num1换成上面显示的第一个数字,注意后面加一个小写‘b’字母,其他照写)

完成以上步骤,基本就可以转换成 ISO 安装盘了,可用来安装到 macbook,但在非 mac 硬件或虚拟机中还无法使用;


## 第二阶段:调整驱动程序和核心模块

以下步骤将调整这个安装包内容,为了使其能安装到非 mac 硬件或虚拟机中;针对不同硬件,以下步骤全盘照搬也许不能成功启动/安装,请根据硬件情况作调整;

首先需要准备一些第三方核心和驱动程序文件,可从网络上下载;我是从这里下载的:http://www.iferrari.nl/downloads/install109.zip 其中包含有 mach_kernel, kexts 等文件,下面步骤中主要用到其中的 mach_kernel 和 kexts 驱动程序文件。

由于第一阶段中,在调整 DMG 尺寸时将其从文件系统卸载了,现在我们需要将其重新挂载到文件系统,以便进行修改;

# hdiutil attach ./mav.sparseimage -noverify -nobrowse -mountpoint /Volumes/mav

挂载成功后,将 mach_kernel 文件复制到 /Volumes/mav 中,即安装盘镜像 DMG 文件的根目录中;

# cp -rp ./Install109/Kernel/mach_kernel /Volumes/mav

再将以下三个驱动程序复制到安装包 Extensions 目录中;

ElliottForceLegacyRTC.kext

FakeSMC.kext

NullCPUPowerManagement.kext

# cp -rp ./Install109/Kexts/*.kext /Volumes/mav/System/Library/Extensions

# chmod -R 0755 /Volumes/mav/System/Library/Extensions (可能需要设置一下目录/文件属性)

为了方便后续操作,除了将 kexts 驱动程序复制到 /System/Library/Extensions 目录中,我们还可以在此 ISO 安装盘中创建一个 /Backup 目录,用于保存这些第三方驱动和工具软件,稍后会用到;

# mkdir /Volumes/mav/Backup

# cp -rp ./Install109/* /Volumes/mav/Backup

做完这一步,基本就可以转换生成 ISO 用于虚拟机中启动安装了。网上还看到有一些教程,包括改动 OSInstall.pkg 等内容,但那种情况似乎是要求在同一块硬盘上同时安装多个系统 windows / macosx。若只安装于 VirtualBox 似乎没必要折腾它。

这里还考虑到一个具体情况,Mavericks 安装要求电脑具备至少2GiB内存,而目前一般电脑多配置4GB内存,运行 Win7 + VirtualBox + MacOSX 比较拮据;若为虚拟机分配 2GB 内存,宿主 Win7 系统运行起来就显得有点力不从心了。其实 Mavericks 安装程序有 1GB 内存就基本可以运行了,不知为何 Mavericks 安装程序默认要求至少
2GB 内存;考虑到这种情况,为了减少安装时这个内存最小需求,还得动手在上面安装包中改一处设置;当然,如果电脑中内存不是问题就不必要改这个设置了,直接往下跳过这几步即可。为了改这个2GB设置,有点兴师动众,可能需要安装 XCode,需要利用其中一个开发工具:Flat package editor;首先将 /Volumes/mav/System/Installation/Packages/OSInstall.mpkg 复制到桌面或其他某个目录;运行 Flat package editor:

# open /Developer/Utilties/PackageEditor.app (此工具深藏在 XCode 中)

再在该软件中通过菜单打开 Flat package editor,载入复制出来的 OSInstall.mpkg 文件,将其中的 distribution 文件拖出来放到桌面,再用文本编辑器修改其中这一行:

minRam=2048  (改为 1024,表示只要多于1GB内存就能运行 Mavericks 安装程序了)

改好保存,再将其拖回放入 OSInstall.mpkg 包中,并把其中原版 distribution 文件删除,然后将此 OSInstall.mpkg 包复制覆盖到 mav.sparseimage 包的相应目录中;

# cp ~/Desktop/OSInstall.mpkg /Volumes/mav/System/Installation/Packages/

# ls -trlF /Volumes/mav/System/Installation/Packages (确认一下是否更新成功)

至此,安装包制作的准备工作基本就绪,接下来就是发布命令,转换生成 iso 或 dmg 启动盘镜像,此转换过程大约耗时18分;

# hdiutil convert ./mav.sparseimage -format UDTO -o ./mav  (由此生成 ./mav.cdr 改名为 ./mav.iso 即可)

或者,

# hdiutil convert ./mav.sparseimage -format UDRO -o ./mav  (这将生成 ./mav.dmg 包)

完成以上步骤,就得到一个 6GB 大小的 ISO 或 DMG 文件;这时,可以将当前运行的虚拟机关闭,如果内存不足以再多开一个虚拟机同时运行的话;

如果不关闭此虚拟机进行后续操作,则最好及时将上面挂载的 DMG 和共享目录全部卸载,如下:

# hdiutil detach /Volumes/mav

# hdiutil detach /Volumes/iesd

# hdiutil detach /Volumes/app (iesd, app 这两项卸载顺序不要弄反)

# hdiutil detach /Volumes/downloads (安全卸载共享目录)


## 第三阶段:VirtualBox 中安装 Mavericks

首先在 VirtualBox 4.3.x 中创建一个 Mavericks x64 虚拟机项目,多数默认参数即可,除了以下几项:

Memory 内存 最好 1500MB 以上
VDI 硬盘 加大到 80GB,默认 20GB 太小
CD/DVD 光驱 挂接到第二阶段中生成的 ISO 或 DMG 文件
EFI 必须启用
Network Adapter 网卡 可默认用 NAT,也可改为 Bridge adapter,如果有带DHCP路由器,选择后者比较好,LAN中可分配独立的IP地址。
Boot order 启动顺序 设置为从 CD/DVD 优先启动


创建好虚拟机并启动。。。如果启动顺利,此虚拟机会在2~10分钟内进入图形安装界面,显示出多国语种“欢迎”。。。通常,这个启动过程通常会有各种“卡死”,可能会卡死在多个地方,我在此过程中就卡了无数次,通过反复试验上网查资料,最终摸索出上述操作步骤才得以顺利通关,浪费了大量时间,你看上面步骤中动不动就是6GB的大块头儿和原地等待近20分钟的转换/复制!卡死的情况主要有以下一些情况:

Loading kernel cache 卡死

Could not load mach_kernel 卡死

IOHDAFamily triggered rebuild 卡死

current thread: kernel_task 卡死

AppleIntelCPUPowerManagement timed out 卡死

Missing Bluetooth Controller Transport 卡死(可能与蓝牙没关系,可能是下一操作卡死了)

Waiting for DSMOS 卡很久,但最终一般能通过

如果你遭遇不同的卡死情况,可能需要返回第二阶段重新操作,根据情况调整或删除一些驱动程序后,再制作 ISO 安装盘。。。注意:若要禁用某些驱动程序,建议将其暂时移动到安装包 ISO/DMG 内的 /Backup 目录中,而不是直接删除,以备未来不时之需。

如果在 VirtualBox 中顺利启动并进入到图形安装界面,那就基本上宣告成功在望了。这时可作一些初步设置,让安装程序运行完成;注意:其间,在选择安装盘时,最初磁盘分区列表可能为空白,因为虚拟机 VDI 硬盘还没有分区/格式化,你需要进入菜单中的“磁盘工具”,抹掉 VDI 硬盘内容,并设置一个卷标号,这里假设为:Mavericks

这阶段 Mavericks 安装过程实际上大概需要50分钟,尽管画面提示只要23分钟,那很可能是在 macbook 上的估算时间,在VirtualBox中安装时,你的二分钟被折算成了一分钟;

## 第四阶段:在 VDI 硬盘中补充安装驱动程序

安装完成后 Mavericks 就会自动重新启动;这时你也许会长舒一口气,以为大功告成,其实不然,这时你禁用光驱并直接从 VDI 硬盘启动将 1000% 无法启动成功;不过,也不要着急,只是还有点问题需要手工处理一下;为了处理这个启动问题,暂时还是从上面制作的安装光盘 ISO 镜像启动,当进入图形安装界面后,不要选择继续安装,而是通过上方菜单直接进入 Shell
终端控制台,我们要对虚拟机 VDI 硬盘中驱动程序进行补充;

经过上述安装后无法启动的原因是我们在 ISO 中加入的 kexts 驱动程序没有被正确安装到 VDI 硬盘 /System/Library/Extensions 目录中,所以,我们需要再次手工安装它们;

由于 Mavericks 安装程序默认按只读方式挂载了 VDI 虚拟硬盘,所以得先卸载掉,再重新挂载为读/写模式,命令如下:

# umount /Volumes/Mevericks (先卸下只读盘,Mevericks是我们在上面安装时格式化 VDI 硬盘时设置的名称)

# hdiutil attach /dev/disk0s2 -mountpoint /Volumes/mnt

(用mount -t hfs+-o rw /dev/disk0s2 挂载失败,提示:no such file or directory,而/etc/fstab又为只读无法编辑,所幸换用 hdiutil 挂载,成功!)

# cp -rp /Backup/Kexts/ElliottForceLegacyRTC.kext /Volumes/mnt/System/Library/Extensions

# cp -rp /Backup/Kexts/FakeSMC.kext /Volumes/mnt/System/Library/Extensions

# cp -rp /Backup/Kexts/NullCPUPowerManagement.kext /Volumes/mnt/System/Library/Extensions

(安装这三个驱动程序,其他几个暂时不要安装进去;这里就用到了上面早有预谋的 /Backup 目录和备份内容,而不必又抓狂去挂载U盘啥的)


# chmod -R 0755 /Volumes/mnt/System/Library/Extensions

# chown -R root:wheel /Volumes/mnt/System/Library/Extensions (更正文件目录属性)

# hdiutil detach /Volumes/mnt (完成后立即卸下虚拟机 VDI 硬盘)

操作成功后,直接关机,然后在 Virtualbox 中将 iso 光驱卸下,或者更改启动顺序为从 VDI 硬盘重新启动。。。如果一切顺利,很快就能启动进入 MacOSX 10.9 了。。。
这一阶段的操作,也可以选择将此虚拟机 VDI 硬盘临时挂载到第一阶段中用于制作 ISO 镜像文件的那个 MacOSX 虚拟机中,进行以上操作可能会更简便。


## 第五阶段:调整 MacOSX 设置

进入 MacOSX 10.9后,最好先打开控制面板,在节能器中将节能选项全部关闭,以免过一会儿不用,虚拟机自动进入节能导致无法唤醒。

还有一点,当 Reboot 时一般会在 "Waiting for DSMOS" 卡上好一阵子才能过关,有人说用这个命令:

# sudo chown root:wheel / 

可解决;试了一下,似乎有效,通关卡的时间有所减少 :)

注意:按上述步骤安装出来的 MacOSX 10.9 在 VirtualBox 4.3.6 中运行没有声音,声卡驱动程序的安装步骤有待进一步研究。。。

默认安装后,屏幕尺寸为 1024*768,为了加大屏幕尺寸,最简单的方法是添加以下设置到虚拟机目录中的 mavericks.vbox 文件中:

<ExtraDataItem name="VBoxInternal2/EfiGopMode" value="4"/>

其中“4”表示:1440×900

0 – 640×480
1 – 800×600
2 – 1024×768
3 – 1280×1024
4 – 1440×900

关于virtualbox设置,可以参考 https://www.virtualbox.org/manual/ch03.html


本章就到此为止,以上就是本篇所有内容,欢迎大家交流。


最后还是拉票阶段:http://vote.blog.csdn.net/blogstaritem/blogstar2013/yorhomwang ,支持我的朋友不妨投我一票吧~

—————————————————————-

欢迎大家转载我的文章。

转载请注明:转自Yorhom’s Game Box

http://blog.csdn.net/yorhomwang

欢迎继续关注我的博客

分类: 未分类 标签:

XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)

2013年12月27日 没有评论

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=505

因为常用cocos2dx开发游戏,所以每次新建cpp类文件的时候,XCode默认生成的cpp类基本就是一个空文件,每次都要重复实现cocos2dx的基本代码。很麻烦。(虽然我每次都是修改了HelloWorld文件,新建的文件直接copy HelloWorld内容。感觉还是挺麻烦的。)

今天就修改了下类模板,添加了2个cocos2dx的类模板,下面是新建文件的时候,是不是多出了2个类模板。

XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)

下面我就说下怎么添加xcode类模板,很简单的。

1、打开Xcode的类模板目录地址:/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates

2、打开里面C and C++文件,就会看到Xcode的cpp类模板文件。复制一个C++ Class.xctemplate文件夹取名:2dx Scene Class.xctemplate,放在C and C++目录下。

3、修改TemplateInfo.plist(主要修改创建文件时候的描述介绍)

打开2dx Scene Class.xctemplate/TemplateInfo.plist,   修改Description的值为:A C++ class for Cocos2d-x Scene.

4、修改___FILEBASENAME___.h

打开2dx Scene Class.xctemplate/___FILEBASENAME___.h,修改成以下内容:

//
//  ___FILENAME___
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//___COPYRIGHT___
//

#ifndef _____PROJECTNAMEASIDENTIFIER________FILEBASENAMEASIDENTIFIER_____
#define _____PROJECTNAMEASIDENTIFIER________FILEBASENAMEASIDENTIFIER_____

#include "cocos2d.h"
USING_NS_CC;

class ___FILEBASENAMEASIDENTIFIER___ : public Layer
{
public:
    ___FILEBASENAMEASIDENTIFIER___();
    ~___FILEBASENAMEASIDENTIFIER___();
    static Scene* createScene();
    virtual bool init();
    CREATE_FUNC(___FILEBASENAMEASIDENTIFIER___);
    
private:
    void initData();
};

#endif /* defined(_____PROJECTNAMEASIDENTIFIER________FILEBASENAMEASIDENTIFIER_____) */

5、修改___FILEBASENAME___.cpp

打开2dx Scene Class.xctemplate/___FILEBASENAME___.cpp,修改成以下内容:

//
//  ___FILENAME___
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//___COPYRIGHT___
//

#include "___FILEBASENAME___.h"
___FILEBASENAMEASIDENTIFIER___::___FILEBASENAMEASIDENTIFIER___()
{
    
}

___FILEBASENAMEASIDENTIFIER___::~___FILEBASENAMEASIDENTIFIER___()
{
    
}

Scene* ___FILEBASENAMEASIDENTIFIER___::createScene()
{
    auto scene = Scene::create();
    auto layer = ___FILEBASENAMEASIDENTIFIER___::create();
    scene->addChild(layer);
    return scene;
}

bool ___FILEBASENAMEASIDENTIFIER___::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    initData();
    return true;
}

#pragma mark - initData
void ___FILEBASENAMEASIDENTIFIER___::initData()
{
    Size visibleSize = Director::getInstance()->getVisibleSize();
    
    // add your codes here...
    
}

ok, 这样就完成了一个类模板的添加。

现在在XCode里面新建一个2dx Scene类看看。是不是已经有默认内容了。

//
//  MyScene.h
//  MagicDemo
//
//  Created by LiuYanghui on 13-12-27.
//
//

#ifndef __MagicDemo__MyScene__
#define __MagicDemo__MyScene__

#include "cocos2d.h"
USING_NS_CC;

class MyScene : public Layer
{
public:
    MyScene();
    ~MyScene();
    static Scene* createScene();
    virtual bool init();
    CREATE_FUNC(MyScene);
    
private:
    void initData();
};

#endif /* defined(__MagicDemo__MyScene__) */

//
//  MyScene.cpp
//  MagicDemo
//
//  Created by LiuYanghui on 13-12-27.
//
//

#include "MyScene.h"
MyScene::MyScene()
{
    
}

MyScene::~MyScene()
{
    
}

Scene* MyScene::createScene()
{
    auto scene = Scene::create();
    auto layer = MyScene::create();
    scene->addChild(layer);
    return scene;
}

bool MyScene::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    initData();
    return true;
}

#pragma mark - initData
void MyScene::initData()
{
    Size visibleSize = Director::getInstance()->getVisibleSize();
    
    // add your codes here...
    
}

对应的你可以添加Layer的类模板。方法一样,我就不重复了。

关于文件模板里面的一个预定义变量,介绍下:

XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)

ok,还有很多有趣的功能,可以大家自己探索。比如工程模板,插件等等。

分类: 未分类 标签:

限制移动速度

2013年12月26日 没有评论

 

processEvent:function (event) {

        if (this._bStop == true) return;

        if (this._state == STATE_PLAYING) {
            var delta = event.getDelta();
            var curPos = this._ship.getPosition();
            var pos = null;
            var limitSpeed = 15+MW.LEVEL;
            if (delta.x > limitSpeed) {
                delta.x = limitSpeed;
            }
            else if (delta.x < -limitSpeed) {
                delta.x = -limitSpeed;
            }
            if (delta.y > limitSpeed) {
                delta.y = limitSpeed;
            }

            else if (delta.y < -limitSpeed) {
                delta.y = -limitSpeed;
            }
            curPos = cc.pAdd(curPos, delta);
            // curPos = cc.pClamp(curPos, cc.POINT_ZERO, cc.p(winSize.width, winSize.height));
            pos = this.checkInScreen(this._ship, curPos, 0, 0);
            this._ship.setPosition(pos[0], pos[1]);

 

 

ctor:function () {
        this._super();
this.scheduleUpdate();
    },
    update:function (dt) {
        var realSpeed = dt * this.speed;
        var limitSpeed = 2+0.2*MW.LEVEL;
        if (realSpeed > limitSpeed) {
            realSpeed = limitSpeed;
        }
        // Keys are only enabled on the browser
        if (sys.platform == 'browser') {
            var pos = this.getPosition();
            if ((MW.KEYS[cc.KEY.w] || MW.KEYS[cc.KEY.up]) && pos.y <= winSize.height) {
                pos.y += realSpeed;
            }
            if ((MW.KEYS[cc.KEY.s] || MW.KEYS[cc.KEY.down]) && pos.y >= 0) {
                pos.y -= realSpeed;
            }
            if ((MW.KEYS[cc.KEY.a] || MW.KEYS[cc.KEY.left]) && pos.x >= 0) {
                pos.x -= realSpeed;
            }
            if ((MW.KEYS[cc.KEY.d] || MW.KEYS[cc.KEY.right]) && pos.x <= winSize.width) {
                pos.x += realSpeed;
            }
            this.setPosition(pos);
        }
    },

 

分类: cocos2d 标签:

带冷却时间的按钮(二)

2013年12月24日 没有评论

 

onSkillShade:function () {
        if (!this.lbSkillShade) {
            // 生成遮罩
            var progress2 = cc.Sprite.createWithSpriteFrameName("ui_skill_shade.png");
            this.lbSkillShade = cc.ProgressTimer.create(progress2);
            this.lbSkillShade.setType(cc.PROGRESS_TIMER_TYPE_RADIAL);
            this.lbSkillShade.setReverseDirection(true);
            this.lbSkillShade.setPosition(900,60);
            this.addChild(this.lbSkillShade, g_GameZOder.ui+1);
        }
        this.lbSkillShade.setVisible(true);
        // 遮罩效果,全遮到完全不遮挡
        var to = cc.ProgressTo.create(0, 99.999);
        var to1 = cc.ProgressTo.create(this._ship.skillCd, 0);
        var fun = cc.CallFunc.create(
            function () {
                // 遮罩不可见
                this.lbSkillShade.setVisible(false);
                // 提示技能可用动画
                    var animation = cc.AnimationCache.getInstance().getAnimation(this._ship.skillIcon);
                    var animate = cc.Animate.create(animation);
                    var animate2 = animate.reverse();
                    this.skill_up.runAction(cc.Sequence.create(animate, animate2));
            }
            , this);
        var ac = cc.Sequence.create(to, to1, fun);
        this.lbSkillShade.runAction(ac);
    }

 

分类: cocos2d 标签:

Coroutine协同程序介绍(Unity3D开发之三)

2013年12月23日 没有评论

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=496

Coroutine在Unity3D中叫做协程或协同程序,和多线程类似,也就是说开启协同程序就是开启一个线程。但是在任意指定时刻只有一个协程执行,其他协程挂起。

 Coroutine的相关函数:

StartCoroutine:启动一个协程。

StopCoroutine:终止一个协程。

StopAllCoroutine:终止所有协程。

WaitForSeconds:等待几秒。

WaitForFixedUpdate:等到下一次FixedUpdate调用时执行。

使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在 MonoBehaviour 或继承于MonoBehaviour的类中调用。

(下面一段是引用与网络上教程,因为讲的很详细了,所以这里直接引用下。为找到原始出处)

注意:在Unity3D中,

StartCoroutine(string methodName)

StartCoroutine(IEnumerator routine)

都可以开启一个线程。

区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);

另外使用字符串作为参数时,开启线程时最多只能传递 一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。

在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该 MonoBehaviour中的协同程序。

还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启;

如是将协同程序所在脚本的enabled设置为false则不会生效。这是因为协同程序被开启后作为一个线程在运行,而 MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中有调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线 程。

然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本 中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重 名。

注意:在GameObject.active = false 时他会销毁你的任何一个协同程序过程,并且不会等待过程结束后销毁,GameObject.enable时他并不可以恢复。

协同程序的返回类型为Coroutine类型。在Unity3D中,Coroutine类继承于YieldInstruction,所以,协同程序的返回类型只能为null、等待的帧数(frame)以及等待的时间。

准备写个例子,但是MOMO的这个已经非常详细了,而且我的是基础版,所以这里就直接把MOMO这篇放过来了。(点击查看原文地址

异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务。在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(“yourScene”);  这句代码执行完毕后程序会干什么呢??如下图所示,这是我随便找了一个游戏场景, 在Hierarchy视图中我们可以看到该场景中“天生”的所有游戏对象。天生的意思就是运行程序前该场景中就已经存在的所有游戏对象。然后这些对象就会在执行完Application.LoadLevel(“yourScene”);方法后加载至内存当中。如果该场景中的游戏对象过多那么瞬间将会出现卡一下的情况,因为LoadLevel()方法是同步进行的。MOMO把这种加载起个名字叫A形式加载。

Coroutine协同程序介绍(Unity3D开发之三)

下面我说说“后天“加载的游戏对象。意思是这些游戏对象是通过脚本动态的创建出来的。比如常用方法 :

GameObject Obj = (GameObject)Instantiate(prefab);

这句代码执行完毕后同样会在Hierarchy视图中添加对应的游戏对象。MOMO把这种加载起个名字叫B形式加载。
 
下面我们学习异步加载游戏场景,异步异步顾名思义就是不影响当前游戏场景的前提下加载新场景。通常异步加载的方式分为两种:第一种是异步加载新游戏场景,当新场景加载完成后进入新场景并且销毁之前的场景。第二种:同样异步加载新场景,新场景加载完毕后,保留旧场景的游戏对象并且进入新场景。 这里加载的内容就是上面提到的A形式加载。然后B形式加载不会记入这里的加载。
第一种异步加载游戏场景对应的方法是:

Application.LoadLevelAsync("yourScene");//only pro

第二种异步家在游戏场景对应的方法是:

Application.LoadLevelAdditiveAsync ("yourScene");

这两种方法加载的方式完全一样。异步加载其实重要还是应用于游戏LOADING界面,毕竟LOADING如果采用同步的机制会影响用户体验,说到这里MOMO告诉大家如何在Unity中制作游戏进度条。我们应当在Unity中创建一个专门用于读取进度的场景,假设A场景到C场景,我们应当让A场景先到读取进度的场景B场景,当异步任务完成后在进入C场景。 A – 》B -》 C ,在B场景中绘制游戏进度条或读取动画。因为B场景仅仅是个显示LOADING动画的场景,所以读取该场景是瞬间就完成的。
程序在切换场景时应当有一个全全局的静态变量来记录简要读取的场景名称。这里简单的写一下。

using UnityEngine;
using System.Collections;

public class Globe
{
         //在这里记录当前切换场景的名称
	 public static string loadName;
}

在A场景中通过某些触发条件 调用LoadLevel进入B场景。

//记录LOADING场景中需要读取的C场景名称
Globe.loadName = "C";
//先进入B场景
Application.LoadLevel ("B");

OK我们在B场景中异步读取C场景与 播放读取动画,Loading.cs 绑定在B场景的摄像机对象身上。当C场景异步读取完毕后即可直接进入C场景。

using UnityEngine;
using System.Collections;

public class Loading : MonoBehaviour {

	private float fps = 10.0f;
	private float time;
	//一组动画的贴图,在编辑器中赋值。
	public Texture2D[] animations;
	private int nowFram;
	//异步对象
	AsyncOperation async;

	//读取场景的进度,它的取值范围在0 - 1 之间。
	int progress = 0;

	void Start()
	{
		//在这里开启一个异步任务,
		//进入loadScene方法。
	  	StartCoroutine(loadScene());
	}

	//注意这里返回值一定是 IEnumerator
	IEnumerator loadScene()
	{
		//异步读取场景。
		//Globe.loadName 就是A场景中需要读取的C场景名称。
		async = Application.LoadLevelAsync(Globe.loadName);

		//读取完毕后返回, 系统会自动进入C场景
		yield return async;

	}

	void OnGUI()
	{
		//因为在异步读取场景,
		//所以这里我们可以刷新UI
		DrawAnimation(animations);

	}

	void Update()
	{

		//在这里计算读取的进度,
		//progress 的取值范围在0.1 - 1之间, 但是它不会等于1
		//也就是说progress可能是0.9的时候就直接进入新场景了
		//所以在写进度条的时候需要注意一下。
		//为了计算百分比 所以直接乘以100即可
		progress =  (int)(async.progress *100);

		//有了读取进度的数值,大家可以自行制作进度条啦。
		Debug.Log("xuanyusong" +progress);

	}
	//这是一个简单绘制2D动画的方法,没什么好说的。
	void   DrawAnimation(Texture2D[] tex)
	{

		time += Time.deltaTime;

		 if(time >= 1.0 / fps){

      	 	 nowFram++;

      	 	 time = 0;

      	 	 if(nowFram >= tex.Length)
      	 	 {
      	 	 	nowFram = 0;
      	 	 }
        }
		GUI.DrawTexture(new Rect( 100,100,40,60) ,tex[nowFram] );

        //在这里显示读取的进度。
		GUI.Label(new Rect( 100,180,300,60), "lOADING!!!!!" + progress);

	}

}

OK 下面我们继续学习在游戏场景中加载对象,文章的开始MOMO已经告诉大家,游戏场景中Hierarchy视图中的所有的对象在切换场景的时候都会加载。其实有一种方法可以让某些游戏对象不会被加载,如下图所示,首先在Hierarchy视图中选择一个游戏对象,在右侧监测面板视图中我们可以看到一个 “小对勾”默认情况下是勾选状态,说明该游戏对象处于激活状态,如果点掉的话该对象将被隐藏。这个小功能在开发中其实用处非常大,请大家务必记住哈。

Coroutine协同程序介绍(Unity3D开发之三)

此时此刻大家相像一个游戏场景,默认进入的时候是没有任何游戏对象的,然后运行游戏时开启一个异步任务将它们一个一个的加载显示出来,这种方式适合异步的加载一个比较大的游戏场景。
Test.cs 把它挂在摄像机对象中。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	//这里是需要加载激活的游戏对象
	public GameObject  [] Objects;

	//当前加载的进度
	int load_index =0;
	void Start ()
	{
	    //开启一个异步任务,加载模型。
		StartCoroutine(loadObject());
	}

	IEnumerator loadObject()
	{
		//便利所有游戏对象
		foreach(GameObject obj in Objects)
		{
			//激活游戏对象
			obj.active = true;
			//记录当前加载的对象
			load_index ++;

			//这里可以理解为通知主线程刷新UI
			yield return 0;
		}
		//全部便利完毕返回
		yield return 0;
	}

	void OnGUI ()
	{
	    //显示加载的进度
		GUILayout.Box("当前加载的对象ID是: " + load_index);
	}
}

如下图所示,我们把需要加载的游戏对象以数组的形式放在Objects数组中,因为这些对象属于未激活状态,所以不能通过Find 等方法在脚步那种中找到他们。讲到这里我们在说说 编辑器赋值与代码中赋值的区别,编辑器中赋值所消耗的时间都会记在loadlevel ()读取场景中。而代码中使用Resource.load()这类方法所消耗的时间会记在脚本中。开发中还得自行的把握一下把loading加在那里。

Coroutine协同程序介绍(Unity3D开发之三)

当然我们还可以使用Instantiate(prefab);方法来动态的创建游戏对象。
Main.cs 把它挂在摄像机中。

using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
 {

	public int count;
	//在编辑器中预设一个游戏对象
	public  GameObject prefab;

	void Start ()
	{
		StartCoroutine(loaditem());
	}

	void OnGUI()
	{
		GUILayout.Box("游戏对象已经加载到 : " + count);
	}

	IEnumerator loaditem()
	{
		//开始加载游戏对象
		for(int i =0; i< 1000; i++)
		{

			Instantiate(prefab);
			count = i;
			//可以理解为刷新UI,显示新加载的游戏对象
			yield return 0;
		}
		//结束
		yield return 0;
	}
}

运行游戏后该游戏对象会循环1000遍逐个创建,不影响主线程。那么今天我们其实学习最多的就是StartCoroutine(),其实就是开启一个异步线程,这里可能有朋友会问Thread可以代替它吗? 答案是不行, 比如查询数据库的时候如果用Thread的话Unity就会报错说不能在线程中查询,但是在StartCoroutine()中就可以完成,所以开发中大家可以尝试着使用它,我们还可以使用StopCoroutine(“name”)来关闭一个正在执行的异步线程。不早了晚安,MOMO祝大家学习愉快。

ok, 这个介绍是MOMO写的,我的第一本Unity书也是买的MOMO的。

分类: 未分类 标签:

Blue Path(基于cocos2dx 3.0)

2013年12月21日 没有评论

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=498

iTunes下载:https://itunes.apple.com/cn/app/blue-path/id761631488?mt=8

这个是一个周末使用cocos2dx 3.0写的。

玩法很简单,类似一笔画,一笔将蓝色填充满格子就可以了,红色的不可操作。

Blue Path(基于cocos2dx 3.0)Blue Path(基于cocos2dx 3.0)Blue Path(基于cocos2dx 3.0)

The new game for use with ios7 style, you only need to fill the blue blocks.
In the game center,you can challenge the game with your friends.
Don’t be fooled by the simplicity, it’s not as easy as it looks. Give it a try! Enjoy the game now!

iTunes下载:https://itunes.apple.com/cn/app/blue-path/id761631488?mt=8

分类: 未分类 标签:

Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面

2013年12月17日 没有评论

1、概述


    上一篇我们在编辑器中设计了一个静态的UIScrollView,而通常我们都需要在程序中动态增加信息。插入元素的位置怎么确定?在3.0中UILayout已经实现了基本的布局,一起来看看吧:


Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面

2、编辑界面

    打开CocoStudio的UIEditor 编辑一个界面,创建一个ScrollView和两个Button。因为ScrollView继承自UILayout,这里我们采用它。不太能搞定的童鞋可参考:Cocos2d-x 3.0 开发(十四)使用UIScrollView 实现大小不同物品拖动展示

 

Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面

    注意此处ScrollView子控件布局中,我们选择“线性纵向”,并且在“特性->滑动方向”也选择为“vertical”。编辑好后保存导出。

 

3、关联程序


    运行脚本,创建一个testLayout程序,将导出的文件复制到Resource目录下。

    声明一个UILayout:

#include "gui/CocosGUI.h"

private:
	gui::UILayout* m_layout;

    更改init:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();
	
	//Load Layout
	m_layout = dynamic_cast<UILayout*>(cocostudio::GUIReader::shareReader()->widgetFromJsonFile("testLayout.json"));
	auto layer = UILayer::create();
	layer->addWidget(m_layout);
	this->addChild(layer);
    
	//set button react
	UIButton* buttonA = dynamic_cast<UIButton*>(m_layout->getChildByName("TextButtonA"));
	buttonA->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));
	UIButton* buttonB = dynamic_cast<UIButton*>(m_layout->getChildByName("TextButtonB"));
	buttonB->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));


    return true;
}

    添加一个响应函数

void HelloWorld::touchButton(cocos2d::Object* obj,TouchEventType type)
{
	if(type == TOUCH_EVENT_ENDED)
	{
		auto button = dynamic_cast<UIButton*>(obj);
		if(strcmp(button->getName(),"TextButtonA") == 0)
		{
			//add element on left
			addLeft();
		}
		else
		{
			//add element on right
			addRight();
		}
	}
}

    编译运行,可以看到如下界面:

Cocos2d-x 3.0 开发(十五)使用UILayout布局,制作对话界面

4、添加控件


    实现addLeft() 和addRight():

void HelloWorld::addLeft()
{

	auto layoutParameter = UILinearLayoutParameter::create();
	layoutParameter->setGravity(UILinearGravity::LINEAR_GRAVITY_LEFT);

	auto scrollView = ((UIScrollView*)m_layout->getChildByName("ScrollView"));
	UIWidget*  widget = makeWords();
	widget->setLayoutParameter(layoutParameter);
	scrollView->addChild(widget);
	scrollView->doLayout();
}

void HelloWorld::addRight()
{
	auto layoutParameter = UILinearLayoutParameter::create();
	layoutParameter->setGravity(UILinearGravity::LINEAR_GRAVITY_RIGHT);

	auto scrollView = ((UIScrollView*)m_layout->getChildByName("ScrollView"));
	UIWidget*  widget = makeWords();
	widget->setLayoutParameter(layoutParameter);
	widget->setColor(Color3B(0,255,0));
	scrollView->addChild(widget);
	scrollView->doLayout();
}


gui::UIWidget* HelloWorld::makeWords()
{
	UIButton* button = UIButton::create();
	button->loadTextureNormal("button.png");
	button->setTitleText("Hello UILayout /n I'm Cocos2d-x");
	button->setTitleColor(Color3B(0,0,0));
	return button;
}

    使用重写的addChild来添加子控件。通过调整它的UILinearLayoutParameter来控制控件的显示位置。

    要注意的一点是,在UIScrollView中添加子控件后,要调用doLayout这个函数整理子控件的位置。

    最后编译运行即可。

 

5、总结

    使用UILayout进行布局,可以方便的控制动态添加元素的位置。

    Demo 下载:http://download.csdn.net/detail/fansongy/6730481

 

本篇博客出自阿修罗道,转载请注明出处,禁止用于商业用途:http://blog.csdn.net/fansongy/article/details/17382049 

分类: 未分类 标签:

Transform介绍(Unity3D开发之二)

2013年12月17日 没有评论

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!

原文地址: http://www.cocos2dev.com/?p=491

可能unity中接触较早的就是这个组件了,控制着位置、缩放、方向。

下面简单介绍下:

一、成员变量

position:在世界空间坐标transform的位置。

localPosition:相对于父级的变换的位置。如果该变换没有父级,那么等同于Transform.position。

eulerAngles:世界坐标系中的旋转(欧拉角)。

localEulerAngles:相对于父级的变换旋转角度。

right:世界坐标系中的右方向。(世界空间坐标变换的红色轴。也就是x轴。)

up:世界坐标系中的上方向。(在世界空间坐标变换的绿色轴。也就是y轴。)

forward:世界坐标系中的前方向。(在世界空间坐标变换的蓝色轴。也就是z轴。)

rotation:世界坐标系中的旋转(四元数)。

localRotation:相对于父级的变换旋转角度。

localScale:相对于父级的缩放比例。

parent:父对象Transform组件。

worldToLocalMatrix:矩阵变换的点从世界坐标转为自身坐标(只读)。

localToWorldMatrix:矩阵变换的点从自身坐标转为世界坐标(只读)。

root:对象层级关系中的根对象的Transform组件。

childCount:子对象数量。

lossyScale:全局缩放比例(只读)。

二、成员函数

Translate:向某方向移动物体多少距离。

Rotate:按照指定欧拉角旋转。

RotateAround:按照多少度在世界坐标的某位置轴旋转物体。

LookAt:旋转物体使z轴指向目标物体。

TransformDirection:将一个方向从局部坐标变换到世界坐标方向。

InverseTransformDirection:将一个方向从世界坐标变换到局部坐标方向。

TransformPoint、InverseTransformPoint。

Description:与所有子物体解除父子关系。

Find:通过名字查找子物体并返回它。如果没有查找到子物体名字,将返回null。如果名字包含“/”字符它将向路径一样穿越层次。

例如:

void Update() {
    // 找到手指并旋转
    aFinger = transform.Find("Arm/Hand/Finger");
    aFinger.Rotate(Time.deltaTime*20, 0, 0);


    // 向前移动
    transform.Translate(Vector3.forward * Time.deltaTime * 3)


    // 绕自身坐标Y轴旋转
    transform.Rotate(Vector3.up * Time.deltaTime * 30)


    // 绕世界坐标Y轴旋转
    transform.RotateAround(Vector3.zero, Vector3.up, Time.deltaTime * 30)
 } 

分类: 未分类 标签:

disable “BACK” button in Android? [duplicate]

2013年12月17日 没有评论

This question already has an answer here:

Is their a way of disable a BACK button on my mobile? because while i’ll transfer it to my mobile the BACK button is activated so that it can back the previous page. Please help me to disable BACK button while my app is running.

Override the onBackPressed() of your activity

@Override
public void onBackPressed()
{

   // super.onBackPressed(); // Comment this super call to avoid calling finish()
}

This way works for all versions of Android, and will work with libraries that may override the default functionality in their Activities (such as cocos2d-x):

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    return (keyCode == KeyEvent.KEYCODE_BACK ? true : super.onKeyDown(keyCode, event));
}

This is very simple.. put this code in every activity of your android code if you wish to disable the back button for complete aplication

@Override
public void onBackPressed()
{

   //thats it
}

and you are done

分类: stackoverflow精选, unity3d 标签: