GVKun编程网logo

cocos2d-x v3.3 MoveTo and MoveBy(windows)

17

本篇文章给大家谈谈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)

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?

Can drag webview to move window in cococa?

1. 问题

如果cococa程序,在一个==没有titlebar==的window里只有一个webview,是否能够==拖曳这个webview来拖动整个window==呢?当然,直接拖是不行的,webview会先接受这个拖曳drag事件。

对于window中除webview以外的其他控件,其实可以直接重载NSWindow的mouseDownmouseDragged方法来实现要的效果,但是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游戏引擎发布

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

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之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)

请看下列代码:

  1. var GameScene = cc.Scene.extend({
  2. enemy1: null,// 敌人1
  3. enemy2: null,// 敌人2
  4. enemy3:null,// 敌人3
  5. layer: null,// 布景
  6. winSize: null,// 游戏运行窗口尺寸
  7. onEnter: function () {
  8. this._super();
  9. this.initData();
  10. },
  11. initData: function () {
  12. // 获取尺寸
  13. this.winSize = cc.Director.getInstance().getWinSize();
  14. // 添加布景
  15. this.layer = cc.LayerColor.create(cc.c4(200,200,255),this.winSize.width,this.winSize.height);
  16. this.addChild(this.layer);
  17. // 创建动作
  18. var actionTo = cc.Moveto.create(2,cc.p(this.winSize.width - 40,this.winSize.height - 40));
  19. var actionBy = cc.MoveBy.create(2,cc.p(40,40));
  20. var actionByBack = actionBy.reverse();
  21. // 添加敌人1
  22. this.enemy1 = cc.Sprite.create(s_enemy_1);
  23. this.layer.addChild(this.enemy1);
  24. this.enemy1.runAction(actionTo);
  25. // 添加敌人2
  26. this.enemy2 = cc.Sprite.create(s_enemy_2);
  27. this.enemy2.setPosition(cc.p(40,40));
  28. this.layer.addChild(this.enemy2);
  29. this.enemy2.runAction(cc.Sequence.create(actionBy,actionByBack));
  30. // 添加敌人3
  31. this.enemy3 = cc.Sprite.create(s_enemy_3);
  32. this.enemy3.setPosition(cc.p(80,80));
  33. this.layer.addChild(this.enemy3);
  34. this.enemy3.runAction(cc.MoveBy.create(2,cc.p(100,0)));
  35. }
  36. });

以下是运行结果截图:

今天的关于cocos2d-x v3.3 MoveTo and MoveBywindows的分享已经结束,谢谢您的关注,如果想了解更多关于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的相关知识,请在本站进行查询。

本文标签: