skulls

package module
v0.0.0-...-f6bd53c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 24, 2021 License: GPL-2.0 Imports: 17 Imported by: 0

README

Skulls! A simple Columns-like strategy game developed in Golang with the Ebiten library (for Android)

Google Play Store
ex1
ex2
  • The game was developed as a POC to experience creating a simple game with Go/deploying it to Android
  • The Ebiten library for Golang was used to create the game
  • go-inovation was used as a guide for the ebitenmobile .aar binding
  • All development/debugging was done with the gomobile tool and adb
  • Android Studio should be downloaded/installed; the AVD emulators are free and convenient
  • I use the AVD emulators that are installable with Android Studio and stored in
    $ANDROID_HOME/emulator/emulator
  • It may be helpful to store an alias in your profile to open an emulator via a simple command:
    alias pixel4='$ANDROID_HOME/emulator/emulator -avd "Pixel_4_API_30"'
  • Font used for text: RADIOLAND.TTF
  • All assets/ (images, audio, and font) were converted to []byte using file2byteslice
  • The project is intended to be built with gomobile for development and testing, or with ebitenmobile for production releases using Android Studio
Build .apk for development and testing using gomobile:
  
// 1. Navigate to skulls/ and generate a .apk with gomobile:
gomobile build -target=android github.com/rootVIII/skulls/skullsgomobile



// 2. Install the newly created .apk into an already running Android Emulator:
adb -s <emulator-name> install skullsgomobile.apk

// Note: to list available emulators (including phone connected for debugging):
adb devices -l



// 3. View debug/logging output from the game:
adb logcat
  

Build .aar for Android Studio binding and production release using ebitenmobile:
  
// 1. Navigate to skulls/ and generate the .aar binding:
ebitenmobile bind -target android -javapkg com.<your-username>.skulls -o skulls.aar github.com/rootVIII/skulls/skullsebitenbind



// 2. Create a new Android Studio project (choose Empty Activity) and name it SkullsMobile



// 3. Import the new .aar as a module:
// Select File, New, New Module, Import .jar/.aar Package, select the previously built .aar named skulls.aar
// In app/build.gradle, add this line to the dependencies: compile project(':skulls')
// Example:

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    compile project(':skulls')
}
// Then follow screen prompts to sync the build.gradle change to the project



// 4. Place the following in app/src/main/java/com.<your username>.skullsmobile/MainActivity.java:

package com.<your-username>.skullsmobile;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import go.Seq;
import com.<your-username>.skulls.skullsebitenbind.EbitenView;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Seq.setContext(getApplicationContext());
    }

    private EbitenView getEbitenView() {
        return (EbitenView)this.findViewById(R.id.ebitenview);
    }

    @Override
    protected void onPause() {
        super.onPause();
        this.getEbitenView().suspendGame();
    }

    @Override
    protected void onResume() {
        super.onResume();
        this.getEbitenView().resumeGame();
    }
}



// 5. Add a separate error handling class in app/src/main/java/com.<your-username>skullsmobile/EbitenViewWithErrorHandling.java

package com.solsticenet.skullsmobile;

import android.content.Context;
import android.util.AttributeSet;

import com.<your-username>.skulls.skullsebitenbind.EbitenView;


class EbitenViewWithErrorHandling extends EbitenView {
    public EbitenViewWithErrorHandling(Context context) {
        super(context);
    }

    public EbitenViewWithErrorHandling(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    @Override
    protected void onErrorOnGameUpdate(Exception e) {
        // You can define your own error handling e.g., using Crashlytics.
        // e.g., Crashlytics.logException(e);
        super.onErrorOnGameUpdate(e);
    }
}



// 6. Add the below into app/src/main/res/AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background_material_dark"
    android:keepScreenOn="true"
    android:screenOrientation="portrait"
    tools:context="com.<your-username>.skullsmobile.MainActivity">

    <com.<your-username>.skullsmobile.EbitenViewWithErrorHandling
        android:id="@+id/ebitenview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true" />
</RelativeLayout>



// 7. The game should now be usable in Android Studio (sign the project with developer keys, UI adjustments in AndroidManifest.xml etc.)
  

This was developed on macOS Big Sur.


Author: rootVIII 2021

Documentation

Overview

Package skulls A simple strategy game about skulls Copyright (C) 2021 rootVIII

colleyloyejames@gmail.com

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Index

Constants

This section is empty.

Variables

View Source
var Clock float64

Clock is the global game clock.

Functions

This section is empty.

Types

type Game

type Game struct {
	// contains filtered or unexported fields
}

Game controls overall gameplay.

func Load

func Load() (*Game, error)

Load is the entry point to the game.

func (*Game) Draw

func (g *Game) Draw(screen *ebiten.Image)

Draw the screen every frame (typically 1/60[s] for 60Hz display).

func (*Game) Layout

func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int)

Layout takes the outside/window size and returns the (logical) screen size.

func (*Game) Update

func (g *Game) Update() error

Update proceeds the game state every tick (1/60 [s] by default).

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL