網頁

2013年3月25日 星期一

Cocos2D學習筆記-CCSprite記進相簿中

需求有兩個
  1. 將CCSprite存成檔案
  2. 存到相簿中
查了下資料,做法如下:

CCTexture2D *tx = [sprite1 texture]; //這邊是因為sprite1一直在更新,所以先copy
CCSprite *sprite = [CCSprite spriteWithTexture:tx];
sprite.anchorPoint  = CGPointZero;   //這個一定要有,尤其有更改過時

//先做成texture
CCRenderTexture *renderer = [CCRenderTexture renderTextureWithWidth:sprite.contentSize.width height:sprite.contentSize.height];
            
[renderer begin];
[sprite visit];
[renderer end];

UIImage *newImage = [renderer getUIImage];

//做成UIImage,就可以直接用UIImageWriteToSavedPhotosAlbum存檔
UIImageWriteToSavedPhotosAlbum(newImage,nil,nil,nil);




參考網址:
UIImage from CCSprite (yes I've already searched)
UIImage轉CCTexture2D UIImage轉CCSprite
[IPHONE]將照片儲存到IOS照片相簿(Photo Album)中

Cocos2D學習筆記-複製一個CCSprite

複製一個CCSprite無法直接用copy,要先取得texture再init,如下:


CCTexture2D *texture = [mySprite1 texture];
CCSprite *mySprite2 = [CCSprite spriteWithTexture: texture];


參考網址:
Copy a CCSprite

Cocos2D學習筆記-轉動圖片(使用SneakyJoystick)

使用SneakyJoystick蠻方便的,但我正好要用到SneakyJoystick的底圖是要跟著thumb一塊轉動,但怎計算都發現怪怪的,後來發現差了90度,所以在updatePositions中要改成底下這樣:

if(joystick && thumbSprite) {
    [thumbSprite setPosition:joystick.stickPosition];
    if (joystick.degrees == 0) {
        backgroundSprite.rotation = joystick.degrees;
    }
    else {
        CGFloat angle = joystick.degrees - 90.0f;
        backgroundSprite.rotation = -1 * angle;
    }
}


角度是0時,就直接給0,但不是0時,就轉90度,並加上個負號,這樣就能正常使用了

參考網址:
How do you rotate a CCSprite to face a touch

2013年3月18日 星期一

Javascript學習筆記-javascript字串中insert個字串

原生的javascript程式沒有字串insert的function的樣子(沒找到,有的話跟我說 XD),還蠻簡單的,就如下


String.prototype.splice = function( idx, rem, s ) {
    return (this.slice(0,idx) + s + this.slice(idx + Math.abs(rem)));
};

這樣就可以用了,如下使用

var result = "voo abc".splice(4,0," 111");

參考網址:
JavaScript: How can I insert a string at a specific index

2013年3月15日 星期五

Cocos2D學習筆記-如何從jpeg raw data轉成CCSprite

我的需求:
取得的jpeg raw data轉成CCSprite

做法:
//先取得raw data, 這邊會先copy到別處,是因為我會對data做些處理
uint8_t *imageData = (uint8_t*)malloc(sizeof(uint8_t) * jpegImageSize);
memcpy(imageData, [jpegImageData bytes], jpegImageSize);

//針對jpeg就解碼
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, imageData, jpegImageSize, NULL);
CGImageRef image = CGImageCreateWithJPEGDataProvider(provider, NULL, NO, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);

//初始化貼圖,解析度用iPad
CCTexture2D * tex = [[CCTexture2D alloc] initWithCGImage:image resolutionType:kCCResolutioniPad];
free(imageData);
CGImageRelease(image);

//這樣就可以建sprite了
CCSprite *sprite = [CCSprite spriteWithTexture:tex];



參考網址:
Cocos2d screenShot
CGDataProvider Reference
JPEG Header Format
通过Quartz+Core Image读取JPEG图像的二进制位图
How exactly to make a CGImageRef from an image on disk
CCTexture2D errors in adding images
Using CGDataProviderCreateWithData callback

2013年3月10日 星期日

iOS開發筆記 -UDP socket使用AsyncUDPSocket

在iOS上有個好用的library:CocoaAsyncSocket。我想用的是UDP socket,所以選了AsyncUdpSocket。

先建好一個project,將AsyncUdpSocket.h及AsyncUdpSocket.m複製過去。記得加入CFNetwork.framework

這邊有個地方要注意是,AsyncUdpSocket用的是ARC,若專案沒有設定ARC,則要加入編譯條件:

在項目target -> build phases -> compile sources -> AsyncUdpSocket文件後面加入-fobjc-arc,這是為了使編譯器compile-的時候將此文件在arc的條件下編譯。

新增一個要用到的檔案,例如這邊是example

#import <Foundation/Foundation.h>
#import "AsyncUdpSocket.h"

#define DEFAULT_UDP_TIMEOUT 10;

@interface example : NSObject<AsyncUdpSocketDelegate> {
 
}


-(IBAction)sendData:(id)sender;


@end

#import "example.h"

@interface example() {
   AsyncUdpSocket * __udpSocket;
}

- (void)initialSocket;

@end

@implementation example

#DEFAULT_UDP_TIMEOUT 3000.0f

#DEFAULT_UDP_TAG 1

- (id)init

{
    self = [super init];
    if (self != nil) {
       Byte *byteArray = (Byte*)malloc(sizeof(Byte)*5);
       NSData *data = [NSData dataWithBytes:byteArray length:5];
       [self initialSocket:data];
    }
    return self;
}

-(IBAction)sendData:(NSData*)data sender:(id)sender
{
    [__udpSocket sendData:data withTimeout:DEFAULT_UDP_TIMEOUT tag:DEFAULT_UDP_TAG]; //TAG要一樣,才能在同個頻道
}


- (void)initialSocket:(NSData*)data {
    //初始化udp packet
    __udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
    
    NSError *error = nil;
    
    if (![__udpSocket isConnected]) {
        
        
        ConfigObject *config = [ConfigObject sharedConfigObject];
        
        NSError *error;
        if( [__udpSocket connectToHost:config.ip onPort:config.port error:&error] ) {
            CCLOG(@"Ready");
            
            //觸發回應
            [self sendData:data sender:nil];
            
        }
        else
            CCLOG(@"Fail: %@",error);
    }
}


//以下是AsyncUdpSocketDelegate的function
#pragma mark udp socket

- (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag
{
     NSLog(@"data: %@",);
}

- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error
{
// You could add checks here
}

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock
     didReceiveData:(NSData *)data
            withTag:(long)tag
           fromHost:(NSString *)host
               port:(UInt16)port
{
//    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
     NSLog(@"msg: %@",data);

     [__udpSocket receiveWithTimeout:DEFAULT_UDP_TIMEOUT tag:DEFAULT_UDP_TAG];
return YES; //這行一定要有,否則就會到此結束

}


@end


要傳資料就可以用sendData即可

參考網址:
IOS And AsyncUDPSocket - Tutorial?
CocoaAsyncSocket
iPhone 發送UDP廣播並接收資料
iOS AsyncUdpSocket使用简介
iPhone的Socket编程使用开源代码之AsyncSocket
详解iPhone 下AsyncSocket网络库编程

2013年3月5日 星期二

Cocos2D學習筆記-SneakyInput能Multitouch及Multitouch的設定

SneakyInput很好用,但不知道為什麼就是不能MultiTouch,查了很久,看很多跟CCTouchDelegate及CCStandardTouchDelegate的文件,也動手改了SneakyInput的class內容,但問題一堆,結果其實只要一行,在AppDelegate中,更動glView的屬性即可。即


[glView setMultipleTouchEnabled:YES];


嘖,有夠圈叉,不過還是得想想怎樣在Touches中,找到自己的touch,會比較好

參考網址:
Multitouch SneakyInput?
Cocos-2d CCLayer的触摸响应CCTouchDelegate和CCStandardTouchDelegate 和 CCTargetedTouchDelegate
Cocos2d 2.0 Multi Touch Detection for CCSprite
Dragging multiple sprites in Cocos2d