存档

2013年5月 的存档

Python概述:C++程序员眼中的Python

2013年5月28日 没有评论

    在C++的程序员眼中,脚本是个奇葩的逻辑。当然也可能我比较奇葩。不过从Lua走过来,python的理解也不那么难。记录一下刚学python要注意的东西,也算是个快速入门吧。如果你是从C++过来的,那你来对地方了。

避免运行脚本闪过可以添加raw_input()。这相当于getline。
在命令行中可以直接键入filename.py来运行脚本。
导入模块用import moduleName。注意没有.py。然后使用moduleName.attr即可使用相应的属性。也可使用from module import attr命令,如此做则可直接使用属性。第一次导入模块时会运行脚本,但第二次导入不会。用reload可以重写导入模块,并运行模块。
交互模式下使用dir(moduleName)可以列出模块中的属性名称。

Python内置对象
数字:
  **表示乘方。
import math导入数学库,可使用pi、sqrt等常用方法。

import random 导入随机数库。
    使用random.random()产生0-1的随机数。也可random.choice([1,2,3,4]),在列表中选择。 
    random.int(1,10),在1到10中产生随机数。
字符串:
    字符串是常量,不可更改,只能重新赋值。
    len()计算长度。支持下标随机访问。
    可以用s[-1]的方式表示倒数,其等效于s[len(s)-1]。
    拆分字符串用分片(slice)机制。 
        形式为X[I:J]。表示取出X中从I到J的内容,左开右闭。
        如果I、J空出来,则分别表示0和len(X)。当然I、J可为负数。

    字符串连接可以用’+’,例如:S = S +’a’。此时S已经创建了一个新对象了。
    字符串查找使用find(),返回偏移量位置。
    字符串替换使用replace返回替换后的串。
    字符串的split使用split函数。分成的结果存入一个列表。
    字符串有基本操作的一些方法,如:upper、isalpha、rstrip等。
    三引号可定义一段复杂文本。这些文字会被转化为相应的串,包含制表符等符号。同时也可用作注释,相当于/***/

帮助:
    dir(变量)的方法可以列出对象的所有属性和方法。具体方法的解释可使用help命令。例如:help(S.index)。

模式匹配:
    import re。具体涉及正则表达式,再查吧。

列表:
    列表能够进行索引,切片等操作,像对字符串一样。例如用[:]、[-1]等。
    列表与数组有些类似,但强大的多。列表没有固定类型的约束,也能按需要增减大小,响应特定操作。有操作如:append、pop、’+’、sort、reverse。
    列表解析通过在一个列表中运行一个表达式而建立一个新的列表。它编写在方括号中,并且有表达式和循环结构。有点像是sql语句。形如:
        [func(value) for value in list [statment]]
    这条语句会将每一个list中的元素赋值给value,检查statment中条件是否符合,然后运行func(value),将其值创建为新列表中的一个项。例如:[row[1] for row in M if row[1]%2 == 0]。

字典:
    表示方法为{key:value,key:value…}。
    value可以是任何数据类型比如列表。内存是自动管理的,不需要释放。
    字典的输出并不是有序的,我推测内部实现方法是树。
    固定顺序输出可先将键排序,再用for key in Keys: 的方法。或直接用sorted()方法。例如:for key in sorted(D): 。

可以通过.has_key判断是否有对应的键。

元组:
不能更改,其它跟列表相似。

文件:
open(filename,weight)。默认权限为’r’,创建或打开文件。write()写入文件。read()读出文件内容。注意只能读一次。

python中,按算符的优先级确定计算顺序。表的操作符中越靠后的优先级越高。当然还是提倡使用括号。

Floor除法。抛弃小数部分之后的除值,即%的商的部分。

python中长整形任意大。当长度超过int时,会自动转换为长整形。

支持位操作。八进制数以0开头,16进制以0x开头。oct(num)、hex(num)、int()可以对数字进行转换。


脚本动态对象实现逻辑:
每一个声明出的变量名并没有实际的类型,变量名是一个void指针,指向对象。另一方面,对象知道自己的类型,每个对象都包含了一个头部信息,标记了这个对象的类型。赋值有三个操作:创建一个对象、创建一个变量、将变量与对象连接。
Python概述:C++程序员眼中的Python
     当变量名指向新对象时,旧对象内存就被回收(这要是能不慢都见鬼了)。

    变量不能指向变量。只能指向对象。因此当两个变量之间赋值时,实际意思是要保持一致。他们实际上共享了对象。这样就不会存在内存访问的问题,代价就是效率低到爆。当原变量更改而不是对象更改时,会产生分歧。因此对于列表L2=L1,当L1中的值改变时,对象变了,变量并没有变,所以L2的值也会变化,如果你不希望这样可以简单的使用分片技术:L2 = L1[:]。如果是字典的话,就要import copy,使用copy.copy()函数了。

    使用"=="操作符,测试两个被引用的对象是否值相同。"is"操作符,检查对象是否指向同一对象。注意小的数字和字符串是在缓存中被复用的。因此is判断会为真。

大概就写这些,以后可能在这里再增加。有必要也会新写一篇,欢迎大家关注。

本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8986698


分类: 未分类 标签:

python的文件操作与异常处理

2013年5月28日 没有评论

 将一些知识点记录一下,有事没事看一眼。

文件读取: open
import os
    os.getcwd() #取得当前的执行路径
    os.chdir('C:/Users/ourgame/Desktop/headFirstPython') #进入某个路径
    
    data = open('sketch.txt')    #打开文件
    print(data.readline(),end='') #读取一行,文件指针会向下移动
    print(data.readline(),end='') #此句与上句输出不一样
    data.seek(0)    #data指针返回到文件起始位置
    for each in data:
        print(each,end='')    #输出整个文件
    data.close() #关闭文件

文件内容的处理:split
   for each_line in data: 
        (role,line_spoken) = each_line.split(':')
        print(role,end='')
        print(' said: ',end='')
        print(line_spoken,end='')

异常处理:try except
python 面对错误的逻辑与其他语言不同。它放任错误的发生并在异常中处理它,并不会在主逻辑中添加更多的逻辑处理。
try:
    data = open('sketch.txt')
 
    for each_line in data:
      #  if each_line.find(":") > -1:
        try:
                (role,line_spoken) = each_line.split(':',1)
                print(role,end='')
                print(' said: ',end='')
                print(line_spoken,end='')
        except ValueError:
            pass
 
except IOError as err:  #使用as将异常对象,并将其赋值给一个标识符
    print('File Error:'+str(err)) #‘+’用于字符串直接的连接
 
finally:
    if 'data' in locals():
        data.close()
或使用with(无需使用finally)
try:
    with open('its.txt','w') as data:
        print("it's...",file=data) #输出默认为sys.stdout
except IOError as err:
    print("File Error:"+str(err)) #str()将对象转换为字符串

with也可以复合使用:
with open("a.txt",'w') as a_out,open("b.txt",'w') as b_out:

pass语句就是Python的空语句或NULL语句,它什么也不做。


    这是一个思路的转变:随之你必须考虑的错误越来越多,”增加额外代码和逻辑“的方案复杂性也随之增加,直到最后可能会掩盖程序的本来作用。而异常处理方案就不存在这个问题,可以一目了然地看出程序的主要作用。
    通过使用Python的异常处理机制,你可以关注代码真正需要做什么,而不必担心哪里可能出问题,并编写额外的代码来避免运行时错误。谨慎的使用try可以让代码更易阅读,更易写,而且可能这是最重要的——出问题时候更容易修正。
    要重点关注你的代码需要做什么。

写文件:以写的模式打开文件

    out = opne("data.txt","w")
    print("test data",file=out)
    out.close()

使用

w : 文件已存在则清空文件内容。
a : 追加到一个文件。
w+: 打开文件读写,不清除。
b : 以二进制操作

检查文件中是否存在某个变量:locals()
if 'data' in locals():
    xxxxxx


调用多个缺省参数时,可指定相应的 参数名=值 来确定某个参数:
print("abc",file=myout)

去除字符串的空格:strip()方法可以从字符串中去除不想要的空格

格式化存储(腌制):pickle、用dump储存、用load恢复
    import pickle
        ......
    with open('mydata.pickle','wb') as mysavedata: #要以二进制操作
        pickle.dump(['a','b'],mysavedata)
        ......
    with open('mydata.pickle','rb') as my_restore_data: #以二进制取
        a_list = pickle.load(my_restore_data)
    print(a_list)    #一旦数据回到程序中,就可以像任何其他数据对象一样操作了
 

其异常的格式为:
except pickle.PickleError as per:
    print("Pickel Error:"+str(per))

做持久化存储,使用pickle的通用文件I/O才是上策。


本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8986616

分类: 未分类 标签:

cocos2d-x 中 Sqlite3 事务(Transaction)操作

2013年5月23日 没有评论


在sqlite3中,事务是没提炼出一个接口。就只好写到sql语句中,不过倒是不太麻烦。

sqlite3_exec ( m_pDB , "begin transaction" , 0 , 0 , & errMsg );

sqlite3_exec ( m_pDB , "commit transaction" , 0 , 0 , & errMsg );

sqlite3_exec ( m_pDB , "rollback transaction" , 0 , 0 , &errMsg );

我将事务操作封装到两个函数中,开始和结束时调用。如果关闭数据库时未结束事务,默认情况是回滚。

函数的定义和实现如下:

	/*
	 *开始一个事物,要在完成事物后调用结束。
	 *
	 *返回为SQLITE_XXX标准宏
	 */
	 int beginTransaction();

	
	/*
	 *结束一个事务。
	 *参数为先前执行sql语句的返回值,即标志成功还是要回滚。
	 *
	 *返回为SQLITE_XXX标准宏
	 */
	 int endTransaction(int sqlResult);


int DataUtil::beginTransaction()
{
	char msg[ERR_LENGTH] = {0};
	char* errMsg = msg;
	int result = sqlite3_exec ( m_pDB , "begin transaction" , 0 , 0 , & errMsg );
	if(result != SQLITE_OK ) 
		CCLog( "开始事务记录失败,错误码:%d ,错误原因:%s/n" , result, errMsg ); 
	return result;
}

int DataUtil::endTransaction(int sqlResult)
{
	if (sqlResult ==SQLITE_OK)
	{
		char msg[ERR_LENGTH] = {0};
		char* errMsg = msg;
		int result = sqlite3_exec ( m_pDB , "commit transaction" , 0 , 0 , & errMsg );
		if(result != SQLITE_OK ) 
			CCLog( "提交事务记录失败,错误码:%d ,错误原因:%s/n" , result, errMsg ); 
		return result;
	}
	else
	{
		char msg[ERR_LENGTH] = {0};
		char* errMsg = msg;
		int result = sqlite3_exec ( m_pDB , "rollback transaction" , 0 , 0 , & errMsg );
		if(result != SQLITE_OK ) 
			CCLog( "回滚事务记录失败,错误码:%d ,错误原因:%s/n" , result, errMsg ); 
		return result;
	}
}

本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8966730



分类: 未分类 标签:

How to get sprites react to touches in cocos2d android?

2013年5月20日 没有评论

i have 1 gun when tap on any point on the screen bullets fires out, but according to my requirement there are 3 guns(sprites) when touched on any of the sprites bullets must fire up, when googled i came to know that this can be done by using targetedTouchDelegate or to loop all the spirites and set flag for each touched sprite, i have seen the code for this in iphone, but could not find for android, please can anybody tell how to use do this in android? or any links or books for cocos2d-android would be useful not only for me to others also. Thanks,

Well what I would do in such a case would be get the rect for my sprite using this

CGRect projectileRect = CGRect
                .make(sprite.getPosition().x
                        - (sprite.getContentSize().width / 2.0f),
                        sprite.getPosition().y
                                - (sprite.getContentSize().height / 2.0f),
                        sprite.getContentSize().width,
                        sprite.getContentSize().height);

and I will detect if the clicked point is in the rectangle of that particular sprite
you can override onccTouchBegan to get the clicked point and then look for the collision

@Override
public boolean ccTouchesBegan(MotionEvent event) {
    // TODO Auto-generated method stub

    CGPoint touchLocation=CGPoint.ccp(event.getX(), event.getY());
    CGRect targetRect = CGRect.make(
            event.getX(),
            event.getY(),
            5,
            5);

        if (CGRect.intersects(projectileRect, targetRect))
                  1st sprite is clicked 

    return super.ccTouchesBegan(event);

}

This is my work around.

分类: stackoverflow精选, unity3d 标签:

CCBAnimationManager的使用:使用cocos2d-x程序控制,由cocosBuilder生成cbbi中的动画

2013年5月16日 没有评论

CocosBuilder能方便的编辑各种动画。大部分动画都是以独立片段的形式存在的。需要由程序来控制何时播放。


管理ccbi文件的动画播放有个专门的类:CCBAnimationManager

大致的逻辑是这样的:

所有的动画以动作的形式存在一个CCArray中。

这个ActionManager管理这些动作。

我们现在想做的无非两件事:控制播放动作,当动作结束时得到通知。


我们在cocosBuilder中设置的默认动作,是当Scene层的OnEnter加载完成,就会播放的。

因此要对其中的元素修改,应在onEnter中进行。

好,现在我们面临的第一个问题是当第一个动作结束时,我如何知道?

在这个类中有这样一个函数:

 void setAnimationCompletedCallback(CCObject *target, SEL_CallFunc callbackFunc);

我们可以这样用:

m_AnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBABC::ThisIsCallBack));

回调函数定义如下:

void ThisIsCallBack();

这样当第一个动作执行完,就会调用这个函数。即使你有一个CCSquence。比如,在cocosBuilder设置了动画链,它也是会被调用的。你唯一要注意的是,这个注册必须在动作结束之前。


好,下面的第二个问题,如何让下一个动作运行。

    void runAnimationsForSequenceNamedTweenDuration(const char *pName, float fTweenDuration);
    void runAnimationsForSequenceNamed(const char *pName);
    void runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuraiton);

同样是在CCBAnimationManager中,它们是播放动画的方法。

name即是你在cocosBuilder起的动画名称。fTweenDuration是两个动画之间的间隔。中间那个函数表示没有间隔。


所以,我们可以这样用:

void CCBAbc::ThisIsCallBack()
{
	//do some change
        //......
	mAnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBAbc::showOutCallBack));
	mAnimationManager->runAnimationsForSequenceNamed("showOut");
}

这样我们就能将一串动作串起来了!


知道了怎么控制动画之后,还有个问题,就是如何把cbbi的CCBAnimationManager找到呢?


这就要从extensions/CCBReader/CCNodeLoader.cpp这个文件说起了。

当调用CCBReader::readNodeGraph方法是,会Load相应的Node。其中会调用:


CCNode * CCNodeLoader::loadCCNode(CCNode * pParent, CCBReader * pCCBReader) {
    CCNode * ccNode = this->createCCNode(pParent, pCCBReader);

    //this->parseProperties(ccNode, pParent, pCCBReader);

    return ccNode;
}

这个方法。可见由ccbi文件读进来的每一个元素,都是通过Loader中的这个方法创建的。

这个方法是什么?

#define CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(T) virtual T * createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader) { /
    return T::create(); /
}

就是创建一个CCNode而已。

我们要做的就是重写这个方法,原理是因为我们要调用CCBReader中的getAnimationManager()这个方法,将得到的manager保存到一个私有变量中就成了。

我这个写到宏里了,凑合看吧  哈

virtual T* createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader)	/
	{	/
		T * pRet = new T();	/
		if (pRet && pRet->init())	/
		{	/
			pRet->autorelease();	/
			pRet->setAnimationManager( pCCBReader->getAnimationManager() );	/
		}	/
		else	/
		{	/
			CC_SAFE_DELETE(pRet);	/
		}	/
		return pRet;	/
	}	/

其中setAnimationManager保存了这个值。

void CCBObject::setAnimationManager(CCBAnimationManager *pAnimationManager)
{
	SAFE_RELEASE(mAnimationManager);
	m_AnimationManager = pAnimationManager;
	SAFE_RETAIN(mAnimationManager);
}

  ok,这样一来就可以操作cbbi中的AnimationManager了,当然也就可以自由控制动画的流程啦~


本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8937210


分类: 未分类 标签:

使用Texture管理cocosBuilder项目资源:纹理文件使用(TexturePacker)

2013年5月16日 没有评论

通常情况下,美工给过来的都是一张一张的切图,但是如果在程序中每用到一次都加载就非常慢了。

所以,一般情况下,切图是不会直接作为资源文件使用的。要将切图打包成一个Texture文件。

其实,就是将分散的各个小图塞在一起,变成一张大图。将具体区域通过XML文件标识。

载入时先弄进来一整张大图,读取时在根据plist文件中相应的xml字段“切”取。

软件使用TexturePacker。下载安装,没什么可说的。

接下来说说具体使用:

我装的是Qt版的。

1、new。新建一个项目,项目文件为tgs。

2、将资源文件整理到一个文件夹中。我一般采用这样的格式:

homepage/

homepage/background.png

homepage.tgs

3、在左侧DataFile处设置导出文件的位置、导出文件的类型(.pvr.ccz)。在下面勾选Trim sprite names。

4、publish。导出一个*.plist、一个*.pvr.ccz。


如果之前你的导出文件路径是项目的资源位置的话,还需要手动将这两个文件复制到cocosBuilder的texture文件夹下。


现在,在cocosBuilder中就可以通过选择相应的Texture文件中的部分来管理资源了。



本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8937076


分类: 未分类 标签:

boost format字符串格式化

2013年5月15日 没有评论

这个类是个小的实用类,提供更安全的格式化字符串操作。

基本用法:

  
    boost::format fmt("aaa %1% bbb ");
    fmt % "haha";

当然 它也支持一些 printf 的格式操作,例如:

  
    boost::format fmt("aaa %s bbb ");
    fmt % "haha";

 %05d : 输出宽度为5的整数,不知用0填充。

%-8.3f: 输出左对齐,总宽度为8,小数位3位的浮点数。

% 10s: 输出10位的字符串,不足位用空格填充。

%05X : 输出宽度为5的大写16进制整数,不足位用0填补。

另外还支持 %|spec| 格式 ,它与%spec没有功能上的区别,只是看的更清楚了。

具体可见下面的例子:

#include <boost/format.hpp>
#include <iostream>
using namespace std;

int main()
{
	char* COLOM_KEY = "Name";
	char* tableName ="player";
	char* key = "boost";
	boost::format fmt("select %1% from '%2%' where %1% = '%3%'");
	fmt % COLOM_KEY % tableName % key;

	std::string finalstr = fmt.str();
	const char* str = finalstr.c_str();

	cout<<str<<endl; //只是为了展示如何转换为char*

	boost::format fmt2("%s:%d + %d = %d/n");
	fmt2%"sum"%1%2%(1+2);
	cout<<fmt2.str();
	cout<<boost::format("%s:%d + %d = %d/n")%"sum"% 1 % 2 % (1+2);

	boost::format fmt3("%05d/n%|-8.3f|/n%| 10s|/n%05X/n");
	cout<<fmt3%62 %2.236%"123456"%15;

	getchar();
	return 0;
}

输出为:

select Name from 'player' where Name = 'boost'
sum:1 + 2 = 3
sum:1 + 2 = 3
00062
2.236
    123456
0000F

本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8932125

分类: 未分类 标签:

How to display Parabolic Motion and how to find Final Position of a Sprite in Cocos2D [closed]

2013年5月3日 没有评论

I want to move a sprite with swipe gesture, with any angle and any speed depends upon the swipes from the user and it end with trajectory. According with the swipe angle and power, how find the final position at where sprite reaches? and how display parabolic movement?

Please check this image for more clarification How to display Parabolic Motion and how to find Final Position of a Sprite in Cocos2D [closed]

My answer to same question :)

http://www.cocos2d-iphone.org/forum/topic/220434

For trajectory tracking and Position prediction check the following links

http://www.cocos2d-iphone.org/forum/topic/10862

http://www.cocos2d-iphone.org/forum/topic/15007

分类: cocos2d, stackoverflow精选 标签: