Browsed by
月份:2013年5月

Flash AS3.0 常用函数收集,总有几条你没注意的

Flash AS3.0 常用函数收集,总有几条你没注意的

以下知识点,适合初级和中级Aser,大牛无视!

获得某个实例对象的类名:getQualifiedClassName (实例名字符串表达式);

 

stage.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandle);

function mouseOverHandle(e:Event):void {

     trace(“over”);

     //   返回instance**之类的        

     trace(e.target.name);

     //返回元件名   

     trace(getQualifiedClassName(e.target));

}

 

Math.random();

范围为0~1

如 果想要0~100的话就是

Math.random()*100

随机出 [n,m]范围的随机数

function randRange(min:Number, max:Number):Number {

var randomNum:Number = Math.floor(Math.random() * (max – min + 1)) + min;

return randomNum;

}

 

应用例子:

模拟投银币,即希望得到随机布尔值(true 或 false): randRange(0, 1);

模拟投骰子,即希望得到随机六个值: randRange(1, 6);

输出10个随机数

for (var i = 0; i < 10; i++) {

var n:Number = randRange(1, 10)

trace(n);

}

 

【把数字取至最近的小数点位,即指定精确度】

1. 决定你要取的数字的小数点位数:例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01;

2. 让输入值除以步骤1所选的数字(此例为0.01);

3. 使用Math.round()把步骤2所计得的值取成最近的整数;

4. 把步骤3所得的结果乘以步骤2用于除法的那个值.

例如,要把90.337取成两个小数点位数,可以使用:

trace(Math.round(90.337/0.01)*0.01); //输出:90.34

 

【把数字取成一个整数的最接近倍数值】

例1,这样会把92.5取成5的最近倍数值:

trace(Math.round(92.5/5)*5); //输出:95

例2,这样会把92.5取成10的最近倍数值:

trace(Math.round(92.5/10)*10); //输出:90

 

【private,protected,internal,public访问权限】

private:只能在类本身内部访问,按惯例,命名私有成员时以下划线”_”开头;

protected:可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,按惯例,命名保护成员时以下划线”_”开头;

internal:可以由类本身或者相同包内的任何类访问;

public:可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问.

 

【检查变量类型并返回布尔值】

is

【检查变量类型并返回类型】

typeof

【检查对象类型并返回该对象】

as

【Timer类注意事项】

不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒.

 

【一个函数具有未知个数的参数,用arguments对象或”…(rest)”符号访问它的参数】

注意:使用”…(rest)”参数会使 arguments 对象不可用;

private funciton average():void{

     trace(arguments.length); //输出参数的个数

     // arguments的类型是:object,但可以像访问数组一样去访问它

     trace(arguments[1]); //输出第二个参数

}

private function average(…argu):void{

     trace(argu[1]); //输出第二个参数,argu参数名是自定义的.

}

【隐式的取出方法(getter)和设定方法(setter)】

public function get count():uint {

     return _count;

}

public function set count(value:uint):uint {

     if(value < 100){

         _count = value;

     }else {

         throw Error();

     }

}

【确保类是绝不会有子类,使用final】

 

final public class Example{}

 

【super关键字的使用】

super(); //父类的构造函数,只能在类实例构造函数内部使用

super.propertyName; //调用父类的属性,属性需要声明为public或protected

super.methodName(); //调用父类的方法,方法需要声明为public或protected

 

【在数组中获取最小或最大值】

var scores:Array = [10, 4, 15, 8];

scores.sort(Array.NUMERIC);

trace(“Minimum: ” + scores[0]);

trace(“Maximum: ” + scores[scores.length – 1]);

 

【计算两点之间的距离】

勾股定理: c2 = a2 + b2

假设有两个影片剪辑mc1和mc2,则它们两点间的距离c为:

var c:Number = Math.sqrt(Math.pow(mc1.x – mc2.x, 2) + Math.pow(mc1.y – mc2.y, 2));

【指出容器的显示清单中有多少显示对象】

每个容器都有numChildren属性.

【关于TextField以垂直方式把文字摆在按钮表面中心点的小技巧】

textField.y = (_height – textField.textHeight) / 2;

textField.y -= 2; //减2个像素以调整偏移量

【过滤文字输入】

TextField.restrict = “此处为可输入的内容”;

field.restrict = “^此处为禁止输入的内容”;

restrict属性支持一些类似正则表达式的样式:

field.restrict = “a-zA-z”; //只允许大小字母

field.restrict = “a-zA-z “; //只允许字母和空格

field.restrict = “0-9”; //只允许数字

field.restrict = “^abcdefg”; //除了小写字母abcdefg不允许外,其它都允许

field.restrict = “^a-z”; //所有小写字母都不允许,但是,其它内容都允许,包括大写字母

field.restrict = “0-9^5”; //只允许数字,但5例外

让restrict字符包含具有特殊意义的字母(例如-和^):

field.restrict = “0-9\\-“; //允许数字和破折号

field.restrict = “0-9\\^”; //允许数字和^

field.restrict = “0-9\\\\”; //允许数字和反斜杠

你也可以使用Unicode转义序列,指定允许的内容.例如:

field.restrict = “^\u001A”;

注意:ActionScript有区分大小写的,如果restrict属性设为abc,允许字母的大写形式(A,B和C)输入时会变成小写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内容,脚本可将任何文本放入文本字段中.

【设定输入框的最大长度】

TextField.maxChars:int

【检测播放器版本】

flash.system.Capabilities.version

对于8.5版以前的任何Flash Player版本,这种方法都不适用.

【判断客户端系统】

flash.system.Capabilities.os

【检测播放器类型】

flash.system.Capabilities.playerType

可能的值有:

“StandAlone”,用于独立的 Flash Player

“External”,用于外部的 Flash Player 或处于测试模式下

“PlugIn”,用于 Flash Player 浏览器插件

“ActiveX”,用于 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控件

【检测系统语言】

flash.system.Capabilities.language

【判断用户是否启用了IME(输入法编辑器)】

flash.system.IME.enabled

【检测屏幕的分辨率】

flash.system.Capabilities.screenResolutionX

flash.system.Capabilities.screenResolutionY

【把弹出窗口居中的算法】

X = (舞台宽/2)-(窗口宽/2)

Y = (舞台高/2)-(窗口高/2)

【控制影片配合Player的方式,包括缩放问题】

stage.scaleMode

可供选择值:flash.display.StageScaleMode

【舞台的对齐方式】

stage.align

可供选择值:flash.display.StageAlign

【隐藏Flash Player的右键菜单】

stage.showDefaultContextMenu = false;

【检测系统是否具有音频功能】

flash.system.Capabilities.hasAudio

【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】

flash.system.Capabilities.hasMP3

【检测播放器能 (true) 还是不能 (false) 播放流式视频】

flash.system.Capabilities.hasStreamingVideo

【检测播放器是在支持 (true) 嵌入视频的系统上运行,还是在不支持 (false) 嵌入视频的系统上运行】

flash.system.Capabilities.hasEmbeddedVideo

【检测播放器能 (true) 还是不能 (false) 对视频流(如来自 Web 摄像头的视频流)进行编码】

flash.system.Capabilities.hasVideoEncoder

【显示 Flash Player 中的”安全设置”面板】

flash.system.Security.showSettings();

可供选择项:flash.system.SecurityPanel

 

iOS应用内付费(IAP)开发步骤列表【转】

iOS应用内付费(IAP)开发步骤列表【转】

前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作。步骤繁多,在此把开发步骤列表整理如下。因为只是步骤列表,所以并不含详细的说明教程,需要看教程的新手,可以看我附在最后的一些参考链接。

配置Developer.apple.com

登录到Developer.apple.com,然后进行以下步骤:

  1. 为应用建立建立一个不带通配符的App ID
  2. 用该App ID生成和安装相应的Provisioning Profile文件。

配置iTunes Connect

登录到iTunes Connet,然后进行以下步骤:

  1. 用该App ID创建一个新的应用。
  2. 在该应用中,创建应用内付费项目,选择付费类型,通常可选的是可重复消费(Consumable)的或是永久有效(Non-Consumable)的2种,然后设置好价格和Product ID以及购买介绍和截图即可,这里的Product ID是需要记住的,后面开发的时候需要。如下图所示: 
  3. 添加一个用于在sandbox付费的测试用户,如下图所示。注意苹果对该测试用户的密码要求 和正式账号一样,必须是至少8位,并且同时包含数字和大小写字母: 
  4. 填写相关的税务,银行,联系人信息。如下图所示: 

开发工作(ios端)

1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>

2、 获得所有的付费Product ID列表。这个可以用常量存储在本地,也可以由自己的服务器返回。

3、 制作一个界面,展示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但如果是不带服务器的单机游戏应用或工具类应用,则可以通过向App Store查询获得。我在测试时发现,向App Store查询速度非常慢,通常需要2-3秒钟,所以不建议这么做,最好还是搞个自己的服务器吧。

4、当用户点击了一个IAP项目,我们先查询用户是否允许应用内付费,如果不允许则不用进行以下步骤了。代码如下:

1
2
3
4
5
6
if ([SKPaymentQueue canMakePayments]) {
    // 执行下面提到的第5步:
    [self getProductInfo];
} else {
    NSLog(@"失败,用户禁止应用内付费购买.");
}

5、 我们先通过该IAP的ProductID向AppStore查询,获得SKPayment实例,然后通过SKPaymentQueue的 addPayment方法发起一个购买的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目。否则查询会失败。
- (void)getProductInfo {
  NSSet * set = [NSSet setWithArray:@[@"ProductId"]];
  SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
  request.delegate = self;
  [request start];
}

// 以上查询的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *myProduct = response.products;
    if (myProduct.count == 0) {
        NSLog(@"无法获取产品信息,购买失败。");
        return;
    }
    SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

6、 在viewDidLoad方法中,将购买页面设置成购买的Observer。

1
2
3
4
5
6
7
8
9
10
- (void)viewDidLoad {
    [super viewDidLoad];
    // 监听购买结果
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

- (void)viewDidUnload {
    [super viewDidUnload];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

7、 当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased://交易完成
                NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed://交易失败
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored://已经购买过该商品
                [self restoreTransaction:transaction];
                break;
            case SKPaymentTransactionStatePurchasing:      //商品添加进列表
                NSLog(@"商品添加进列表");
                break;
            default:
                break;
        }
    }

}

- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    // Your application should implement these two methods.
    NSString * productIdentifier = transaction.payment.productIdentifier;
    NSString * receipt = [transaction.transactionReceipt base64EncodedString];
    if ([productIdentifier length] > 0) {
        // 向自己的服务器验证购买凭证
    }

    // Remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    if(transaction.error.code != SKErrorPaymentCancelled) {
        NSLog(@"购买失败");
    } else {
        NSLog(@"用户取消交易");
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
  // 对于已购商品,处理恢复购买的逻辑
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

8、服务器验证凭证(Optional)。如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网络异常情况,iOS端的发送凭证操作应该进行持久化,如果程序退出,崩溃或网络异常,可以恢复重试。

开发工作(服务端)

服务端的工作比较简单,分4步:

  1. 接收ios端发过来的购买凭证。
  2. 判断凭证是否已经存在或验证过,然后存储该凭证。
  3. 将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
  4. 如果需要,修改用户相应的会员权限。

考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。

与苹果的验证接口文档在这里。简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。

苹果AppStore线上的购买凭证验证地址是https://buy.itunes.apple.com/verifyReceipt ,测试的验证地址是:https://sandbox.itunes.apple.com/verifyReceipt

原文:http://blog.devtang.com/blog/2012/12/09/in-app-purchase-check-list/

页游那些事儿

页游那些事儿

本文是转载,作者说出了程序猿的心声啊!

页游么,无非:战争策略、模拟经营、社区养成、休闲竞技、角色扮演、社交游戏 等这几种常见类型。

游戏画面又分为: 3D、2D、2.5D、纯网页、横版。

战斗形式分为:即时、回合、战棋、文字、半即时、卡牌、自动。

游戏题材分为:音乐、武侠、科幻、魔幻、动漫、历史、射击、体育、棋牌、竞速、商业、儿童、格斗、修真、航海、玄幻、仙侠。

平台么:PC、iPhone、iPad、Android、aPad、微端(ps:WP将来也会有)。

页游测试的几个状态我们也得了解:封测、内测、公测、测试、研发中。

一般页游常用的标签有:经营、三国、隋唐、养成、塔防、海贼王、火影、足球、篮球、战机、坦克、军事、交友、Q版、西游、穿越、写实。

一般页游开发公司与运营公司的分成:1:9、2:8(居多)、3:7、4:6(极少)。。。。。再往后是个例了。

说明了一个问题,运营公司都是拿大头的,开发公司拿小的。然而现实是,很多游戏开发好了,但找不到合适的运营商。最终,这款页游就这么失败了。貌似是神仙道还是哪一款啊,本来没有找到运营商,快要破产了,但最终还是奇迹发生了,业绩是相当的那个啥的,大家都知道的,我就不说数字了。

页游么,如果抄袭的话,开发周期相对是很短的,而且相对安全性要好点,因为抄袭的对象往往是页游届最赚钱的游戏之一,抄袭了人家的赢利模式,反正不赚也不会亏多少。相反,如果自主创新研发的话,那不确定因素那就太多了,比如研发周期、技术瓶颈、资金投入、人员动荡、后期推广等系列问题都有可能导致项目的失败。一般的小公司的话,前期创业都是采用抄袭,然后赚了一点现钱,才敢去和大公司一样,自主研发。

页游圈内有个怪现象,就是同一家研发公司,有了一个成功的作品后,很难出第二款很成功的作品,即使有 也是少数。有时候,一款页游肯能是换了几批程序员的修修改改才推到玩家的窗口。

对于开发者来说,跟着小公司创业的话,机遇与风险一样的大。如果一款页游火爆了,那么你以后可以靠着这款游戏的分成、奖金快活好多年,当然前提是你的老板是很大方的。相反呢,没有成功,可能面临的是,项目奖金:无,年终奖金:无,最后呢,没办法,大家都是为了生计,程序员只能跳槽。

现状,大部分页游程序员对自己的现状都是不满意的,原因之一就是加班太多,主要是没有加班费,身为天朝的子民,你懂的。收入么,确实还可以,但其实都是加班加出来的。但话又说回来,搞页游的地方都是大城市,上海、北京、广州、深圳、杭州等。尤其前几个地方,那房价,那消费,程序员那点工资也就不算什么了。如果你的梦想是在这些地方买个房,除非你的游戏很成功很成功,并且你的老板很慷慨。不然的话,买辆车还是有可能的,这就是现实。

所以,作为程序员,赚大钱的可能性会低一点,毕竟是替别人打工么。自己创业的话,又没那么多资金、人脉关系。如果结了婚的话,那压力也就更大了,买不起房到不说。陪老婆孩子的时间都不多。

最后,说一句:程序员,你们辛苦了!(ps:也是对自己说的)

原文链接:页游那些事儿之一