本篇文章给大家谈谈cocos2d-xv3.3MoveToandMoveBy,以及windows的知识点,同时本文还将给你拓展Candragwebviewtomovewindowincococa?、Co
本篇文章给大家谈谈cocos2d-x v3.3 MoveTo and MoveBy,以及windows的知识点,同时本文还将给你拓展Can drag webview to move window in cococa?、Cocos2d 开源社区进军 Windows Phone 7: Cocos2d-x for XNA游戏引擎发布、Cocos2D-Android-1之源码详解:6.ClickAndMoveTest、Cocos2d-html5之MoveTo&MoveBy等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- cocos2d-x v3.3 MoveTo and MoveBy(windows)
- Can drag webview to move window in cococa?
- Cocos2d 开源社区进军 Windows Phone 7: Cocos2d-x for XNA游戏引擎发布
- Cocos2D-Android-1之源码详解:6.ClickAndMoveTest
- Cocos2d-html5之MoveTo&MoveBy
cocos2d-x v3.3 MoveTo and MoveBy(windows)
Moveto和MoveBy可以使精灵移动,区别在于Moveto是移动到给定的坐标点;而MoveBy是从当前坐标点移动给定的坐标点这么多的距离。举个例子,假定精灵当前的坐标点是(x,y),分别给Moveto和MoveBy指定一个坐标点(x1,y1),那么Moveto和MoveBy最终的效果分别如下:
Moveto:(x,y) → (x1,y1)
MoveBy:(x,y) → (x + x1,y + y1)
Moveto和MoveBy各属一类,它们的继承关系如下:
接下来看每个类有什么接口,并结合实例说明。
MoveBy:
1、成员变量:
protected:
Vec2 _positionDelta; // 偏移坐标,文章开头处说的(x1,y1)就是由它存储的。
/* 起始坐标,文章开头处说的(x,y)就是由它存储的。
* 不过这种说法只适用于为一个精灵设置了一个MoveBy动作,
* 如果为同一个精灵设置了多个MoveBy动作,那么这个变量的值也是在不停的改变的,
* 详见下面MoveBy::update()的源码分析。
*/
Vec2 _startPosition;
/* 移动过程中的坐标,精灵的移动实际上是在不停的setPosition(),连在一起行程移动效果。
* 这个变量就用于存储上一次setPosition()时的坐标。
* 详见下面MoveBy::update()的源码分析。
*/
Vec2 _prevIoUsPosition;
private:
/* 禁用拷贝构造函数和拷贝赋值操作符。
* 这里用到了C++11标准的新特性“delete函数(= delete)”
* 详情见:http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/
*/
CC_disALLOW_copY_AND_ASSIGN(MoveBy);
2、成员方法:
(1) static MoveBy* create(float duration,const Vec2& deltaPosition);
使用该函数创建一个MoveBy动作。
duration:动作持续时间。
deltaPosition:偏移坐标。这里会给出一对儿(x,y)坐标值,x轴是左负右正,y轴是下负上正。
实例:
// 用1秒的时间,向右移动100个像素的MoveBy。
auto myMoveBy = MoveBy::create(1.0f,Vec2(100,0));
// 用3秒的时间,向上移动500个像素的MoveBy
auto myMoveBy = MoveBy::create(3.0f,Vec2(0,500));
// 用1秒的时间,向右上移动的MoveBy,具体效果就是x和y轴移动效果的组合。
auto myMoveBy = MoveBy::create(1.0f,100));
// 用1秒的时间,向左移动100个像素的MoveBy。
auto myMoveBy = MoveBy::create(1.0f,Vec2(-100,0));
auto是让编译器自动识别变量类型;create是MoveBy的静态成员方法,所以可以通过类名直接调用,无需类对象;Vec2是一个管理二维坐标的类。
当然,MoveBy只是创建了这么一个动作,要向让精灵真正的动起来,可参考如下代码:
auto mySprite = Sprite::create("mysprite.png");
mySprite->setPosition(Vec2(100,100));
this->addChild(mySprite);
mySprite->runAction(MoveBy::create(1.0f,100)));
mysprite.png放在工程的Resources目录下。
实现源码:
MoveBy* MoveBy::create(float duration,const Vec2& deltaPosition)
{
MoveBy *ret = new (std::nothrow) MoveBy(); // 创建MoveBy对象。
ret->initWithDuration(duration,deltaPosition); // 调用内部函数,见下。
ret->autorelease(); // 让该对象在不使用时自动释放。
return ret;
}
bool MoveBy::initWithDuration(float duration,const Vec2& deltaPosition)
{
if (ActionInterval::initWithDuration(duration)) // 动画的持续时间是由其父类负责的。
{
_positionDelta = deltaPosition; // MoveBy的成员变量存储了偏移坐标。
return true;
}
return false;
}
关键点总结:
♂ MoveBy::create()可以创建一个MoveBy动作,创建过程中可以指定动作持续时间以及动作具体要向哪个方向(x轴是左负右正,y轴是下负上正)移动多少。
♂ MoveBy并没有具体实现运动的过程,它只相当于一个配置。并且配置还进行了细化,其父类负责动画的持续时间,而MoveBy只负责偏移的坐标。
(2) virtual MoveBy* clone() const override;
使用该函数克隆一个MoveBy动作。
实例:
auto myMoveBy = MoveBy::create(1,100));
auto myMoveByClone = myMoveBy->clone();
实现源码:
MoveBy* MoveBy::clone() const
{
// no copy constructor
auto a = new (std::nothrow) MoveBy();
a->initWithDuration(_duration,_positionDelta);
a->autorelease();
return a;
}实现又重新把create()中的内容写了一遍,为何不直接返回create()?
return MoveBy::create(_duration,_positionDelta);
关键点总结:
♂ MoveBy::clone()就是克隆一个给定的动作,函数名字起得很形象。
♂ 源码实现觉得应该更简洁写,调用MoveBy::create()即可。
(3) virtual MoveBy* reverse(void) const override;
使用该函数创建一个与原先MoveBy相反的MoveBy动作。
实例:
auto myMoveBy = MoveBy::create(1,100));
auto myMoveByReverse = myMoveBy->reverse();
实现源码:
MoveBy* MoveBy::reverse() const
{
return MoveBy::create(_duration,Vec2( -_positionDelta.x,-_positionDelta.y));
}reverse()就很简洁了,没有再把create()重写一遍。不过这里手动指定了相反的偏移坐标,难道不用封装个Vec2::getNegate()用于返回相反的坐标吗?我觉得之后会用的挺频繁的。
关键点总结:
♂ MoveBy::reverse()创建一个与给定动作相反的动作,名字依旧起得很形象。
♂ 源码实现部分手动指定了相反的偏移坐标,觉得可以封装个Vec2::getNegate()之类的方法。
(4) virtual void startWithTarget(Node *target) override;
virtual void update(float time) override;
这两个函数是cocos2d-x引擎内部调用的。稍微具体一点,startWithTarget()是在runAction()内部调用,用于将精灵(Sprite)和该精灵所要执行的动作(MoveBy)绑定起来;而update()是在MoveBy的step()方法中(继承自ActionInterval)调用的,用于不停地更新精灵的位置(使用setPosition())。
target:待与动作绑定的精灵。
time:动作的进度。比如10s的动作,当5s的时候调用了update(),此时time应该传入0.5。
实例:
无。
实现源码:
void MoveBy::startWithTarget(Node *target)
{
ActionInterval::startWithTarget(target); // 父类将精灵与动作的其余相关信息绑定。// 起始坐标和移动过程中的坐标均初始化为精灵还未移动时的坐标。
_prevIoUsPosition = _startPosition = target->getPosition();
}void MoveBy::update(float t)
{
if (_target) // 这个是MoveBy父类Action的成员变量,实际上就代表待移动的精灵。
{/* 开启这个宏的效果在于,当多个动作作用于一个精灵的时候,
* 这个精灵的运动方式为多个动作的组合效果。
* 举个例子,MoveBy::create(1,0))和MoveBy::create(1,Vec2(-90,0))
* 同时作用于一个精灵,那么效果是该精灵只会在1s内向右移动10个像素。
* 不开启此宏,还是上面的例子,那么这个精灵只会执行最后配置的MoveBy的动作。
* 这个宏在2.0之后的版本都是默认开启的,为了兼容之前的版本需要关闭该宏。
*/
#if CC_ENABLE_STACKABLE_ACTIONS
Vec2 currentPos = _target->getPosition(); // 精灵当前所在坐标。// 当前所在坐标与上一次setPosition()后的坐标之间的距离。
Vec2 diff = currentPos - _prevIoUsPosition;// 如果上面的diff表明有差别,则更新精灵的起始坐标。
_startPosition = _startPosition + diff;// 根据已流逝的时间,更新精灵的位置。这里的t传入的是动作当前的进度。
// 比如动作持续时间为10s。每次update()这里会传入0.1、0.19、0.36、……(可以理解为百分比)。
Vec2 newPos = _startPosition + (_positionDelta * t);// 更新精灵的位置,这样每次update()的setPosition()连在一起就形成了动画效果。
_target->setPosition(newPos);// 记录该MoveBy动作上次update()后将精灵更新到的坐标点。
_prevIoUsPosition = newPos;
#else
_target->setPosition(_startPosition + _positionDelta * t); // 更新精灵的位置。
#endif // CC_ENABLE_STACKABLE_ACTIONS
}
}当只有一个动作作用于精灵时,currentPos与_prevIoUsPosition一直都是相同的(因为没有其他动作移动该精灵),所以diff总是为0,继而精灵的起始坐标(_startPosition)保持不变,精灵只是_positionDelta * t计算出当前精灵应该移动的偏移量。针对以上的描述举一个简单的例子,比如一个MoveBy动作是1s向右移动100个像素,现在调用了update(),时间过去了0.1秒,那么此时应该将精灵放在距离起始坐标向右10个像素的位置(_startPosition + (100,0) * 0.1);之后过了段时间又掉用了update(),此时过去了0.7秒,那么此时应该将精灵放在距离起始坐标向右70个像素的位置。
当有多个动作作用于精灵时情况稍微复杂了些。比如有两个MoveBy动作都是1s向右移动100个像素,精灵的起始位置是(0,0),0.1s的时候MoveBy1的update()被调用,将精灵向右移动了10个像素,此时精灵位于(10,0);0.11s时MoveBy2的update()被调用,发现精灵的当前位置与自己之前记录的起始坐标(_prevIoUsPosition,startWithTarget()中初始化了)不一样了,故而_startPosition被更新为(10,0),之后将精灵向右移动11个像素,此时精灵位于(21,0);之后比如0.15s时MoveBy1的update()被调用,也发现精灵的当前位置与自己之前记录的起始坐标不一样了,故而_startPosition被更新为(11,0),之后将精灵向右移动15个像素,此时精灵位于(26,0);之后就是以此类推,当1s过后精灵位于(200,0)。
当不开启CC_ENABLE_STACKABLE_ACTIONS时,update()中只有一个setPosition(),所以谁最后setPosition()就体现谁的效果,即最后一个MoveBy有效果。
关键点总结:
♂ MoveBy::startWithTarget()用于初始化成员变量,其父类的startWithTarget()用于将动作与精灵绑定。
♂ MoveBy::update()是在绘制屏幕的过程中不断被调用的,每次被调用都使用setPosition()更新精灵的位置。
♂ 开启CC_ENABLE_STACKABLE_ACTIONS可以实现同一个精灵上多个MoveBy动作的组合效果,而关闭后只有最后一个MoveBy动作生效。
Moveto:
Moveto继承自MoveBy,大部分成员方法及其实现均与MoveBy是一个模式,只有一个成员变量_endPosition有些区别,存储的是目的地坐标。其它的create(),initWithDuration()成员方法也传递的是这个目的地坐标。
Moveto的使用方法也与MoveBy相同,这里就不再赘述了。
附加:
在网上看到一个关于Moveto->reverse()的讨论:
https://github.com/cocos2d/cocos2d-x/issues/10589
就当做两个类的startWithTarget()和update()的使用实例吧。 : )
Can drag webview to move window in cococa?
1. 问题
如果cococa程序,在一个==没有titlebar==的window里只有一个webview,是否能够==拖曳这个webview来拖动整个window==呢?当然,直接拖是不行的,webview会先接受这个拖曳drag事件。
对于window中除webview以外的其他控件,其实可以直接重载NSWindow的mouseDown
和mouseDragged
方法来实现要的效果,但是webview不行,它需要另外重载NSWindow的sendEvent
来实现mouse事件的额外操作。
另外,需要注意的是没有titlebar的window,相当于[self.window setStyleMask:(NSBorderlessWindowMask)]
.对于使用NSBorderlessWindowMask这个’Window Style Masks’时,需要额外实现canBecomeKeyWindow
or canBecomeMainWindow
返回YES,从而让这
个window成为当前主窗口。Apple官方文档对此的说明如下:
The window displays none of the usual peripheral elements. Useful only for display or caching purposes. A window that uses NSBorderlessWindowMask can’t become key or main,unless you implement canBecomeKeyWindow or canBecomeMainWindow to return YES. Note that you can set a window’s or panel’s style mask to NSBorderlessWindowMask in Interface Builder by deselecting Title Bar in the Appearance section of the Attributes inspector.
2. 代码
将现有window设置成下面这个BorderlessWindow即可。
.h文件:
#import <Cocoa/Cocoa.h> @interface BorderlessWindow : NSWindow @end
.m文件
#import "BorderlessWindow.h" @interface BorderlessWindow() @property (assign) NSPoint initialLocation; @end @implementation BorderlessWindow - (BOOL)canBecomeKeyWindow { return YES; } - (BOOL)canBecomeMainWindow { return YES; } - (void)sendEvent:(NSEvent *)theEvent { if ([theEvent type] == NSLeftMouseDown) { [self mouseDown:theEvent]; } else if ([theEvent type] == NSLeftMouseDragged) { [self mouseDragged:theEvent]; } [super sendEvent:theEvent]; } - (void)mouseDown:(NSEvent *)theEvent { self.initialLocation = [theEvent locationInWindow]; } - (void)mouseDragged:(NSEvent *)theEvent { NSPoint currentLocation; NSPoint newOrigin; NSRect screenFrame = [[NSScreen mainScreen] frame]; NSRect windowFrame = [self frame]; currentLocation = [NSEvent mouseLocation]; newOrigin.x = currentLocation.x - self.initialLocation.x; newOrigin.y = currentLocation.y - self.initialLocation.y; // Don't let window get dragged up under the menu bar if( (newOrigin.y+windowFrame.size.height) > (screenFrame.origin.y+screenFrame.size.height) ){ newOrigin.y=screenFrame.origin.y + (screenFrame.size.height-windowFrame.size.height); } //go ahead and move the window to the new location [self setFrameOrigin:newOrigin]; }
3. 参考
- [stackoverflow]Make WebView from WebKit draggable by mouse in Cocoa
- [stackoverflow]Can I move window using an object inside that window?
Cocos2d 开源社区进军 Windows Phone 7: Cocos2d-x for XNA游戏引擎发布
2012 年 2 月 17 日,著名的开源社区 Cocos2d 发布 Cocos2d-X for XNA 版本。该游戏引擎针对微软最新移动操作系统 Windows Phone 7 平台,开发者可以采用 C# 语言开发基于 Windows Phone 平台的游戏,而无需学习 XNA 绘图接口。据悉,该游戏引擎由 Cocos2d-X团队和 OpenXLive 合作开发。OpenXLive 是 Windows Phone 上最早的游戏社交平台。
虽然在一年的时间内,Windows Phone 的应用数量达到 6 万款,但是长期以来 Windows Phone 上缺乏好的游戏引擎,阻碍了游戏开发者进入这个新兴的手机操作系统。Cocos2d-X for XNA 的发布,相信对于那些想进入 Windows Phone 的 iOS 或 Android 开发者来说无疑是一个好消息。
Cocos2d-X for XNA Hello world
Cocos2d 概述
Cocos2d- x是一个开源的,跨平台的,轻量级的 2D 游戏引擎。它基于 ios 平台上著名的游戏引擎 cocos2d-iphone 移植,支持包括 iOS, Android, Bada, BlackBerry Playbook, Windows XP, Windows 7,Linux,等多个平台。使游戏开发者能够以同一套 API、甚至同一套代码将游戏分发至多个游戏平台,大大减少多个平台之间的研发和维护成本。
截 至今日,已经有 3000 多款使用 Cocos2d-iphone 引擎的游戏,和 200 多款使用 cocos2d-x实现跨平台的游戏,其中不乏 Zynga、Glu、Disney Mobile、空中网、网龙、Chillingo 各手游大厂的作品,和大量荣登 AppStore Top10 的中小团队乃至个人开发者作品。去年以来国内大热的《捕鱼达人》也正是基于 cocos2d-x引擎开发。
使用 cocos2d-iphone 开发的游戏
使用 cocos2d-x开发的游戏
Windows Phone 游戏开发
Windows Phone 7 是微软最新推出的移动操作系统,其全新 Metro 风格的界面,流畅的用户体验使其一推出及受到各方好评。据最新数据,Windows Phone Marketplace 上已经有 6 万多款游戏及应用,还在保持着高速增长。该平台更由于诺基亚和微软的合作,加上与 Windows 生态系统的整合,被看做与 iOS,Android 具有强劲竞争力的新生移动生态系统。
然 而,由于 Windows Phone 目前不支持 C++ 语言开发应用程序,且该平台采用 XNA 框架作为 Windows Phone 上的游戏开发接口。所以基于 C++ 的 cocos2d-x和基于 Objective C 语言的 cocos2d-iphone 版本均无法在 Windows Phone 平台运行。而与此同时,Windows Phone 上也没有比较好的游戏引擎,使得在 Windows Phone 平台开发游戏具有一定的门槛。
Cocos2d-X for XNA 的远景
正是在此背景下,cocos2d-x与最早开发 Windows Phone 平台的游戏社交平台 OpenXLive 合作移植了 Cocos2d-X for XNA 版本,此版本的发布对于 Windows Phone 平台具有重要意义:
首先,Windows Phone 平台还没有比较成熟的游戏引擎,大大增加了该平台游戏开发的难度和进入门槛。
“XNA 本身在 2D 方面只提供基本的 Sprite 绘制和变换,你要管理游戏中无数个精灵的动作,位置,状态,触摸事件;同时对于游戏中的多个场景的管理,对于地图文件的解析等等,这些对于基于 XNA 开发游戏要做大量的工作,甚至你不得不去学习 3D 绘制,矩阵变换等方面的一些知识。而 Cocos2d-X for XNA 引擎做了这些基础工作,大大降低在 Windows Phone 平台上开发游戏的难度,使得游戏开发者可以更多关注在游戏设计本身,而不是学习新的技术框架和接口”——Cocos2d-X for XNA 游戏引擎移植的核心开发者,OpenXLive 开发经理秦春林说。
其次,对于新生的移动操作系统 Windows Phone 而言,iOs 和 Android 上面有大量的成熟的游戏。怎样让这些游戏能快速移植到 Windows Phone 平台?cocos2d-x开源社区提供了完美的方案,Cocos2d-x for XNA 尽量保持了和 Cocos2d 框架一致的 API 接口,使游戏厂商只需要少量工作即可以将游戏发布至 Windows Phone 平台。
第三,Cocos2d 是一个非常成熟的游戏引擎,它已经开发出上千款游戏,Cocos2d 社区具有大量的开发资源,各种教程及官方文档,以及活跃的开发者社区。秦春林表示 Cocos2d-x for XNA 移植团队后续也会写大量的博客教程文档。
所以,Cocos2d-x for XNA 的发布不论对 cocos2d-x游戏开发者,还是对 Windows Phone 开发者无疑是一件重大喜事。Cocos2d-x社区组织者王哲表示。
当 然,这只是第一个版本,引擎本身还不够完善,还有一部分功能没有实现。但是在这个版本之上开发者可以开始移植基于 Cocos2d 家族其他平台的游戏到 Windows Phone,或者直接使用 Cocos2d-X for XNA 开发新游戏了。Cocos2d-X for XNA 开源游戏引擎的完善和成熟需要大家的不断反馈和提出建议 。
“我们会按照 cocos2d-x其他版本的进度,大概每隔一个月进行一次版本更新。下一个版本我们尽量完善所有功能,再经过 2 个版本左右,给大家一个比较稳定的版本”,秦春林描述了下一步计划。
按照这个计划,也就是今年 5 月份左右就可以使用比较稳定的版本,期待 Cocos2d 游戏引擎可以为 Windows Phone 平台带来更多优秀的游戏。
开发资源
Cocos2d-xna 的源代码可以从 git 下载,地址:http://github.com/cocos2d/cocos2d-x-for-xna/
你也可以从 http://www.cocos2d-x.org 网站找到大量关于 cocos2d 的资源。
为了帮助新手入门学习和使用 cocos2d-xna 引擎,cocos2d-xna 移植小组成员刘凯威写了一个小例子,并将源代码开源到 Codeplex 上,大家可以从这里下载:http://tweejump.codeplex.com/
总结
在 过去的几个月中,两个团队的开发者付出了巨大的努力,成功地解决了很多棘手的技术问题。今后,Cocos2d-x和 OpenXLive 会持续地进行 Cocos2d-X for XNA 版本的维护和新功能开发,期待能够为 Windows Phone 开发者提供可靠的开源游戏引擎平台而努力。
在这期间,开发团队得到了 CocoaChina 的大力支持,在此表示感谢。
Cocos2D-Android-1之源码详解:6.ClickAndMoveTest
package org.cocos2d.tests;
import org.cocos2d.actions.CCProgresstimer;
import org.cocos2d.actions.base.CCRepeatForever;
import org.cocos2d.actions.interval.CCFadeIn;
import org.cocos2d.actions.interval.CCFadeOut;
import org.cocos2d.actions.interval.CCJumpTo;
import org.cocos2d.actions.interval.CCMoveto;
import org.cocos2d.actions.interval.CCRotateto;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.events.CCTouchdispatcher;
import org.cocos2d.layers.CCColorLayer;
import org.cocos2d.layers.cclayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.cclabel;
import org.cocos2d.nodes.CCNode;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.opengl.CCGLSurfaceView;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.ccColor4B;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
//
// Click and Move demo
// a cocos2d example
// http://www.cocos2d-iphone.org
//
public class ClickAndMoveTest extends Activity {//点击和移动
// private static final String LOG_TAG = ClickAndMoveTest.class.getSimpleName();
// private static final boolean DEBUG = true;
public static ClickAndMoveTest app;//自己类的引用
private CCGLSurfaceView mGLSurfaceView;//新建view
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = this;//把唯一的引用传到类静态量里
//无题、全屏、不黑
requestwindowFeature(Window.FEATURE_NO_TITLE);
getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getwindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//新建view并把this放入导演变量集合中
mGLSurfaceView = new CCGLSurfaceView(this);
setContentView(mGLSurfaceView);//把view映射到activity中
// attach the OpenGL view to a window
CCDirector.sharedDirector().attachInView(mGLSurfaceView);//把view给导演,让导演来演
// set landscape mode
CCDirector.sharedDirector().setLandscape(false);//设置景观模式
//又是3个通俗的设置
// show FPS
CCDirector.sharedDirector().setdisplayFPS(true);
// frames per second
CCDirector.sharedDirector().setAnimationInterval(1.0f / 60);
CCScene scene = CCScene.node();
scene.addChild(new MainLayer(),2);
// Make the Scene active
CCDirector.sharedDirector().runWithScene(scene);//把场景给导演,让他来演,导演会把这个放到activity中
}
//老4件..
@Override
public void onStart() {
super.onStart();
}
@Override
public void onPause() {
super.onPause();
CCDirector.sharedDirector().onPause();
}
@Override
public void onResume() {
super.onResume();
CCDirector.sharedDirector().onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
CCDirector.sharedDirector().end();
}
static class MainLayer extends cclayer {//主图层
static final int kTagSprite = 1;//定义一个tag是1
CCProgresstimer progresstimer;//进程时间
public MainLayer() {
this.setIsTouchEnabled(true);//可点击
CCSprite sprite = CCSprite.sprite("grossini.png");//建立一个精灵
cclayer layer = CCColorLayer.node(new ccColor4B(255,255,255));//建立图层
addChild(layer,-1);//添加孩子
addChild(sprite,1,kTagSprite);//添加孩子,tag作为1
sprite.setPosition(CGPoint.make(20,150));//设置点
sprite.runAction(CCJumpTo.action(4,CGPoint.make(300,48),100,4));
//执行跳跃动画
cclabel lbl1 = cclabel.makeLabel("Click on the screen","DroidSans",24);
//放个标签,内容、字体、大小
cclabel lbl2 = cclabel.makeLabel("to move and rotate Grossini",16);//同理
addChild(lbl1,0);
addChild(lbl2,1);//添加进去这2个
lbl1.setPosition(CGPoint.ccp(160,240));
lbl2.setPosition(CGPoint.ccp(160,200));//再回头设置位置
progresstimer = CCProgresstimer.progress("iso.png");//进度条效果
this.addChild(progresstimer,10);//把进度条弄进去
progresstimer.setPosition(160,100);//设置位置
progresstimer.setType(CCProgresstimer.kCCProgresstimerTypeVerticalBarTB);
//设置类型-垂直的进度条
progresstimer.setPercentage(50.0f);//设置现在的百分比
layer.runAction(CCRepeatForever.action(CCSequence.actions(CCFadeIn.action(1),CCFadeOut.action(1))));//图层闪烁
}
@Override
public boolean cctouchesBegan(MotionEvent event) {//触动事件
CGPoint convertedLocation = CCDirector.sharedDirector()
.convertToGL(CGPoint.make(event.getX(),event.getY()));//得到点
CCNode s = getChildByTag(kTagSprite);//得到刚才那个tag是1的精灵
s.stopAllActions();//停止所有的动作
s.runAction(CCMoveto.action(1.0f,convertedLocation));//移动到点击的点
CGPoint pnt = s.getPosition();//得到点
float at = CGPoint.ccpCalcRotate(pnt,convertedLocation);//得到两点的旋转向量
s.runAction(CCRotateto.action(1,at));//旋转
progresstimer.setPercentage(10.0f + progresstimer.getPercentage());//进度条设置进度
return CCTouchdispatcher.kEventHandled;//返回数据
}
}
}
Cocos2d-html5之MoveTo&MoveBy
本文测试所用Cocos2d-html5版本:2.2.1。
Moveto:移动到某个位置,是绝对距离。
MoveBy:移动一段距离,是相对距离。
使用cc.Moveto.create(duration,deltaPosition)和cc.MoveBy.create(duration,deltaPosition)来创建动作。
- duration
- 运动周期,单位为s。
- deltaPosition
- 坐标点,使用cc.p(x,y)或者new cc.Point(x,y)
请看下列代码:
- var GameScene = cc.Scene.extend({
- enemy1: null,// 敌人1
- enemy2: null,// 敌人2
- enemy3:null,// 敌人3
- layer: null,// 布景
- winSize: null,// 游戏运行窗口尺寸
- onEnter: function () {
- this._super();
- this.initData();
- },
- initData: function () {
- // 获取尺寸
- this.winSize = cc.Director.getInstance().getWinSize();
- // 添加布景
- this.layer = cc.LayerColor.create(cc.c4(200,200,255),this.winSize.width,this.winSize.height);
- this.addChild(this.layer);
- // 创建动作
- var actionTo = cc.Moveto.create(2,cc.p(this.winSize.width - 40,this.winSize.height - 40));
- var actionBy = cc.MoveBy.create(2,cc.p(40,40));
- var actionByBack = actionBy.reverse();
- // 添加敌人1
- this.enemy1 = cc.Sprite.create(s_enemy_1);
- this.layer.addChild(this.enemy1);
- this.enemy1.runAction(actionTo);
- // 添加敌人2
- this.enemy2 = cc.Sprite.create(s_enemy_2);
- this.enemy2.setPosition(cc.p(40,40));
- this.layer.addChild(this.enemy2);
- this.enemy2.runAction(cc.Sequence.create(actionBy,actionByBack));
- // 添加敌人3
- this.enemy3 = cc.Sprite.create(s_enemy_3);
- this.enemy3.setPosition(cc.p(80,80));
- this.layer.addChild(this.enemy3);
- this.enemy3.runAction(cc.MoveBy.create(2,cc.p(100,0)));
- }
- });
以下是运行结果截图:
今天的关于cocos2d-x v3.3 MoveTo and MoveBy和windows的分享已经结束,谢谢您的关注,如果想了解更多关于Can drag webview to move window in cococa?、Cocos2d 开源社区进军 Windows Phone 7: Cocos2d-x for XNA游戏引擎发布、Cocos2D-Android-1之源码详解:6.ClickAndMoveTest、Cocos2d-html5之MoveTo&MoveBy的相关知识,请在本站进行查询。
本文标签: