Pair Up/Penguin Links Flash Game Screenshots
Challenge yourself on the full size Pair Up/Penguin Links game: http://www.penguinlinks.com


PenguinLinks/PairUp flash game launched
Ready for more PenguinLinks/PairUp challenges? Visit http://www.penguinlinks.com
Feature:
- Flash game, open to all users!
- More tiles: Elementary level - 6×12; HighSchool - 7×14; College - 8×16.
- Online scoreboard
Enjoy the game! As usual, write to us (support at clingmarks.com) for feedbacks!
iPhone Game “Penguin Links” Available in Apps Store
Finally, this popular Android game (Pair Up) is available on iPhone apps store now. Since the name “Pair Up” already taken there, we have to use another name “Penguin Links” — we actually like this game a lot! Just search for “Penguin Links” and you will find it. Or follow direct links at:
It has been more than a year since the first version of Pair Up released on Android market. No, it’s not that we don’t love iphone, it’s just because we happen to know Java better — the primary programming language Android uses. Since the game was released, it has become such a success: hundreds of thousands downloads, thousands of reviews (you can find the reviews here ); we have to spent a lot time on fixing bugs, answering questions, adding new features, … But we have never forgotten the iphone users. And finally, it is here! We are confident you will like it; but if you have any question, feel free to write to us from the “Feedback” tab or directly at support@clingmarks.com.
Also, don’t forget to rate the game. We need your support!
Where is the mute button?
For the last 2 Pair Up releases, we took out the mute button from the game menu, and got some questions from our users as to how to mute the game sound. Here’s how: use your phone’s volume controller.
A bit more explanation as to why we made this change: the popup menu with 4 items (hint, shuffle, pause, and mute) takes too much estate: almost 1/3 of the screen, which blocks too much of the board. Reducing it to 3 items will allow them to fit in one line and only take 1/6 of the screen. Plus, less items in the menu will make it easier and faster for users to locate and click on the intended item.
Let us know what you think: support@clingmarks.com
Pair Up Bug Fixed
Thanks to our enthusiastic players: the bug during board shuffling is now fixed. Please download the latest Pair Up (free version 5.2, pro version 5.3) and give it a try!
Let us know if you have any feedback: write to us support@clingmarks.com or follow us on twitter: @clingmarks.
Pair Up Is Now Android 1.5 Compatible!
Good news to those android 1.5 device users (Sprint, etc.): Pair Up is now available on your android market! Go check it out! If you already have “Pair Up 1.5″ installed, convert to Pair Up now which will be continuously supported.
Stay tuned: we have more features coming soon! Enjoy the game!
New scoreboard for Pair Up game
As you might have noticed, we updated the Pair Up Scoreboard to reflect the last 30 days records. The old scoreboard is getting rather static these days: it becomes harder and harder to be in top 50. We hope this change will encourage you to play more SAT/GRE levels, and enjoy more of this game from the competition of other players!
Ad Mixer (II) - How to mix Quattro Wireless Ads, AdMob Ads, and your own clickable Ads
What an impressive long blog title!
Quattro Wireless Ads has slightly better eCPM than AdMob, and it allows your to put a default image Ads (not clickable). However, its fillrate is unbearably low (50% ~ 90%, typically around 75%, according to my 2 week test). Here, I’m showing you a way to mix Ads from Quattro Wireless, AdMob, and your own Ads.
For information about how to setup Ads on android apps using Quattro Wirelss, click here.
Step 1: Prepare your own banner ads.
Setp 2: Add the following Ads banner in your layout xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <FrameLayout android:layout_width="fill_parent" android:layout_height="50dp" android:gravity="top"> <ImageView android:id="@+id/ownads" android:src="@drawable/banner_ad" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.admob.android.ads.AdView android:id="@+id/adMob" android:layout_width="fill_parent" android:layout_alignParentTop="true" android:layout_marginTop="10dp" android:layout_height="fill_parent" /> <com.qwapi.adclient.android.view.QWAdView android:id="@+id/QWAd" android:layout_width="fill_parent" android:layout_height="fill_parent" qwad:siteId="xyz" qwad:publisherId="xyz" qwad:mediaType="banner,text" qwad:displayMode="autoRotate" qwad:placement="top" qwad:animation="fade" /> </FrameLayout> |
Step 3: Implement Quattro’s AdEventsListener so that it always try Quattro’s ads first; if that fails, try Admob, which upon failure will display your own clickable Ads.
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 52 53 54 55 56 57 58 59 60 61 62 63 | import android.content.Context; import android.os.Handler; import android.os.Message; import android.view.View; import com.admob.android.ads.AdView; import com.qwapi.adclient.android.data.Ad; import com.qwapi.adclient.android.data.Status; import com.qwapi.adclient.android.requestparams.AdRequestParams; import com.qwapi.adclient.android.view.AdEventsListener; import com.qwapi.adclient.android.view.QWAdView; public class AdListener implements AdEventsListener { private QWAdView qwAdView; private AdView adMobView; public AdListener(MainActivity context) { qwAdView = (QWAdView) context.findViewById(R.id.QWAd); adMobView = (AdView) context.findViewById(R.id.adMob); } @Override public void onAdClick(Context arg0, Ad arg1) { } @Override public void onAdRequest(Context arg0, AdRequestParams arg1) { } @Override public void onAdRequestFailed(Context arg0, AdRequestParams arg1, Status arg2) { Message.obtain(hideHandler, -1).sendToTarget(); } /** Hide Quattro and request Ads from AdMob when Quattro returns no Ads. */ protected Handler hideHandler = new Handler() { @Override public void handleMessage(Message msg) { qwAdView.setVisibility(View.GONE); adMobView.requestFreshAd(); } }; /** Display Quattro banner when it returns an Ads. */ protected Handler showHandler = new Handler() { @Override public void handleMessage(Message msg) { qwAdView.setVisibility(View.VISIBLE); } }; @Override public void onAdRequestSuccessful(Context arg0, AdRequestParams arg1, Ad arg2) { Message.obtain(showHandler, -1).sendToTarget(); } @Override public void onDisplayAd(Context arg0, Ad arg1) { } } |
Setp 4: Change your activity to include this:
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 | private static final Uri SAME2D_URI = Uri.parse("market://search?q=pname:com.clingmarks.same2dfree"); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ... ImageView pairupAds = (ImageView) findViewById(R.id.ownads); pairupAds.setOnClickListener(adsListener); // Configures AdMob's Ads AdView ad = (AdView) findViewById(R.id.ad); if (ad!=null){ // Show own ads when there's no AdMob Ads. ad.setGoneWithoutAd(true); // Don't auto request Ads: only do so when Quattro failed. ad.setRequestInterval(0); } // Configures Quattro's Ads AdListener adListener = new AdListener(this); QWAdView qwAdView = (QWAdView) this.findViewById(R.id.QWAd); qwAdView.setAdEventsListener(adListener, false); // whether the listener should run in UI thread. } // Own ads click listener. private View.OnClickListener adsListener = new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW, SAME2D_URI); startActivity(intent); } }; |
Done!
p.s. After the initial post of this blog, Quattro contacted me about the misuse of second parameter in qwAdView.setAdEventsListener method (I was setting it as true which caused significant UI delaying). Thanks for that! I also hope Quattro can provide useful Javadoc as I can’t find them anywhere.
Ad Mixer (I) - How to mix AdMob Ads and your own clickable Ads
If you are an AdMob publisher, you will know how fluctuating their fillrates are: mine varies from 40% to 100%. What’s even worse is that they don’t support default Ads. So I decide to mix in mine:
For information about how to setup Ads on android apps using AdMob, click here.
Step 1: Prepare your own banner ads (320×50 or 480×50. Note AdMob’s ads has a fixed height of 50 pixels).
Step 2: Replace your AdView with the following framelayout in your layout xml:
1 2 3 4 5 6 7 8 9 10 11 12 | <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <ImageView android:id="@+id/ownads" android:src="@drawable/banner_ad" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.admob.android.ads.AdView android:id="@+id/ad" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" app:backgroundColor="#000000" app:textColor="#FFFFFF" /> </FrameLayout> |
Step 3: Change your activity to include this:
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 | private static final Uri SAME2D_URI = Uri.parse("market://search?q=pname:com.clingmarks.same2dfree"); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ... ImageView pairupAds = (ImageView) findViewById(R.id.ownads); pairupAds.setOnClickListener(adsListener); AdView ad = (AdView) findViewById(R.id.ad); if (ad!=null){ // Show own ads when there's no AdMob Ads. ad.setGoneWithoutAd(true); ad.setRequestInterval(60); // Make the ad disappear with the text or a new ad appear. ad.requestFreshAd(); } } private View.OnClickListener adsListener = new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW, SAME2D_URI); startActivity(intent); } }; |
Done!


Recent Comments