Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Como posso fazer para o pássaro ficar com a base perfeitamente alinhada no chão como no vídeo?

A aplicação está correta e ele fica no chão... Mas a barra preta na parte inferior cobre quase todo o círculo vermelho e parte dos canos também. O mesmo acontece na parte superior.

public void cai() {
        boolean chegouNoChao = altura + RAIO > tela.getAltura();
        if (!chegouNoChao) {
            this.altura += 5;
        }
    }

    public void pula() {
        if (altura > RAIO) {
            this.altura -= 150;
        }
    }
7 respostas

Olá Christoferson,

Você consegue postar aqui uma imagem do problema ?

Posta também o código das suas classes Cano e Passaro, por favor, assim a gente consegue ver melhor como podemos te ajudar.

https://uploaddeimagens.com.br/imagens/emulador-jpg--2

public class Cano {

    private static final int tamanhoDoCano = 250;
    private static final int larguraDoCano = 100;
    private int alturaDoCanoInferior;
    private Tela tela;
    private int posicao;
    private final Paint verde = Cores.getCorDoCano();

    public Cano(Tela tela, int posicao) {
        this.tela = tela;
        this.alturaDoCanoInferior = tela.getAltura() - tamanhoDoCano;
        this.posicao = posicao;
    }

    public void desenhaNo (Canvas canvas){
        desenhaCanoInferiorNo(canvas);
    }

    private void desenhaCanoInferiorNo(Canvas canvas) {
        canvas.drawRect(posicao, alturaDoCanoInferior, posicao + larguraDoCano, tela.getAltura(), verde);
    }


    public void move() {
        this.posicao -= 5;
    }
}
public class Passaro {
    private static final Paint vermelho = Cores.getCorDoPassaro();
    private static final int X = 100;
    private static final int RAIO = 50;
    private int altura;
    private Tela tela;

    public Passaro(Tela tela) {
        this.tela = tela;
        this.altura = 100;
    }

    public void desenhaNo(Canvas canvas){
        canvas.drawCircle(X, altura, RAIO, vermelho);
    }


    public void cai() {
        boolean chegouNoChao = altura + RAIO > tela.getAltura();
        if (!chegouNoChao) {
            this.altura += 7;
        }
    }

    public void pula() {
        if (altura > RAIO) {
            this.altura -= 100;
        }
    }
}

Entendi agora qual o problema. A classe DisplayMetrics do Android devolve o tamanho da tela desconsiderando a barra dos botões que fica na parte de baixo da tela.

Uma forma de resolver isso é executar a aplicação em modo fullscreen. Para isso você vai precisar editar o arquivo style.xml e adicionar as seguintes linhas:

<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>

Com isso a barra inferior não será exibida e os desenhos serão exibidos corretamente.

Uma outra alternativa seria mudar a orientação da sua Activity para o modo paisagem de modo que os botões de navegação fiquem do lado direito da tela. Para isso basta acrescentar um atributo na sua Activity do jogo no AndroidManifest.xml:

<activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait">

Jeferson, tudo bem? Tentei as duas maneiras que me passou, mas nenhuma resolveu o problema. A aplicação aceita os códigos novos mas não ví nenhuma mudança.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cristoferson.jogo">

    <!-- portrait fixa a tela na vetical -->
    <!-- NoActionBar tira a barra superior com o nome do jogo -->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">
        <activity android:name=".MainActivity"
            android:label="@string/app_name" android:screenOrientation="portrait">
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent
            <item name="windowNoTitle">true</item>
            <item name="windowActionBar">false</item>
            <item name="android:windowFullscreen">true</item>
        </item>
    </style>

</resources>
solução!

Ok, tem mais uma coisa que você pode fazer e que pode estar causando o problema.

O arquivo style.xml serve para definir esstilos e temas para o nosso aplicativo. Nele colocamos as preferências como tela cheia, sem action bar, etc e então damos um nome para o nosso tema que nesse caso é AppTheme.

Com o tema pronto, precisamos associá-lo com as nossas activities e para isso utilizamos o AndroidManifest.xml. Só que nesse arquivo, estamos escolhendo um outro tema que não é o tema que foi definido no style.xml. Vamos dar uma olhada nessa linha do manifest:

android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">

Ali conseguimos ver que estamos escolhendo o tema Theme.AppCompat.DayNight.NoActionBar para a nossa Activity! Devemos trocar esse tema para utilizar o AppTheme que ficou definido no style.xml. Então vamos editar o manifest nessa linha para ficar assim:

android:theme="@style/AppTheme">

Verifique se funciona e depois avisa pra gente!

Bom dia Jeferson! Agora sim! Perfeito! Obrigado e espero um dia dominar o assunto como vc! Valeu!