2023年1月30日 星期一

cocos2dx-lua 建立滑鼠監聽

重要關鍵字

 EVENT_MOUSE_SCROLL

addEventListenerWithSceneGraphPriority



     if IsPc() then --建立滑鼠監聽

        local listener = cc.EventListenerMouse:create()

        -- listener:registerScriptHandler(handler(self, self.mouseMove), cc.Handler.EVENT_MOUSE_MOVE)

        listener:registerScriptHandler(handler(self, self.mouseScroll), cc.Handler.EVENT_MOUSE_SCROLL)

        local dispatcher = cc.Director:getInstance():getEventDispatcher()

        dispatcher:addEventListenerWithSceneGraphPriority(listener,self.roomList)

    end  

2021年8月27日 星期五

 



void MainHomeLayer::updateWaterFall(float dt)

{

    static float offset = 0;

    if(NULL != _waterFall)

    {

        _waterFall->removeFromParentAndCleanup(true);

    }


    CCSprite* background = (CCSprite*)this->getChildByTag(eMainHomeLayer_Background);

    CCSprite * waterFall = CCSprite::create("img/mainHome/waterfall.png");

    CCTexture2DPixelFormat pixelFormat =  waterFall->getTexture()->getPixelFormat();


    if(kTexture2DPixelFormat_RGBA8888 == pixelFormat ||

       kTexture2DPixelFormat_RGB5A1 == pixelFormat ||

       kTexture2DPixelFormat_RGBA4444 == pixelFormat)

    {

        float scaleX = background->getScaleX();

        float scaleY = background->getScaleY();


        ///Render Texture Begin

        CCSize textrueSize = CCSizeMake(waterFall->getContentSize().width  * scaleX,waterFall->getContentSize().height * scaleY);

        CCRenderTexture* renderTexture = CCRenderTexture::create(textrueSize.width, textrueSize.height, kTexture2DPixelFormat_RGBA8888);

        renderTexture->begin();


        ccBlendFunc blendFunc1 = {GL_ONE,GL_ONE_MINUS_SRC_ALPHA};

        waterFall->setBlendFunc(blendFunc1);

        waterFall->setOpacity(30);

        waterFall->setPosition(CCPointMake(textrueSize.width * 0.5, textrueSize.height * 0.5));

        waterFall->setScaleX(scaleX);

        waterFall->setScaleY(scaleY);

        waterFall->visit();


        ccBlendFunc blendFunc = {GL_DST_ALPHA,GL_ONE_MINUS_DST_ALPHA};

        ccTexParams tp = {GL_LINEAR,GL_LINEAR,GL_REPEAT,GL_REPEAT};

        float PIXRIS_PRR_SECOND_WATER  =  (CCRANDOM_0_1() * 20 + 20) * scaleY;

        CCSprite * water = CCSprite::create("img/mainHome/Water02.jpg");

        water->setBlendFunc(blendFunc);

        water->setScaleX(scaleX);

        water->setScaleY(scaleY);

        water->getTexture()->setTexParameters(&tp);

        water->setTextureRect(CCRectMake(0, -offset, water->getContentSize().width, water->getContentSize().height));

        water->setPosition(CCPointMake(textrueSize.width * 0.5, textrueSize.height * 0.5));

        water->visit();


        renderTexture->end();

        ///Render Texture End


        this->setWaterFall(renderTexture->getSprite());

        this->getWaterFall()->removeFromParentAndCleanup(true);

        CCSize winSize = CCDirector::sharedDirector()->getWinSize();

        this->getWaterFall()->setPosition(CCPointMake(winSize.width * 0.87, winSize.height * 0.8));

        this->addChild(this->getWaterFall(),100);


        offset += PIXRIS_PRR_SECOND_WATER * dt;

    }

}


原文链接:https://blog.csdn.net/zhenyu5211314/article/details/78357156

2021年4月12日 星期一

