i've been using the iphones that dont have home buttons for the past few years and i still hate them, despite getting used to the gestures. spare a fucking button will you
all my experience as a mobile dev has shown that, outside of supporting accessibility gestures, no one wants gestures. if you use and like gestures for purposes other than accessibility you are in the minority
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality
Anya is LIVE right now
FREE
Free to watch • No registration required • HD streaming
RIP Alien Star Menace, Long Live Alien Star Menace
Sadly, our humble game has been removed from the Google Play Store, and with that it is no longer available on mobile.
Apple & Google *love* to update their app requirements every other week, and it’s a Task to stay on top of them, lest your app be removed. I’ve decided to forego the neverending maintenance that comes with mobile.
But fret not, ASM still lives: we have a PC version on itch.io. It’s totally free and content complete. If you need your Alien Star Menace fix, that’s the place to get it!
In my last blog post, I introduced Crocodile Cat, the one touch mobile game I’ve started working on. The gameplay flow is that of an infinite high score chaser, players see how long they can last without being eaten by a crocodile.
During the game, that player collects coins. When I show the game to my friends I say “yeah, there’s floating coins to collect because why not, it’s a videogame”, but in reality the coins serve an important purpose in the gameplay - they give the player a moment-to-moment objective beyond basic survival and they offer a reward in exchange for some risk.
It’s risky to coin chase in this game, for reasons I’ll go into in a later blog post, but right now I want to talk about the design of coin trails and how they can be used to instruct, tempt and delight the player.
I started creating some coin paths for the players to follow, trails of coins to be collected in sequence. I thought that this was where the core of the game would lie. Coin paths lead the player and feel good to follow, but early play tests showed them to be too difficult for new players who haven’t yet learned how to stay alive! I realised that placing coins near the edges of the screen might be more useful to teach new players survival skills, but play tests showed that new players were even less accurate without a path to follow.
My next step was to create some ‘elbow’ patterns to teach the player. Part coin trail, part survival instruction. This worked well when I played in the editor, but as soon as a tester made a mistake, the design fell apart! My design was too prescriptive, assuming the player would play a certain way, meaning that a slight error caused the game to make very little sense. Adjusting these designs to accommodate different user behaviors resulted in designs that were difficult to ‘read’, the player would not know what to do when presented with entwining coin trails.
Through observing and testing, I realised I was wrong about what constituted a fun level. I realised that even my simple designs were too difficult, and difficult is not fun if you don’t understand your objective yet. I designed larger coin arrangements that were easier to collect at least part of, and changed their behaviour so that they always stick to the edges of the screen. I hope these are good ‘beginner’ levels: they help the player learn the controls relatively safely and offer easy rewards for performance.
These are playtesting much better, patterns being larger means that players are more likely to be on target and get a reward, and players are picking up the survival mechanic much easier as they are more naturally travelling to the edges of the screen.
Playtesting with a variety of different patterns and ideas, I’m now designing ‘difficult’ patterns that present more options to the player as to the path they want to take through the level. Fitting in with the overall game design, I need to make sure that the value of the coins is balanced with the risk involved in obtaining them, and to give the player meaningful choices through these level designs.
This level design process of playtesting and observation has helped me to really understand where the difficulty in my game truly lies, and where the fun lies too. Both of these elements are key to designing a ‘flow’ state, which is the next step in my level design task. I’ll write more about designing a flow state in a future blog post.
i have dry eyes which isn't great for a programmer. tried to look for a mobile app that could help me manage it, but there weren't any, so I gotta make my own.
did research into some frameworks. have used react native and java + android studio before, but that was five years ago. man, software changes so fast.
i'm a big believer in reducing code redundancy, so I want a hybrid framework that compiles to native code. this way, I can write one codebase to support both android and ios with no loss to performance.
react native is tried and true and arguably the longest and best supported hybrid framework there is. a safe choice.
compose multiplatform + kotlin multiplatform is like react native on steroids though. not only does it support mobile platforms, but also web and desktop. and the cross-platform portability is not just for front-end development, so I can write whatever function I need in kotlin and build it to any target.
it's super new though. just became stable for Android in nov 2023. still in alpha for iOS front-end development. can definitely foresee it becoming an industry titan in a few years though.
not sure which one to choose yet, but definitely one of the two.
Today we will consider such not quite common element of the interface as PopUpWindow.
It is present from the first versions of the API, but not as popular as other dialog boxes due to the need for additional configuration, which is not always necessary. But from this it follows its main advantage — wide customizability, you can place anything you want in this element, use it as a notification element or a dialog box, while controlling the display interface completely.
For example, consider an application with one button, which, when clicked, will call PopUpWindow in the form of a CardView with text and a button. So we learn how to call the dialog box and handle events inside it.
In the next lesson, we will also look at the animation of the dialog box and use it in conjunction with the RecyclerView list.
To begin, add a dependency to display CardView in your bulid.gradle
Consider the implementation of PopUpWindow as a separate class for sharing responsibility, create a class PopUpClass and proceed to the analysis of the code
package com.evanbishop.ept.popupwindowtestapp;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class PopUpClass {
//PopupWindow display method
public void showPopupWindow(final View view) {
//Create a View object yourself through inflater
LayoutInflater inflater = (LayoutInflater) view.getContext().getSystemService(view.getContext().LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.pop_up_layout, null);
//Specify the length and width through constants
int width = LinearLayout.LayoutParams.MATCH_PARENT;
int height = LinearLayout.LayoutParams.MATCH_PARENT;
//Make Inactive Items Outside Of PopupWindow
boolean focusable = true;
//Create a window with our parameters
final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
//Set the location of the window on the screen
popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
//Initialize the elements of our window, install the handler
TextView test2 = popupView.findViewById(R.id.titleText);
test2.setText(R.string.textTitle);
Button buttonEdit = popupView.findViewById(R.id.messageButton);
buttonEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//As an example, display the message
Toast.makeText(view.getContext(), "Wow, popup action button", Toast.LENGTH_SHORT).show();
}
});
//Handler for clicking on the inactive zone of the window
popupView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//Close the window when clicked
popupWindow.dismiss();
return true;
}
});
}
}
Now it remains only to add a call to our PopUpClass class to our activity. To do this, create a button click handler and call the PopUpClass class method in it.
package com.evanbishop.ept.popupwindowtestapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create a button handler and call the dialog box display method in it
Button popupButton = findViewById(R.id.buttonPopup);
popupButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopUpClass popUpClass = new PopUpClass();
popUpClass.showPopupWindow(v);
}
});
}
}
Check how our dialog box is displayed, click on the button.
Now let's see if the click processing works in the window itself.
Conclusion
Now you know how to implement your own dialog with your content and can use it in your projects.
In the following lessons we will cover the animation of PopUpWindow and the use of the RecyclerView list item as a detail.
I hope everything was clear, if you have any questions, write to [email protected]
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality
Anya is LIVE right now
FREE
Free to watch • No registration required • HD streaming
The last blog was about pattern design. After testing even more patterns, I found that players enjoy patterns that take the height of the screen, giving them lots of choice and targets to hit. These also allow players to focus on avoiding the jaws if they need to, whilst still collecting coins!
Game flow
This is all well and good, but I decided on designing segments in this way because I wanted to take control of the game’s difficulty, something I'd have difficulty balancing if it was left to chance. Controlling the difficulty is helping me to encourage the players into a flow state, where they are given both challenge and reward over an extended play session.
I'm able to sort my coin patterns into groups and present them to the player in sequence. To allow for an enjoyable experience, I can group them into difficulty - allowing struggling players to practice on patterns that are designed to teach the game. Likewise I can offer greater rewards to players who are willing to play in a riskier style.
Currently, I'm experimenting with a game flow which presets players with two 'easy’ segments first, to get then up to speed. Then it will present one of a group of preset ‘scenarios’ - a group of segments designed and grouped together to elicit a particular play style. Maybe you're tempted close to danger, perhaps you have to aim for the centre of the level, maybe you have plans to follow. Completing one scenario will move you on to the next.
The next related system I hope to develop will give me more control over the presentation of these scenarios, so players are rewarded with the opportunity to relax and score big after completing a difficult segment.
The game is becoming more fun by the moment, which is great! The core concept has always tested well, but by approaching the overall flow design in this way I hope the game will be engaging for a longer time and the different ways to play will be more apparent to the player at an earlier stage.
Want to join the Habitica team? We’re looking to hire a new mobile contractor!
We’re particularly interested in people who have a good understanding of either Android development or iOS development (including knowledge of ObjC and Swift). Bonus points if you also have experience with: Core Data, Reactive Programming (ReactiveCocoa/RxJava), Realm, and Kotlin, as well as familiarity with iOS and/or Android UI design principles, patterns, and best practices. Our ideal dev would be eager to push the limits of what our apps can currently do, with an eye for details, a drive to make their work both technically and visually sound, and an interest in expanding their knowledge of current advancements in the field. Diverse candidates are encouraged to apply!
To apply, send an email to [email protected] with a CV that includes your experience with the items listed above, your Habitica username, and your favorite nerdy pursuit. We can’t wait to hear from you!
Android is an open software platform for mobile development. It uses proven technology like Java, XML and Linux and offers a rich API for application development.