Monday, December 19, 2011

Our game "ChickenEggs" has got it's first 100,000 downloads reached!!!

Thank you all, Our game "ChickenEggs" has got it's first 100,000 downloads reached!!! W_W

Thank you again, I love you all.

Thursday, December 8, 2011

ChickenEggs Android version just have one further place than Fruit Ninja !

今天成績還不錯…剛好贏切水果一個名次…

Today's place is not bad, just have one further place than Fruit Ninja!

^_^

ChickenEggs_Android_One_Furthur_Place_Than_FruitNinja

Wednesday, December 7, 2011

ChickenEggs 1.3 updated

這次是真的了…小雞爆蛋(ChickenEggs) 1.3版發佈了…請大家努力更新吧…XD~

It's true, "ChickenEggs" has 1.3 version update, guys, go to grab your updates. XD~

https://market.android.com/details?id=com.zhihmeng.ChickenEggsX

Tuesday, December 6, 2011

ChickenEggs gets 10th place on Android Market...

終於…我們前十名了(雖然有點取巧的是在Top New Free的排名裡)…

Finally, we get a good place at 10th, although it's top new free. ^^

ChickenEggs_Android_TopNewFree_10th_Place

Tuesday, November 8, 2011

OpenFeint and Admob integrated with cocos2d-x...

Cocos2d is a great game framework on iOS, and I do implement a game using that on iOS.
My game "ChickenEggs" : http://itunes.apple.com/app/id446767688

Free Version:http://itunes.apple.com/app/id487067895

But after a while, my friends ask me, where is the android version of your game ?
Yeah, I told to myself, why not get a android version ?

I start to try to find a soultion for porting cocos2d game to android, and I found cocos2d-x - a c++ based cocos2d engine porting, supports multiple platforms including iOS/Android/Win32.
Well, it seems will be my perfect way to port iOS game to Android.
But after I start and almost finish the game logic part, I found suddenly that there is no Game Center on Android.

I start google again, and find a replacement named OpenFeint, but it comes with nightmare to me !!!
Because OpenFeint is a android jar package, and it based on java programming, the cocos2d-x is c++ based, and if you want they to communicate with each other, you need NDK/JNI.
I am not familiar with JNI at all, so I start google and google again, do some try and error to find the workable solution.

Finally, I get it works, and here is how it works.

BTW, you can direct use my code, it's a complete version.
I am lazy, so I always wish the code comes from internet I can use it right away...^^

First, write the native side functions.

Header

//
// OFJNIFunctions.h
// ChickenEggsX
//
// Created by Simon Lin on 2011/10/23.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#if 1
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include "cocos2d.h"
#include
/* Header for class com_zhihmeng_ChickenEggsX_OFJNIFunctions */

#ifndef _Included_com_zhihmeng_ChickenEggsX_ChickenEggsX
#define _Included_com_zhihmeng_ChickenEggsX_ChickenEggsX
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zhihmeng_ChickenEggsX_ChickenEggsX
* Method: nativeSetup
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_zhihmeng_ChickenEggsX_ChickenEggsX_init
(JNIEnv *, jobject,jobject);

class OFJNIFunctions
{
public:
static void showLeaderBoards();
static void showAchievements();
static void showDashBoards();
static void submitScores(int scores);
static void submitEggs(int eggs);
static void unlockAchievements(string achievementid);
static void openURL(string url);
};

#ifdef __cplusplus
}
#endif
#endif
#endif // CC_PLATFORM_ANDROID
#endif

CPP

//
// OFJNIFunctions.cpp
// ChickenEggsX
//
// Created by Simon Lin on 2011/10/23.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
#if 1
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include "OFJNIFunctions.h"

using namespace cocos2d;

JavaVM *gJavaVM;
jmethodID mid;
jclass mClass;
jobject mObject;

//--------------------------------------------------------------------

JNIEXPORT void JNICALL Java_com_zhihmeng_ChickenEggsX_ChickenEggsX_init(JNIEnv* env, jobject thiz, jobject weak_this)
{
jclass clazz = env->GetObjectClass(thiz);
mClass = (jclass)env->NewGlobalRef(clazz);
mObject = env->NewGlobalRef(weak_this);
return;
}

//--------------------------------------------------------------------

static const char *classPathName = "com/zhihmeng/ChickenEggsX/ChickenEggsX";

static JNINativeMethod methods[] = {
{"init", "(Ljava/lang/Object;)V",
(void *)Java_com_zhihmeng_ChickenEggsX_ChickenEggsX_init},
};

/*
* Register several native methods for one class.
*/
static int registerNativeMethods(JNIEnv* env, const char* className,
JNINativeMethod* gMethods, int numMethods)
{
jclass clazz;

clazz = env->FindClass(className);
if (clazz == NULL) {
// LOGE("Native registration unable to find class '%s'", className);
return JNI_FALSE;
}
if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { // LOGE("RegisterNatives failed for '%s'", className); return JNI_FALSE; } return JNI_TRUE; } static int registerNatives(JNIEnv* env) { if (!registerNativeMethods(env, classPathName, methods, sizeof(methods) / sizeof(methods[0]))) { return JNI_FALSE; } return JNI_TRUE; } //-------------------------------------------------------------------- jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; gJavaVM = vm; int result; // LOGI("JNI_OnLoad called"); if (vm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
// LOGE("Failed to get the environment using GetEnv()");
return -1;
}

if (registerNatives(env) != JNI_TRUE) {
// LOGE("ERROR: registerNatives failed");
goto bail;
}

result = JNI_VERSION_1_6;

bail:
return result;
}

void OFJNIFunctions::showLeaderBoards()
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "showLeaderBoards", "()V");
if (mid!=0)
env->CallStaticVoidMethod(mClass, mid);
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

void OFJNIFunctions::showAchievements()
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "showAchievements", "()V");
if (mid!=0)
env->CallStaticVoidMethod(mClass, mid);
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

void OFJNIFunctions::showDashBoards()
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "showDashBoards", "()V");
if (mid!=0)
env->CallStaticVoidMethod(mClass, mid);
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

void OFJNIFunctions::submitScores(int scores)
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "submitScores", "(I)V");
if (mid!=0)
env->CallStaticVoidMethod(mClass, mid, scores);
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

void OFJNIFunctions::submitEggs(int eggs)
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "submitEggs", "(I)V");
if (mid!=0)
env->CallStaticVoidMethod(mClass, mid, eggs);
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

void OFJNIFunctions::unlockAchievements(string achievementid)
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "unlockAchievements", "(Ljava/lang/String;)V");
if (mid!=0)
{
CCLog("achievementid=%s",achievementid.c_str());
env->CallStaticVoidMethod(mClass, mid, env->NewStringUTF(achievementid.c_str()));
}
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

void OFJNIFunctions::openURL(string url)
{
int status;
JNIEnv *env;
bool isAttached = false;

status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if(status < 0) { // LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL);
if(status < 0) { // LOGE("callback_handler: failed to attach " // "current thread"); return; } isAttached = true; } //----------------------------------------------------------- mid = env->GetStaticMethodID(mClass, "openURL", "(Ljava/lang/String;)V");
if (mid!=0)
{
CCLog("url=%s",url.c_str());
env->CallStaticVoidMethod(mClass, mid, env->NewStringUTF(url.c_str()));
}
//-----------------------------------------------------------

if(isAttached)
gJavaVM->DetachCurrentThread();
return;
}

#endif // CC_PLATFORM_ANDROID
#endif

Second, the Java side:

PS:I modify some static string settings, because they are my OpenFenit environment variables, you need to use yours. ^^

Java Side

public class ChickenEggsX extends Cocos2dxActivity{
private Cocos2dxGLSurfaceView mGLView;
private AdView mAdView;

public static List achievements = null;
public static List leaderboards = null;

static final String gameName = "XXXXXXXX";
static final String gameID = "XXXXXXXX";
static final String gameKey = "XXXXXXXX";
static final String gameSecret = "XXXXXXXX";
static final String leaderboardScoresID = "XXXXXXXX";
static final String leaderboardEggsID = "XXXXXXXX";

protected static final int showLeaderBoardsHandler = 0x101;
protected static final int showAchievementsHandler = 0x102;
protected static final int showDashBoardsHandler = 0x103;
protected static final int submitScoresHandler = 0x104;
protected static final int submitEggsHandler = 0x105;
protected static final int unlockAchievementsHandler = 0x106;
protected static final int openURLHandler = 0x107;
private static Handler OFHandler;

private AdView adView;

private native void init(Object wadk_this);

private static void showLeaderBoards() {
Message message = new Message();
message.what = ChickenEggsX.showLeaderBoardsHandler;
OFHandler.sendMessage(message);
}

private static void showAchievements() {
Message message = new Message();
message.what = ChickenEggsX.showAchievementsHandler;
OFHandler.sendMessage(message);
}

private static void showDashBoards() {
Message message = new Message();
message.what = ChickenEggsX.showDashBoardsHandler;
OFHandler.sendMessage(message);
}

private static void submitScores(int scores) {
Message message = new Message();
message.what = ChickenEggsX.submitScoresHandler;
message.arg1 = scores;
OFHandler.sendMessage(message);
}

private static void submitEggs(int eggs) {
Message message = new Message();
message.what = ChickenEggsX.submitEggsHandler;
message.arg1 = eggs;
OFHandler.sendMessage(message);
}

private static void unlockAchievements(String achievementid) {
Message message = new Message();
message.what = ChickenEggsX.unlockAchievementsHandler;
message.obj = achievementid;
OFHandler.sendMessage(message);
}

private static void openURL(String url) {
Message message = new Message();
message.what = ChickenEggsX.openURLHandler;
message.obj = url;
OFHandler.sendMessage(message);
}

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

// get the packageName,it's used to set the resource path
String packageName = getApplication().getPackageName();
super.setPackageName(packageName);
Map options = new HashMap();
options.put(OpenFeintSettings.SettingCloudStorageCompressionStrategy, OpenFeintSettings.CloudStorageCompressionStrategyDefault);
// use the below line to set orientation
options.put(OpenFeintSettings.RequestedOrientation, android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
OpenFeintSettings settings = new OpenFeintSettings( gameName, gameKey, gameSecret, gameID);

OpenFeint.initializeWithoutLoggingIn(this, settings, new OpenFeintDelegate() { });

init(new WeakReference(this));
OFHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case ChickenEggsX.showLeaderBoardsHandler:
Dashboard.openLeaderboards();
break;
case ChickenEggsX.showAchievementsHandler:
Dashboard.openAchievements();
break;
case ChickenEggsX.showDashBoardsHandler:
Dashboard.open();
break;
case ChickenEggsX.submitScoresHandler:
long scores = msg.arg1;
Score scoresScore = new Score(scores);
Leaderboard scoresLeaderboard = new Leaderboard(leaderboardScoresID);
scoresScore.submitTo(scoresLeaderboard, new Score.SubmitToCB() {
@Override public void onSuccess(boolean newHighScore) { // sweet, score was posted
ChickenEggsX.this.setResult(Activity.RESULT_OK);
}
@Override public void onFailure(String exceptionMessage) {
ChickenEggsX.this.setResult(Activity.RESULT_CANCELED);
}
});
break;
case ChickenEggsX.submitEggsHandler:
long eggs = msg.arg1;
Score eggsScore = new Score(eggs);
Leaderboard eggsLeaderboard = new Leaderboard(leaderboardEggsID);
eggsScore.submitTo(eggsLeaderboard, new Score.SubmitToCB() {
@Override public void onSuccess(boolean newHighScore) { // sweet, score was posted
ChickenEggsX.this.setResult(Activity.RESULT_OK);
}
@Override public void onFailure(String exceptionMessage) {
ChickenEggsX.this.setResult(Activity.RESULT_CANCELED);
}
});
break;
case ChickenEggsX.unlockAchievementsHandler:
new Achievement((String)msg.obj).unlock(new Achievement.UnlockCB () {
@Override public void onSuccess(boolean newUnlock) {
ChickenEggsX.this.setResult(Activity.RESULT_OK);
}
@Override public void onFailure(String exceptionMessage) {
ChickenEggsX.this.setResult(Activity.RESULT_CANCELED);
}
});
break;
case ChickenEggsX.openURLHandler:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse((String)msg.obj));
startActivity(i);
break;
}
super.handleMessage(msg);
}
};

setContentView(R.layout.game_demo);
mGLView = (Cocos2dxGLSurfaceView) findViewById(R.id.game_gl_surfaceview);
mGLView.setTextField((EditText)findViewById(R.id.textField));

// Get the size of the mGLView after the layout happens
mGLView.post(new Runnable() {

@Override
public void run() {
Cocos2dxActivity.screenHeight = mGLView.getHeight();
Cocos2dxActivity.screenWidth = mGLView.getWidth();
}
});

// find AdView
mAdView = (AdView)this.findViewById(R.id.adView);
mAdView.setVisibility(AdView.VISIBLE);
}

@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}

@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}

static {
System.loadLibrary("cocos2d");
System.loadLibrary("cocosdenshion");
System.loadLibrary("game");
}
}

That's all, hope this will help someone, because I got stunk in these for days.
If you have some troubles like me, maybe this simple tour will give you a light.




















One more thing :

If your plan is selling your game free and want to earns some money by Admob.
You may encounter another trouble with surfaceView and AdView.
I am experienced them, so I want to share how I solved this problem.
I will skip all the setup steps, again, I am lazy, and you can find them by google.
In a short word, what I post above contains the Admob code on Activity side.
What you need to add is the layout.
Here we go !

First, make sure you have upgraded your android sdk to 3.2 at least.
I am not sure why, but after I upgraded, the Admob shows up.

Second, modify your res/layout/game_demo.xml like below:

?xml version="1.0" encoding="utf-8"?
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" android:layout_gravity="bottom"

EditText android:id="@+id/textField" android:layout_height="wrap_content" android:layout_weight="0" android:layout_width="fill_parent" /EditText

RelativeLayout
android:id="@+id/ADLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

org.cocos2dx.lib.Cocos2dxGLSurfaceView
android:id="@+id/game_gl_surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/

com.google.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
ads:adUnitId="XXXXXXXXXX"
ads:adSize="BANNER"
ads:loadAdOnCreate="true"/
/RelativeLayout


/LinearLayout

PS1: Please add "<" and ">" by yourself, because when I add these symbols, it will be recognized as XML and doesn't show.
PS2: don't forget to modify the adUnitId to yours. ^_^
PS3: If you know the detail about the layout, you can modify it by yourself. What I post is just a example.

Here all you are.
Hope you guys love this simple guide.

Again, you can find the game "ChickenEggs" based on this guide here :

iOS Version : http://itunes.apple.com/app/id446767688
iOS Free Version : http://itunes.apple.com/app/id487067895
Android Version : https://market.android.com/details?id=com.zhihmeng.ChickenEggsX&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS56aGlobWVuZy5DaGlja2VuRWdnc1giXQ

And, welcome to talk with me here :

MolioApp : http://www.molioapp.com
Facebook : http://www.facebook.com/MolioApp
Twitter : http://www.twitter.com/MolioApp
Weibo : http://www.weibo.com/MolioApp
Sina Blog : http://blog.sina.com.cn/molioapp

Welcome to our variety contact windows

Welcome to our variety contact windows:

Facebook:
http://www.facebook.com/MolioApp

Twitter:
http://www.twitter.com/MolioApp

微博:
http://www.weibo.com/MolioApp

現在可以升級為Android 4.0的台灣機種…

現在可以升級為Android 4.0的台灣機種…最有誠意的是Sony…2011年的都可以升…BTW…之前不是號稱可以有18個月的保證升級?哪去了?

Acer
Iconia Tab A100
Iconia Tab A200
Iconia Tab A500
Iconia Tab A501

Asus
Transformer Prime

HTC
HTC Sensation
HTC Sensation XL
HTC Sensation XE
HTC Rezound
HTC EVO 3D

LG
Optimus 2X

Motorola
Droid BIONIC
Droid RAZR
Xoom

Samsung
Nexus S
Galaxy S2
Galaxy Note
Galaxy tab 10.1
Galaxy Tab 8.9
Galaxy Tab 7.7
Galaxy Tab 7.0 Plus

Sony
Xperia arc
Xperia Play
Xperia neo V
Xperia Pro
Xperia Ray
Xperia mini
Xperia mini Pro

ChickenEggs(小雞爆蛋)有Android的版本了…華麗大旋轉中…

各位朋友們…有Android機器的…請在Market用英文查詢"ChickenEggs"或是中文查詢"小雞爆蛋"或是直接查我的名字"Simon Lin"…都可以找到ChickenEggs的Android版本哦…歡迎大家給予批評指教啦…可以的話…給個五顆星衝一下人氣吧…謝謝大家…啾咪…

https://market.android.com/details?id=com.zhihmeng.ChickenEggsX&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS56aGlobWVuZy5DaGlja2VuRWdnc1giXQ

