Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.08.2014, 09:52

Spieleprogrammierung mit Android Studio: Fehler

Hallo,
ich habe mir vor ein paar Tagen ein Buch über Spieleprogrammierung mit Android Studio gekauft & habe direkt begonnen zu programmieren.
Die erste App, die im Buch erklärt wurde, stürzte sofort beim Start ab. Also dachte ich mir ich versuche einfach mal die zweite App zu programmieren. Leider auch hier der selbe Fehler.

Ich bin mir nicht sicher, ob ich den Code hier zeigen darf, weil ich ihn ja aus dem Buch habe :/

Aber vielleicht könnt ihr mir auch nur hiermit helfen:

Quellcode

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
08-11 09:45:12.350  11548-11548/de.philipp.seifenblasen E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{de.philipp.seifenblasen/de.philipp.seifenblasen.MainActivity}: java.lang.RuntimeException: native typeface cannot be made
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
            at android.app.ActivityThread.access$700(ActivityThread.java:154)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5306)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.RuntimeException: native typeface cannot be made
            at android.graphics.Typeface.<init>(Typeface.java:307)
            at android.graphics.Typeface.createFromAsset(Typeface.java:281)
            at de.philipp.tools.BaseGameActivity.addTypeface(BaseGameActivity.java:24)
            at de.philipp.seifenblasen.MainActivity.onCreate(MainActivity.java:42)
            at android.app.Activity.performCreate(Activity.java:5255)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
            at android.app.ActivityThread.access$700(ActivityThread.java:154)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5306)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
            at dalvik.system.NativeStart.main(Native Method)


Ich würde mich über Hilfe sehr freuen :)
MfG Phil

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

11.08.2014, 10:10

Wäre natürlich hilfreich, wenn Du etwas Code zu MainActivity und BaseGameActivity posten würdest. Öffenbar gibt es ja Probleme in MainActivity in Zeile 42.
Nach Stackoverflow.com könnte es sich um einen internen Bug handeln, den man wohl mit einer absoluten Pfadangabe zum Asset umgehen kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

11.08.2014, 10:31

Bin mir nicht sicher ob ich den Code posten darf, weil der ist ja aus dem Buch ist aber ich machs einfach mal:

Einmal die MainActivity:

Quellcode

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package de.philipp.seifenblasen;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.TextView;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import de.philipp.tools.BaseGameActivity;
import de.philipp.tools.SimpleAnimationListener;

import static de.philipp.seifenblasen.R.anim.fade_in;


public class MainActivity extends BaseGameActivity implements View.OnClickListener {

    public static final String TYPEFACE_TITLE = "FantasticFont";
    private ViewGroup container;
    private static final int BUBBLE_MAX = 10;
    private static final float V_MAX = 1f;
    private static final float SIZE_MAX = 128f;
    private Random rnd = new Random();
    private Drawable bubbleDrawable;
    private Set<Bubble> bubbles = new HashSet<Bubble>();
    private ScheduledExecutorService executor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addTypeface(TYPEFACE_TITLE);
        container = (ViewGroup)findViewById(R.id.container);
        bubbleDrawable = getResources().getDrawable(R.drawable.soapbubble);
    }

    private void showStartFragment() {
        container.removeAllViews();
        View start = getLayoutInflater().inflate(R.layout.start, null);
        setTypeface((TextView) start.findViewById(R.id.title),TYPEFACE_TITLE);
        start.findViewById(R.id.start).setOnClickListener(this);
        container.addView(start); Animation a = AnimationUtils.loadAnimation(this, fade_in);
        start.startAnimation(a);
    }



    @Override
    public void onClick(View view) {
        if(view.getId() == R.id.start) {
            Animation a = AnimationUtils.loadAnimation(this,R.anim.pulse);
            a.setAnimationListener(new SimpleAnimationListener() {
              @Override
              public void onAnimationEnd(Animation animation) {
                  startGame();
              }
            });
            view.startAnimation(a);
        }
    }

    private void startGame() {
        container.removeAllViews();
        bubbles.clear();
        for(int i=0; i<BUBBLE_MAX; i++) {
            bubbles.add(new Bubble((FrameLayout) container, scale(V_MAX),
                scale(SIZE_MAX), rnd, bubbleDrawable));
        }
        executor = Executors.newSingleThreadScheduledExecutor();
        executor.scheduleAtFixedRate(moveRunnable, 0, 50, TimeUnit.MILLISECONDS);
    }

    @Override
    protected void onPause() {
        super.onPause();
        executor.shutdown();
        bubbles.clear();
    }

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

    private Runnable moveRunnable = new Runnable() {
        @Override
        public void run() {
            for(final Bubble b : bubbles) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        b.move();
                    }
                });
            }
        }
    };
}


Und dann noch die BaseGameActivity:

Quellcode

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
package de.philipp.tools;

import android.app.Activity;
import android.graphics.Typeface;
import android.os.Bundle;
import android.widget.TextView;

import java.util.HashMap;
import java.util.Map;


public class BaseGameActivity extends Activity {

    private Map<String,Typeface> typefaces = new HashMap<String,Typeface>();
    private float density;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        density = getResources().getDisplayMetrics().density;
    }

    protected void addTypeface(String name) {
        Typeface typeface = Typeface.createFromAsset(getAssets(),name+".tff");
        typefaces.put(name, typeface);
    }

    protected void setTypeface(TextView v, String typefaceName) {
        Typeface t = typefaces.get(typefaceName);
        if(t!=null) {
            v.setTypeface(t);
        }
    }

    protected float scale(float v) {
        return density * v;
    }
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

11.08.2014, 10:53

Jap, das könnte passen. Empfohlen wird bei dem Problem die font-Files in "assets/fonts/yourfile.ttf" abzulegen und entsprechend den Pfad in der App dann auch so zu verwenden: Typeface.createFromAsset(getAssets(),"fonts/"+name+".tff");
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

11.08.2014, 12:01

Klappt immernoch nicht. :/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

11.08.2014, 13:14

Hast Du mal versucht den Font manuell aus einem File (z.B. auf der SD-Karte) zu laden statt aus dem Asset heraus? Bist Du Dir sicher, dass der Name wirklich stimmt inklusive Groß- und Kleinschreibung?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

11.08.2014, 13:14

http://stackoverflow.com/a/16839023

Überprüfe den Pfad zu dem Verzeichnis, auf das in der Datei gezeigt wird. Vergewisser dich, dass die Datei dort drin liegt und nicht durch irgendwelche Permissions vor deiner Anwendung geschützt ist.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

8

11.08.2014, 14:16

Ich bin mir nicht ganz sicher was du meinst.

Bei mir steht in der Zeile auch option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets".

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

11.08.2014, 14:36

Beantwortet meine beiden Fragen allerdings nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

11.08.2014, 14:59

Der Name stimmt. Allerdings weiß ich nicht wie ich das mit der SDCard machen soll.

Werbeanzeige