Visual Studio Code 修改 Tab設定

 https://medium.com/@yujiewang/rails-visual-studio-code-%E4%BF%AE%E6%94%B9-tab%E8%A8%AD%E5%AE%9A-74b0fc748f28


寫Ruby的時候依據慣例會習慣使用 2 個空白來設定縮排
但 Visual Studio Code 預設是使用 Tab 來做縮排的,寬度還是 4
這就需要一些調整啦…

點選 狀態列上的 [空白:4] (這邊因為我已經改完才截圖 所以顯示為2)

選擇 [使用空格鍵進行縮排]

然後選擇定位點長度 2 就完成啦

其實這些設定應該是一樣有存成一個config檔的。
之後有研究到再更新摟。

— 2018 06 18 更新 — 結果發現上述的做法只會修正單檔XD

如果套用完整設定的話
先開啟一個 .rb 後,點選狀態列的 ruby 字樣

點選 進行以 ‘Ruby’ 語言為基礎的設定

就會切換到 User Settings的畫面
在使用者設定底下的 “[ruby]”:{} 區域中 加上
“editor.tabSize”: 2 “editor.insertSpaces”: true 就好啦

畫面中只加了 tabSize是因為左邊的全域設定都已經是 insertSpaces : true了
所以我就沒加了,如果要加多個設定的話記得在中間加上 , 喔 :D

2018年5月10日 星期四

20180510 cocos2d-x 全屏 全螢幕方式

AppDelegate::applicationDidFinishLaunching()函數里

glview = GLViewImpl::createWithRect("NAME", Rect(0, 0, designResolutionSize.width, designResolutionSize.height)); 
改成
glview = GLViewImpl::createWithFullScreen("NAME"); 
就可以全屏

2017年12月20日 星期三

1220 VS2013 使用ramDisk


1. 下載軟體 SoftPerfect RAMDISK 3.4.8

4.0 版取消免費版, home license開始要收費
download 3.4.8免費版要快手,不知majorgeeks幾時推送4.0
http://www.majorgeeks.com/files/details/softperfect_ram_disk.html
3.4.8 另一個download mirror
http://filehippo.com/download_softperfect-ram-disk/71289/

2. 建立RAMDDISK !並且掛載至系統上 範例教學
http://wuhsiublog.blogspot.tw/2015/07/softperfect-ram-disk.html


3. 利用軟體建立 windows 系統暫儲檔

記得暫存檔路徑一定要有目錄
例如 R:\temp

2017年12月8日 星期五

1208 Cocos2dx - Sprite 更換圖片的方法

http://cocos2dx.logdown.com/tags/%E6%9B%B4%E6%8F%9B%E5%9C%96%E7%89%87

自己程式用到的方式有

刪除舊檔
TextureCache::getInstance()->removeTextureForKey(avatarFileName); //檔名加路徑
//增加至CACHE中
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
auto pNewSprite = Sprite::create(avatarFileName); //開檔載入
if (pNewSprite != nullptr)
{
auto pFrame = pNewSprite->getSpriteFrame();
cache->addSpriteFrame(pFrame, stInfo.FileName);
}

新檔案載入

//將大頭照載入cache 中
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
auto pFrame = cache->getSpriteFrameByName(avatar);
if (pFrame == nullptr)
{ //檢查是否已經在cahce
auto pNewSprite = Sprite::create(fileName); //開檔載入
if (pNewSprite != nullptr)
{
TextureCache::getInstance()->removeTextureForKey(avatar);
//cache->addSpriteFramesWithFile(fileName);
pFrame = pNewSprite->getSpriteFrame();
cache->addSpriteFrame(pFrame, avatar);
}
}
if (pFrame != nullptr)
{
logFile(LOG_DEBUG, "Image name %s (%p)", avatar.c_str(), pFrame);
spritePersion->setSpriteFrame(pFrame);
return true;
}

 參考文件資料

網路上常見的兩種方法

基本上網路上的做法為更換掉 Sprite 中的Texture, 或者將 SpriteFrame 中的DisplayFrame 換掉。
但必須得說, 這些做法都相對麻煩, 而且就效率來說與新建一張Sprite的成本, 差距不大。
於是有些時候我會採用下面的做法。

新建一張Sprite, 將裡面的Texture貼回需要替換的Sprite


Sprite *newSprite = Sprite::create("newImage.png");  
oldSprite->setTexture(newSprite->getTexture());

  • 限制: 更換Sprite 的 Texture時, 需要注意如果是更新有相同名稱的圖檔時, 需要先將舊有的 Cache清除, 不然使用相同名稱時, 會取成舊有Cache中的 Texture檔
      Director::getInstance()->getTextureCache()->removeTextureForKey("photo.png");
    

筆者: 好處是不需要額外處理 Texture中的許多細節, 缺點則是多了一個 create 的呼叫, 在有許多圖檔建立時, App會變得很慢, 所以這種作法請千萬不要在需要一次更換很多圖檔時使用。

2017年8月23日 星期三

0823 cocos2d-x 手機連線 相關資料

http://qiankanglai.me/2014/12/02/cocos2dx-assetsmanager/
基於cocos2d-x 3.x版本修改的Assets Manager,加幾行代碼就能實現斷線續傳功能…so easy



bool AssetsManager::downLoad()
{
// Create a file to save package.
const string outFileName = _storagePath + TEMP_PACKAGE_FILE_NAME;
- FILE *fp = fopen(outFileName.c_str(), "wb");
+ ssize_t outFileLength = 0;
+ FILE *fp = fopen(outFileName.c_str(), "rb");
+ if(fp)
+ {
+ fseek(fp, 0, SEEK_END);
+ outFileLength = ftell(fp);
+ fclose(fp);
+ }
+
+ fp = fopen(outFileName.c_str(), "ab");

然後在下面設置curl的地方




curl_easy_setopt(_curl, CURLOPT_FOLLOWLOCATION, 1 );
+ if(outFileLength > 0)
+ curl_easy_setopt(_curl, CURLOPT_RESUME_FROM, outFileLength);
res = curl_easy_perform(_curl);

Android – 判斷手機是否連上網路 (ConnectivityManager)

通常手機在開發網路的應用程式時, 常會定時的去取資料回來 但…倘若目前手機無法對外連線, 則這段動作就會造成手機效能無謂的耗損、與電力的浪費 所以在開發網路型的應用程式時, 首先要做的第一個功課, 便是 「判斷手機目前是否已連線"
而 Android 系統的手機, 目前是否連上網路? 以什麼方式連上網路? (WIFI / 3G…)? 目前網路是否故障中(Failover)? 目前手機是否在漫遊中(Roaming)? 這些相關的資訊, 都存在於 ConnectivityManager 這個類別當中 而使用的方式只需要去向系統取回這個服務即可
1
2
ConnectivityManager CM = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = CM.getActiveNetworkInfo();
而當中要注意到的地方, 是在 NetworkInfo 這段, 倘若你的手機目前不在網路的服務範圍, 也就是說沒有任何方式可以連出去網路 則 CM.getActiveNetworkInfo() 取回的 Reference 會是 Null, 忘了做此判斷的話, 手機則會立刻罷工給你看 (NullPointerException) 而比較常見需要取得的資料如下:
1
2
3
4
5
6
7
info.getTypeName();     // 目前以何種方式連線 [WIFI]
info.getState();        // 目前連線狀態 [CONNECTED]
info.isAvailable();     // 目前網路是否可使用 [true]
info.isConnected();     // 網路是否已連接 [true]
info.isConnectedOrConnecting(); // 網路是否已連接 或 連線中 [true]
info.isFailover();      // 網路目前是否有問題 [false]
info.isRoaming();       // 網路目前是否在漫遊中 [false]
除此之外, 也必需替應用程式設定權限, 不然手機一樣會罷工給你看 (SecurityException) 設定權限的方式則是在 AndroidManifest.xml 裡頭新增底下的權限
1
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

2017年8月18日 星期五

0818 cocos2d-x 如何取得手機型號跟其他資訊(android)

//範例程式碼
proj.android-studio\app\src\org\cocos2dx\cpp\AppActivity.java

增加
import android.os.Build;   // 主機版名稱 String board = Build.BOARD;
public class AppActivity extends Cocos2dxActivity {    
    private static String deviceInfo; //回傳手機型號跟系統版本
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        deviceInfo = this.getDeviceInfo();
    }  
        public static String findDeviceInfo() {
        return deviceInfo;
    }
    /**
     * Get Android node and Android version
     * */
    public String getDeviceInfo()
    {
        TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
  String model = Build.MODEL; //手機型號
String phoneNum = manager.getLine1Number();//本機電話號碼
String sdkVersion = Build.VERSION.SDK;//SDK版本號
String osVersion = Build.VERSION.RELEASE;//Firmware/OS 版本號
return "Phone:" +model + "  OS:" + osVersion;

    }
   
     
}

///參考文章
http://www.cocos2dev.com/?p=208

今天要獲取用戶反饋意見,我默認將用戶的手機號碼上傳了,結果發現並不是所有的手機能拿到本機號碼。找了下發現原是用戶的SIM卡沒有寫入本機號碼導致的。
Android獲取本機號碼:
TelephonyManager phoneMgr = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String phoneNum = phoneMgr.getLine1Number(); 
AndroidManifest.xml中添加權限:
<uses-permission android:name=」android.permission.READ_PHONE_STATE」 />
剛才也說了,手機號碼不是所有的都能獲取。只是有一部分可以拿到。這個是由於移動運營商沒有把手機號碼的數據寫入到sim卡中。
手機型號 Build.MODEL
String MODEL The end-user-visible name for the end product.
sdk版本 Build.VERSION.SDK
String SDK This constant is deprecated. Use SDK_INT to easily get this as an integer.
frimware版本號(系統版本號) Build.VERSION.RELEASE
String RELEASE The user-visible version string.
獲取手機的其他信息:
private void getPhoneStatus(){
TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);      
String model = Build.MODEL; //手機型號
String phoneNum = phoneMgr.getLine1Number();//本機電話號碼
String sdkVersion = Build.VERSION.SDK;//SDK版本號
String osVersion = Build.VERSION.RELEASE;//Firmware/OS 版本號
}
Build中包括 硬件廠商,硬件編號,序列號等很多信息。調用方法也很簡單,和上面類似的。
下面是Google提供的參考表:
StringBOARDThe name of the underlying board, like 「goldfish」.
StringBOOTLOADERThe system bootloader version number.
StringBRANDThe brand (e.g., carrier) the software is customized for, if any.
StringCPU_ABIThe name of the instruction set (CPU type + ABI convention) of native code.
StringCPU_ABI2The name of the second instruction set (CPU type + ABI convention) of native code.
StringDEVICEThe name of the industrial design.
StringDISPLAYA build ID string meant for displaying to the user
StringFINGERPRINTA string that uniquely identifies this build.
StringHARDWAREThe name of the hardware (from the kernel command line or /proc).
StringHOST
StringIDEither a changelist number, or a label like 「M4-rc20」.
StringMANUFACTURERThe manufacturer of the product/hardware.
StringMODELThe end-user-visible name for the end product.
StringPRODUCTThe name of the overall product.
StringRADIOThe radio firmware version number.
StringSERIALA hardware serial number, if available.
StringTAGSComma-separated tags describing the build, like 「unsigned,debug」.
longTIME
StringTYPEThe type of build, like 「user」 or 「eng」.
StringUNKNOWNValue used for when a build property is unknown.
StringUSER

cocos2dx-lua 建立滑鼠監聽

重要關鍵字  EVENT_MOUSE_SCROLL addEventListenerWithSceneGraphPriority      if IsPc() then --建立滑鼠監聽         local listener = cc.EventListenerMouse...