Tuesday, October 25, 2011

朋友的新書在PCHOME的銷售第五名了耶…請大家多多支持哦…

朋友的新書在PCHOME的銷售第五名了耶…請大家多多支持哦…

http://shopping.pchome.com.tw/?m=item&f=exhibit&IT_NO=DJAA0Y-A58760422&SR_NO=DJAA1Z

Wednesday, October 12, 2011

Tuesday, October 11, 2011

His name is "Mando", the ChickenEggs' name "Mando" comes from him.

His name is "Mando", the ChickenEggs' name "Mando" comes from him.

Mando!!!!!

IMG_2563

Mando, too!!!!!

mando

Thursday, October 6, 2011

姓名學

姓名學

http://itunes.apple.com/tw/app/id464002649?ls=1&mt=8

icon_512x512

命理軟體中,極少有美感作品,但是我們以此為目標,以此為努力的方向。

於是我們設計出了以下四款的行銷用圖,這可是花了我們不少的時間呢。不過很可惜的,Apple Review Team說內文與主旨無關,所以我們被迫要拿掉。只好放在這兒,讓大家看看我們也是曾經努力過的 (拭淚~)。

行銷頁01

行銷頁03

行銷頁02

行銷頁04


子曰:「名正則言順,名不正則言不順,言不順則事不成,事不成則禮樂不興,禮樂不興則刑罰不中」。所以,名字很重要!

姓名除了辨識外,藴藏許多奧祕。命運、性情、運勢好壞是由八字先天注定。在生命歷程中,會因八字運程走勢的變化,而自然產生不同的別名外號。

關於姓名學,要追溯到清末民初,當時日本聖學閣熊崎與桑野二派,學了中國天干數,互相印證了許多人生的現象,學回日本並將發揚,且美其名為「聖學」。姓名學典籍派別眾多,更有不少穿鑿附會與艱深的專有名詞。

既然我們取名字時,都已經是經由八字分析了,我們在軟體使用上,僅需輸入名字即可。不需要生辰八字。

在欄位設計上,我們一向喜歡很簡潔的使用介面,因此僅分為姓、名兩部分,方便輸入單姓雙名、單姓單名、雙姓雙名及雙性單名(如下圖)。

IMG_2518

當然,我們也可以選擇由通訊錄匯入,前提是通訊錄是完整資料囉。

按下「開始算命」後,會有一段動畫(如下圖)。在這兒,我們選用了百家姓來做為動畫的基本元素,利用像流水飛泉般的效果來呈現文字的美感。而且這是用演算法計算出來的效果,每次的動畫效果都會不同。

IMG_2519

經過了短暫的資料讀取時間,畫面會自動切換到算命出來的結果(如下圖)。會有字劃數組成的天地人三才,然而字的筆畫數是按照康熙字典部首加上剩餘筆劃,因此部分字劃會與我們平時書寫習慣比劃有所差異,例如:海棉寶寶的「海」,是「水」「每」,因此算起來是11劃而不是10劃。

IMG_2520

而在解說方面,包括了:貴人方向、財利方向、不利方向、性格、事業、婚姻、家庭、職業、健康狀況及總論。採用捲軸滑動式閱讀,不用按鍵式轉頁,為了增加瀏覽的便捷(畫面擷圖如下)。嗯嗯,海棉寶寶的運勢看起來不錯啊(摸下巴狀~)。

IMG_2523

IMG_2524

IMG_2525

IMG_2526


在修辭的部份,我們儘可能的保持原來的說明,但是有時可能會比較直接。就算是名字的解說有較猛暴的文字,請放心,也未必真的不好,例如:總筆畫數34畫(破家亡身),但不也出了很多達官貴人,因此名字的好壞,仍與本身命格有關。要考慮出生年月日時分。所以,並非結論算出來不好就真的不好喔!

但是針對綽號,如果有數個綽號,有好有壞,我們當然會優先考慮未來僅使用好的綽號,來趨吉避凶,但重點仍是適不適合自己最重要。

因為這軟體是在分析,並非命名。如果是命名,就要針對個人,包含天時、地利、人和以及對於一切的可能、契機都納入考量;甚至根據姓名綽號的不同,對於同一個人來說都會有不同的感受。

例如雙胞胎就是最好的實例,兩人同時出生,就算只是差一分鐘,命運卻是截然不同。一般的論命方法僅以生辰的年、月、日、時為主,然而現在科技發達與事事求是的同時,若要論命精準,須透過人為以刻、以分來做區隔加以精算。簡言之,電腦算命是以數據做規則且快速固定的分析,以此斷定一個人的命與運,雖能達到些許準確,但如同星座每月運勢一般的概括性答案。

另外,我們也提供了歷史紀錄的查詢,可以讓大家快速查詢曾經輸入過的姓名。妳可以在單筆記錄上滑動刪除此筆紀錄。如果你想要全部刪除的話,也可以按右上角的叉叉,就可以全部刪除了(如下圖所示。是的,我愛灌籃高手。)

IMG_2521

世上沒有什麼東西是完美的,雖然我們努力的做到最好,但是可能還是會有所缺漏,畢竟人為論命和電腦仍有很大的差異,我們也會持續針對大家提出的看法作改善,在關於我的部分,可以直接與我們聯繫,並可參考其他生活應用或民俗工藝的軟體。

IMG_2522


不管星座、八字、紫微、姓名學、塔羅、易經、奇門遁甲,希望將其與科技生活結合,加強生活應用體驗與美感。撇開迷信的問題,我們只希望生活更多彩多姿、豐富生動。透過軟體的便利性提供參考可瞭解自己與生活上的建議,也增加些樂趣。

本軟體匯集整理古書籍各門派說法,並針對舊時代不雅字眼進行修飾。提供一個民俗說法讓我們更瞭解自己。偶有用詞猛烈一些,請小心使用!

希望你/妳會喜歡我們為大家帶來的這個不一樣的軟體。

謝謝!

zhihmeng's APP粉絲團:http://www.zhihmeng.com/zhihmengAPP

Steve Jobs (1955-2011)

When I see this on Apple USA Official Website, I just want to keep it a record on my site.

May him rest in peace.

螢幕快照 2011-10-06 上午11.58.08

Wednesday, October 5, 2011

Monday, October 3, 2011

姓名學…古典美的畫面…

因為有人說…姓名學軟體都沒有一個漂亮的界面…所以…我忍不住PO出這一張美麗的姓名學行銷用圖…

PS:目前送審中…敬請期待…

行銷頁01

Monday, September 26, 2011

ChickenEggs NO.1

The crazy guy - "ehsanzh" got a 1983 eggs.

He is cool, I have no idea how he can do this!!!

ChickenEggs NO.1

Monday, September 12, 2011

我们也有微博了…

大家好…我们也成立了新浪微博…

zhihmeng's APP

欢迎大家加我们关注…

不定时会有好康的哦…

谢谢…

(LuckyAngle)回答使用者CLT2010於App Store上面所問的問題…

Question:

使用者CLT2010在APP Store上面問說:

09/04/2011 2030 生門方向為西方,不是南方。
還是這個軟體的Lucky Angle不是生門方向?

Answer:

09/04/2011 2030 為 農曆八月初七 陰七局 壬戌日 戌時
當時生門會辛 主官事疾病後吉 開門會乙 主百事吉
兩者取捨,自然以開門為主

嘿…我們還是很在意使用者的疑問的…
不過App Store沒有一個好的論壇機制…
所以只能回在這兒囉…
有其它的問題…歡迎來我們的粉絲團zhihmeng's APP或是本網站留言…
我們會儘快為大家解答的…
啾咪~

Wednesday, September 7, 2011

(遊戲)ChickenEggs…上吧…把所有的蛋蛋都打成雞雞吧…

(遊戲)ChickenEggs…上吧…把所有的蛋蛋都打成雞雞吧…

ChickenEggs:

mainmenu_art

首先…zhihmeng's APP先謝謝大家的支持…

MapRecordLuckyAngle都有打進Top Paid的前200…

LuckyAngle更勇奪第54名…高過一些我所看過的知名軟體…讓我覺得受精若寵…

(謎之音:雖然那個名次是每天算的…又不是一直都那麼好…)

有朋友在問…zhihmeng's APP做了像MapRecord這種行車記錄器的軟體…同時也做了像是LuckyAngle這種算命運勢的軟體…


MapRecord:
2
IMG_0429

LuckyAngle:
luckyangle3
行銷用圖2-2
這二個的領域會不會差太多了?但其實不瞞大家說…zhihmeng's APP還真是做過一些不同領域的東西…

我們做過超可愛的電子羅盤軟體ChickenCompass


ChickenCompass:
chickencompass_02

同時也做過二本和民俗文化有關的電子書…燈籠秘密(Lantern-TC)金紙圖錄(JossPaperCatalog)


燈籠秘密:
3
4


金紙圖錄:
1
2

在民俗文化的部份…福祿壽工房一直是我們合作的對象…他們所提供關於一些台灣本土民俗文化的內容…是我覺得非常的讚的…

台灣就是需要這樣懂得利用科技的年輕人用實際行動來支持和傳承本土的民俗文化…有空希望大家多上他們的官網去看看…

那接下來我們要做什麼?嘿嘿…之前就有跟大家預告過了…標題上也寫的很清楚了…是的…我們的第一款遊戲ChickenEggs已經上架了…

這款遊戲看似簡單…但是其中的一些小細節…我們可是花了很大的功夫下去處理的…

首先從角色設定開始…我們就不是抱持著粗製濫造的想法…而是想要長期維護和發展成系列作的…

所以…我們從最一開始的角色設定開始…就絕不馬虎…

這是第一版的小雞設定…

小雞

這個…我過不去…我不能用這個版本的東西…重來…(Design的眉頭稍微皺了一下,我感覺案子並不單純!)

於是有了第二版…

小雞2

第二版看起來好了一些…不過…我還是過不去…重來…(Design的眼神有點不耐了,我只好捏著繼續!)

再來就是第三版…

小雞3

這一版…我和Design花了很多時間討論…針對角色的造型以及名字…希望可以聽到名字就聯想到造型…並且中、英文都要有…

這一版我真的覺得挺ok了…不過這次換Design的眼神有點怪怪的了…她說…這個…我過不去…

好吧…所以有了第四版…

小雞4

坦白說…乍看之下…我也看不出改了什麼…不過Design說…立體感、配色、整體的協調感都更好了…

好吧…更好了…我也覺得更好了…(心虛~)

在這樣的堅持之下…我們把五隻主要的小雞角色設計出來了…

1. Chic(奇可)

chic

2. Toby(托比)

toby

3. Art(亞特)

art

4. Mando(曼多)

mando

5. Hulu(呼嚕)

hulu

我們也費了一點巧思…把這五隻小孩們放進ChickenEggs裡…首先是標題畫面的部份…

每次打開進入遊戲…主畫面都會隨機的出現某一隻小雞的待機動作…

Chic:

mainmenu_chic

Toby:

mainmenu_toby

Art:

mainmenu_art

Mando:

mainmenu_mando

Hulu:

mainmenu_hulu

在講完這麼多廢話以及介紹完主畫面後…接下來我們正式來進行遊戲的介紹…(終於…)

以Art版的主畫面為例…在主畫面上…你可以看到有標題、Play以及左下角四顆按鈕…依次為音樂on/off、關於(遊玩說明)、成就和排名…

mainmenu_art

音樂的on/off相信不用介紹了吧…如果嫌背景音樂太吵…不用懷疑…就按下這顆按鍵吧…

接下來讓我們進入遊戲的主畫面…按下Play吧…如果此時你聽到一聲雞的慘叫…你也不用懷疑…那是進入遊戲主畫面的音效…(可愛吧…扭扭~)

進入遊戲後…會有喊Ready -> GO的準備音效…

ReadyGo

然後就進入遊戲畫面了…遊戲內容很簡單…就是一直的按蛋蛋就對了…不同的蛋蛋會出現不同的雞雞…

比如說…這是你按破包有Chic的蛋後…Chic會從蛋中飛出…

chicfly

然後…這是有關卡的…簡單來說…和投籃機的邏輯很像…也就是你要在一定時間內按破固定數量的蛋…然後就可以得到總體時間的增加…

最後時間結束後…你打破的蛋數…以及不同大小的蛋得到分數的總和…這二個就是你的成績…

遊戲畫面如下:

TimeMinus

畫面上方的Scores和Eggs就是你目前累積的分數和蛋數…

左上紅色的Bar是這關剩下要完成的蛋數…右上藍色的Bar是全部剩下的時間…

如果你完成了這關的蛋數…你會看到進入下一關的畫面…以及得到的獎勵時間…

