Hilfe bei OnClick()

  • 6 Antworten
  • Letztes Antwortdatum
S

schornstein

Neues Mitglied
0
Hallo Leute.
Ich bin noch ein neuling in Sachen Java und Android und brauche Hilfe bei der OnClick Methode. Hier der Code:

Code:
//C:\Dokumente und Einstellungen\Admin\workspace

package de.androidnewcomer.mueckenfang;

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

public class GameActivity extends Activity implements Runnable, OnClickListener {

    private static final int INTERVALL = 100;
    private static final int ZEITSCHEIBEN = 100;
    private  int regZeit = 0;
    private Random zufallsgenerator = new Random();
    private Handler handler = new Handler();
    private FrameLayout spielbereich;

    private int punkte;

    private int munition;

    private int zeit;
    private float massstab;
    private Button reload;
    public MediaPlayer mp;
    GameActivity theGameActivity;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game);
        reload = (Button) findViewById(R.id.reload);
        reload.setOnClickListener(this);

        reload.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                mp = MediaPlayer.create(getApplicationContext(), R.raw.reload);
                mp.start();
                munition = 20;
            }
        });

        spielbereich = (FrameLayout) findViewById(R.id.spielbereich);
        massstab = getResources().getDisplayMetrics().density;
        spielStarten();
    }

    private void spielStarten() {
        punkte = 0;
        starteRunde();
    }

    private void starteRunde() {
        munition = 20;
        zeit = ZEITSCHEIBEN;

        bildschirmAktualisieren();
        handler.postDelayed(this, INTERVALL);
    }

    private boolean pruefeSpielende() {
        if (zeit == 0) {
            gameOver();
            return true;
        }
        return false;
    }

    public void gameOver() {

        Intent GameOver= new Intent(this, GameOverActivity.class);
        startActivity(GameOver);
        this.finish();
    }

    private void zeitHerunterzaehlen() {
        zeit = zeit - 1;
        regZeit = regZeit + 1;
        spielbereich.getChildCount();
        if (spielbereich.getChildCount() < 10) {
            eineMueckeAnzeigen();
            moreTime();
        }
        
        bildschirmAktualisieren();
        if (!pruefeSpielende()) {

            handler.postDelayed(this, INTERVALL);

        }
    }

    private void bildschirmAktualisieren() {
        TextView tvPunkte = (TextView) findViewById(R.id.points);
        tvPunkte.setText("Kills: " + Integer.toString(punkte));
        TextView tvRestzeit = (TextView) findViewById(R.id.time);
        tvRestzeit.setText("Time:" + Integer.toString(zeit));
        TextView tvMunition = (TextView) findViewById(R.id.munition);
        tvMunition.setText("Munition: " + Integer.toString(munition));

    }

    private void eineMueckeAnzeigen() {

        int breite = spielbereich.getWidth();
        int hoehe = spielbereich.getHeight();

        ImageView muecke = new ImageView(this);
        muecke.setImageResource(R.drawable.muecke);
        muecke.setOnClickListener(this);
        int muecke_breite = (int) Math.round(massstab * 50);
        int muecke_hoehe = (int) Math.round(massstab * 42);
        int links = zufallsgenerator.nextInt(breite - muecke_breite);
        int oben = zufallsgenerator.nextInt(hoehe - muecke_hoehe);

        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                muecke_breite, muecke_hoehe);
        params.leftMargin = links;
        params.topMargin = oben;

        spielbereich.addView(muecke, params);
    }
    
    private void moreTime() {

        int breite = spielbereich.getWidth();
        int hoehe = spielbereich.getHeight();

        ImageView time = new ImageView(this);
        time.setImageResource(R.drawable.time);
        time.setOnClickListener(this);
        int time_breite = (int) Math.round(massstab * 50);
        int time_hoehe = (int) Math.round(massstab * 42);
        int links = zufallsgenerator.nextInt(breite - time_breite);
        int oben = zufallsgenerator.nextInt(hoehe - time_hoehe);

        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                time_breite, time_hoehe);
        params.leftMargin = links;
        params.topMargin = oben;

        spielbereich.addView(time, params);
    }

    public void run() {
        zeitHerunterzaehlen();
    }

    public void onClick(View muecke) {

        if (munition == 0) {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.leer);
            mp.start();
        } else {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.shoot);
            mp.start();
            punkte++;
            munition--;
            bildschirmAktualisieren();
            spielbereich.removeView(muecke);
        }
    }
    
    }
Wenn ich ein Spiel starte erscheinen 2 verschiedene Imageview: mehrere Muecken-Images und mehrere Time-Images.
Was passiert wenn ich die Muecke berühre könnt ihr ja im code sehen^^.
Aber wenn ich das Time-Image berühre soll meine Zeit erhöht werden, hier komme ich irgentwie nicht weiter. Hab es mit switch-case versucht, hat aber irgentwie nicht geklappt :confused2:.
Kann mir bitte jemand weiterhelfen?:D
 
Prüf mal in der onClick-Methode, ob die View (die du muecke genannt hast) eine Mücke oder eine Time ist, z.B. so:
Code:
public void onClick(View muecke) {
    if (BitmapFactory.decodeResource(getResources(), R.drawable.muecke) == ((BitmapDrawable)((ImageView)muecke).getDrawable()).getBitmap()
    {
        //Es wurde auf eine Mücke geklickt
        if (munition == 0) {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.leer);
            mp.start();
        } else {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.shoot);
            mp.start();
            punkte++;
            munition--;
            bildschirmAktualisieren();
            spielbereich.removeView(muecke);
        }
    }
    else
    {
        //Es wurde auf ein Time-Image geklickt
    }
}
Ich habs jetzt nicht getestet, aber vielleicht kannst du damit schon mal was anfangen :)
 
Danke für deine Antwort^^
Ich bin ein bisschen überfordert mit der 2ten Zeile und geklappt hat es auch nicht;D.
Kann es auch so in der Art funktionieren:

Code:
    public void onClick(View v) {
if (v.getBitmap()==muecke){
        if (munition == 0) {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.leer);
            mp.start();
        } else {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.shoot);
            mp.start();
            punkte++;
            munition--;
            bildschirmAktualisieren();
            spielbereich.removeView(muecke);
        }
    } else
}
    
    }
In dieser Zeile
Code:
if (v.getBitmap()==muecke)
komme ich nicht weiter
 
Versuch doch mal deine Muecke-View und deine Time-View als globale Variable anzulegen.
Anschließend kannst du in der onClick-Methode mit der oben beschriebenen Methode
Code:
if (v == time) ... else if (v == muecke) ...
prüfen, welches Objekt angeklickt wurde.
 
So wie funglejunk es beschrieben hat ist es besser
 
Performanter wäre es sicher noch, wenn du einfach das ClickListener-interface bei deiner Activity rausnimmst, und der (globalen) Muecke- und Time-View jeweils einen eigenen Listener spendierst (so wie du es ja schon beim MediaPlayer gemacht hast).
 
funglejunk schrieb:
Performanter wäre es sicher noch, wenn du einfach das ClickListener-interface bei deiner Activity rausnimmst, und der (globalen) Muecke- und Time-View jeweils einen eigenen Listener spendierst (so wie du es ja schon beim MediaPlayer gemacht hast).


Danke:thumbsup:. Da hätte ich eigentlich auch selber draufkommen können, ich komme mir grad ziemlich dumm vor :D
 

Ähnliche Themen

4
Antworten
10
Aufrufe
1.091
jogimuc
J
Zurück
Oben Unten