Pair Up/Penguin Links Flash Game Screenshots

By admin | Jul 15, 2010

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

menupage
gamepage

PenguinLinks/PairUp flash game launched

By admin | Jul 14, 2010

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

By yuchen | Jun 20, 2010

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:

Penguin Links: http://itunes.apple.com/us/app/penguin-links/id377343234?mt=8

Penguin Links Free: http://itunes.apple.com/us/app/penguin-links-free/id377344958?mt=8

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?

By admin | May 17, 2010

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

By admin | May 17, 2010

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.

We are on twitter now!

By admin | May 11, 2010

Follow us on twitter: @clingmarks

Pair Up Is Now Android 1.5 Compatible!

By admin | Apr 25, 2010

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

By admin | Feb 23, 2010

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

By admin | Jan 31, 2010

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

By admin | Jan 31, 2010

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!

© 2007 - 2009 ClingMarks