levelup

畫面中的左下按鈕是回到標題畫面…右下是進入下一關卡…

但是如果你時間用完了…那…就會出現這樣的畫面…

Timesup

這時你可以按下左下的按鈕…回到主選單畫面…或是按下右下的Try Again…直接再重來一次…

畫面中顯示的Best就是你玩過最好的成績…上面是分數…下面是蛋數…Now就是你這次的成績…

由於我們設計這款遊戲時…希望講究的不是只有按的快而已…還希望要按的準…

因此在設計上…有設計四款道具…累積時間增加、累積時間減少、寶箱以及炸彈…

二個好的…二個不好的…累積時間增加和減少的道具很直覺的就是時鐘旁邊有一個加號和減號…

寶箱和炸彈也是很直覺…寶箱按了就是會出現滿滿的蛋蛋…讓你按個爽…不過當中也是會隱藏著炸彈和減時間的哦…

TimeMinus

Box

如果不小心按下炸彈的話…嘿嘿…就會出現這樣的GameOver畫面…

Bomb

Boom

介紹完了遊戲主要的內容…讓我們回到主選單畫面…左下方的第二顆按鈕是關於(幫助)的部份…

about

畫面的左下角的第二顆按鈕就是幫助的部份…會有一連串的畫面…簡單的介紹一下遊戲的遊玩方式…(第一次執行遊戲時會強迫出現一次)

help

從這張圖的說明上也可以看到…五顆蛋有五種不同的分數…當然…越小的蛋越難按到…當然得到的分數也就越高囉…

主標題畫面的第三顆按鈕是成就的部份…這邊是利用了Game Center的功能…當完成了一些指定的項目之後…就會解開對應的成就…

Achievements

第四顆按鈕是排行榜的部份…這個部份…也是最讓我熱血的部份…我常常在上面和朋友比賽看誰的蛋數或是分數比較高…

有分Scores和Eggs二個排行榜…

Leaderboards

來看看Scores的排行榜…由於參與的朋友們都比較害羞…所以我把名字給MA掉了…

Leaderboard_Scores

這是Eggs的排行榜…

Leaderboard_Eggs

大家可以看到…我的朋友很少…所以…我可以排到第二名…歡迎大家一起來加我啊…

ChickenEggs的介紹到此…

如果大家覺得這款遊戲還能引起你一點興趣的話…歡迎用行動支持這款純國產的自製小遊戲…








One More Thing…

像一個我這樣的蘋果支持者…身上同時有著iPhone和iPad…應該是再正常不過的事情了…

但是有時買了一個遊戲或是軟體…在iPad上面…還得再買一次所謂的HD版本…可是只不過是畫面放大而已…內容完全沒變…

卻還得多花一筆錢…更重要的是…還比較貴…

因為我們自己討厭這樣的行為…所以…我們不惜成本的把這款遊戲設計成Universal的版本…

是的…Universal…也就是說…你花一次錢…iPhone/iPad/iPod Touch都可以玩…而且在iPad上面…是正常的大螢幕HD畫面…

不是內建的二倍放大的馬賽克畫面…

以往的zhihmeng's APP的其它軟體可能由於當時的開發未臻完善…所以沒有提供Universal的版本…

不過在這款遊戲設計的當下…我們就決定要朝這個方向走了…

雖然程式要多二倍的複雜度去處理邏輯的部份…

雖然Design要多二倍的時間去針對不同比例的解析度輸出不同的圖形(iPad 4:3、iPhone 16:9)…

但是我們還是不惜成本和時間的這樣做了…希望我們對於自有產品的堅持能夠讓你們看到…

也是因為有了iPad的HD版本…我們突然發現…這款遊戲也超適合二個人一起玩的…

那種二個人一起玩的爽快感(作弊感)是非常爽快的…

當你正為自己快、狠、準地按到了寶箱而洋洋得意時…此時朋友不小心按到的炸彈會讓你幹聲連連…

希望你和你的朋友/情人/家人/同學們…能因為這樣而增進彼此的感情…(會不會扯太遠了?)

廢話連篇的最後…歡迎大家有空來我們的官網以及粉絲團坐坐…

zhihmeng's APP粉絲團:http://www.facebook.com/zhihmengAPP

zhihmeng's APP官網:http://www.zhihmeng.com

謝謝大家…