1

In Android Studio entwickle ich ein Spiel, in dem ich meine Animation mit 60fps unter Verwendung eines SurfaceView-Objekts zeichne. Ich benutze ein halbtransparentes Bild als oberste Ebene, um die Ränder des Spielfeldes zu verbergen - eine Art "Nebel des Krieges" -Effekt, so dass der Spieler nicht weiß, was er jenseits der Schatten erwarten kann.Kann ich eine feste Ebene über eine benutzerdefinierte Leinwand legen?

Mein Problem ist, dass ich dieses Schattenbild für jedes Bild zeichnen muss, auch wenn der Schatten sich nie ändert oder bewegt, auch wenn das Spielfeld nach rechts/links/oben/unten scrollt. Und es ist ein Vollbild, also verlangsamt es das Spiel zum Crawlen.

Gibt es eine Möglichkeit, ein einmaliges Overlay ONCE auf der animierten benutzerdefinierten Leinwand zu erstellen? Ich möchte auch mit der Leinwand darunter interagieren, als ob die Überlagerung nicht vorhanden wäre.

sample fogs-of-war effect

+0

Vielleicht ist es möglich, eine andere Ansicht zu verwenden, die genau über der Ansicht mit der benutzerdefinierten Leinwand positioniert ist. Diese Ansicht kann den "Schatten" als Hintergrund haben. – 0X0nosugar

+0

Zeichne einfach oben drauf mit der gleichen Leinwand – Zoe

Antwort

0

Haben Sie versucht, eine Vollbild-Image über Ihre Oberflächenansicht und Einstellung der „Nebel des Krieges“ Bild dazu, so sollte sie einmal ziehen (dies den Hintergrund geht davon aus Ihrer „Nebel des Krieges ist transparent").

Wenn Sie etwas ausgefallenere dann ViewOverlay sollten Sie decken, aber mein Verständnis ist, wird verwendet, wenn einzelne Ansichten wollen außerhalb ihrer Grenzen für Animationen zeichnen, wie Sie Vollbild-Oberfläche Ansicht verwenden diese nicht notwendig sein sollte

https://developer.android.com/reference/android/view/ViewOverlay.html

Auch kein Grund, warum Sie nicht eine Oberflächenansicht über eine Oberflächenansicht kleben können. Eine für den Nebel des Krieges/Screen-Effekte, eine für die Spieloberfläche.

+0

Ich ringe immer noch damit, obwohl deine Lösungen klingen. Ich muss nur den richtigen Platz in der SurfaceView finden, wo das Bild nicht von der Leinwandzeichnung überlagert wird. Etwas zusätzliches Lernen von meiner Seite ist erforderlich. ViewOverlay ist möglicherweise eine bessere Lösung, aber ich bin verpflichtet, dies für die JellyBeaners zu kodieren. ViewOverlay funktioniert nur für API-Stufe 18 und höher. –

1

Basierend auf der Antwort von Thomas Stevens recherchierte ich meine Optionen für die Überlagerung meiner SurfaceView mit einem ImageView. Meine Lösung besteht darin, ein FrameLayout hinzuzufügen, das das benötigte ImageView enthält. (Auf diese Weise kann ich zusätzliche Ansichten einfach auf das Overlay hinzufügen, indem Sie das Layout XML-Update.)

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //temporarily set the view to the overlay layout to gain access to the frame 
    setContentView(R.layout.overlay_game); 
    FrameLayout overlayLayout = (FrameLayout)findViewById(R.id.gameOverlayFrame); 

    //set the final view to the active game surface (a Java-coded SurfaceView object) 
    setContentView(new GameSurface(this)); 
    //add the overlay view on top of the game surface view 
    addContentView(overlayLayout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT)); 
} 

ich nicht behaupten, dass dies die Lösung zu sein ... nur derjenige, der für mich arbeitet.

Verwandte Themen