Von Punkt zu Punkt laufen...

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von StefMa, 11.04.2012.

  1. StefMa, 11.04.2012 #1
    StefMa

    StefMa Threadstarter Gewerbliches Mitglied

    Beiträge:
    2,054
    Erhaltene Danke:
    413
    Registriert seit:
    16.10.2010
    Hallo,

    ich habe vor auf meinem Screen 4 Punkte zu haben (Sagen wir mal in jedem Eck ein).

    Eine Mensch befindet sich beim Starten unten Links im Punkt. Wenn ich jetzt auf den Punkt klicke und dann auf den Punkt oben rechts, soll der Mensch dahin laufen!

    Wenn der dann da oben ist, will ich dann auch wieder das selbe machen:
    Klick auf oben rechts (da ist ja die Figur), dann unten rechts klicken und die Figur läuft da runter..

    Mein problem:
    Ich benötige Stichpunkte dazu, was ich brauche, um das zu realisieren..
    Weiß nicht so wirklich wie ich anfangen soll...

    Mein Plan sähe erstmal so aus:
    Punkte auf den Bild zeichnen (RelativLayout?) [Später sollen dann die Punkte iwo auf dem Screen erscheinen. Also ich möchte sagen z.B. auf Pixel 50:60]
    Welches Layout?
    Dann müsste ich iwie ein Klicklistener auf jeden setzten und gucken ob die Figur drinne sitzt.
    Dann muss ich es iwie hinkriegen, das die Figur weiß auf welchem Pixel sie sitzt und wie sie am schnellsten zum anderen Pixel kommt..
    [Vielleicht sollte ich damit ein Zwischenprojekt einschieben?]

    Also:
    Stichpunkte bitte :D

    Danke und Gruß
     
  2. strider, 11.04.2012 #2
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Das mit dem Layout vergisst du mal lieber wieder, das klingt wie ein böser Workaround ganz nach dem Motto "If Your Only Tool is A Hammer, All Your Problems Will Look Like Nails" :)
    Zum Zeichnen gibts das Canvas und onDraw() für einfache Fälle.
    Du legst eine custom View über den kompletten Screen und überlädst die onDraw() Methode. Weiterhin brauchst du die onTouch() Methode da drin prüfst du wo der Benutzer hinklickt. Wenn du die Koordinaten nun hast von wo nach wo es geht, kannnst du dir einen Richtungsvektor basteln indem du vom Zielortvektor den Startortvektor subtrahierst und das Ergebnis normalisierst.
    Mit dem Richtungsvektor kannst du dein Männchen genau in die richtige Richtung bewegen.
    Wenn du noch mehr in der Hinsicht machen willst kannst du auch mal überlegen ob du dir nicht gleich ein Framework wie Andengine oder libgdx anschaust.
     
    StefMa bedankt sich.
  3. StefMa, 12.04.2012 #3
    StefMa

    StefMa Threadstarter Gewerbliches Mitglied

    Beiträge:
    2,054
    Erhaltene Danke:
    413
    Registriert seit:
    16.10.2010
    Hi,

    erstmal vielen Dank für die "Anleitung".
    Ich habe mir zu jedem Punkt auch schon Informationen rausgesucht. - Sieht nicht so schwer aus.

    Ich habe keinerlei Erfahrung im Thema "Spiele-"Entwicklung. Ich möchte später dann die Kreise (die ich mit canvas erstelle) in z.B. Häuser umwandeln. Den Mensch, der vorest als strich zum nächsten Kreis läuft, soll dann ein Hund werden. Benötige ich dazu ein framwork?
    Was ist ein Framework generell? Werde ich dann später sowieso darauf zugreifen müsen?

    Vielen Dank und Gruß
     
  4. Dark Blood Studios, 12.04.2012 #4
    Dark Blood Studios

    Dark Blood Studios Junior Mitglied

    Beiträge:
    34
    Erhaltene Danke:
    4
    Registriert seit:
    28.03.2012
    Du brauchst nur die Klassen die Android dir bietet.

    Wenn ich du wäre würde ich mir eine Klasse erstellen die du dann GameActivity oder so nennen kannst. Die Klasse erbt von Activity und implemtiert OnTouchListener. In dieser Klasse kannst du dann die Zeit berechnen, die für den letzten Durchlauf deiner GameLoop(Endloseschleife in der auf den Bildschirm gezeichnet und die Spielelogik durchgeführt wird) benötigt wird, Werbung laden falls vorhanden ... und von der Klasse erbt dann eine Klasse die eine Methode hat die aufgerufen wird, wenn die Activity sichtbar wird, eine die aufgerufen wird wenn die Activity nicht mehr sichtbar ist, eine in der du alles Zeichnest und deine Spielelogik ausführst und eine die ausgeführt wird wenn jemand auf den Bildschirm drückt.
    Die erste Klasse kannst du dann für jedes deiner Spiele nutzen.

    Also so habe ich es zumindestens gemacht.
     
  5. StefMa, 17.04.2012 #5
    StefMa

    StefMa Threadstarter Gewerbliches Mitglied

    Beiträge:
    2,054
    Erhaltene Danke:
    413
    Registriert seit:
    16.10.2010
    Hallo,

    aktueller Stand:
    -> Zwei Kreise (Oben Links unten Rechts)
    -> Mann kann erst den einen Kreis anklicken (oben rechts)
    -> Dann kann man den zweiten Kreis anklicken (unten links)
    -> Die koordinaten werden gespeichert in einer Liste (Sollte am ende so aussehen [X_Start, Y_Start, X_Ziel, Y_Ziel])

    Bilder sagen mehr als tausendworte:
    Redirecting... <-

    Meine Fragen:
    1. Vektor:
    Ich habe damit noch nie gearbeiet! Nein auch nicht in der Schule ;)
    Also musste ich mich erstmal einlesen. Stimmt es, dass ich so rechnen muss:
    Ziel_X - Start_X = Soviele "Schritte" nach rechts
    Ziel_Y - Start_Y = Soviele "Schritte" nach unten?!
    Aber da gibt es ja ein "Problem".. Wenn ich das so löse. Dann läfut mein Mensch ja erst horizontal und dann nach vertikal.
    Was muss ich also noch machen, damit er wirklich quer also schräk läuft?
    2. Menschen erstellen und Reload:
    Wie erstelle ich dann den Menschen [Vorerst in form eines Kriese, Rechteckes mir egal :D] und wie läuft er dann? Also wie reloade ich, dass ich jedesmal sage:
    AktuellePositon -> eins nach rechts -> schon bei "Vektor" angekommen? -> Nein -> eins rechts -> angekommen [...]?
    Nach meiner Überlegung bzw Kenntnisstands, würde ich das ganze in einen Thread verlagern...?!

    Zu dem Quellcode:
    Denke das sind erstmal keine wirklich Spezifischen fragen, wo ich iein Quelltext posten muss.
    Falls doch, sagt bescheid ;)
    Aber zu meinen Datein kann ich was sagen:
    1. Activity
    -> Sie ruft eigentlich nur eine Java-KLasse auf
    2. Zeichnen
    -> Diese wird von der Activty aufgeruefn. Hier werden zunächst die Kreise gezeichnet (In onDraw()
    -> Hier habe ich auch einen TouchListener auf das gesamte View.
    -> Im onTouch() gucke ich, ob erst der erste Kreis angeklickt worden ist und dann der zweite.
    -> Nach dem zweiten wollte ich dann eine Methode (Immer noch in der Klasse) aufrufen, die den Vektor ausrechnet und dann den Mensch laufen lässt. [Noch ist in der Methode NICHTS drinne! ;)]

    Gruß IceClaw
     
  6. Dark Blood Studios, 17.04.2012 #6
    Dark Blood Studios

    Dark Blood Studios Junior Mitglied

    Beiträge:
    34
    Erhaltene Danke:
    4
    Registriert seit:
    28.03.2012
    (Ziel_X - Start_X) * speed => Strecke die sich Spieler auf x-Achse bewegt
    (Ziel_Y - Start_Y) * speed => Strecke die sich Spieler auf y-Achse bewegt

    speed ist eine float Variable in der du angibst, wie schnell der Spieler sich bewegen soll (1 = sofort an Ziel, 0.01 = läuft bei jedem Durchgang ein Hundertstel der Strecke).

    Um den Spieler zu bewegen, addierst du in deiner onDraw() Methode zur x-Koordinate des Spielers deine "Strecke die sich Spieler auf x-Achse bewegt" hinzu und zur y-Koordinate deine "Strecke die sich Spieler auf y-Achse bewegt"
     
  7. StefMa, 17.04.2012 #7
    StefMa

    StefMa Threadstarter Gewerbliches Mitglied

    Beiträge:
    2,054
    Erhaltene Danke:
    413
    Registriert seit:
    16.10.2010
    Das heißt, ich erstelle in der onDraw schon einen Punkt, welchen den Spieler simuliert, und setzte ihn auf einen Punkt.
    Beispiel :
    canvers.drawCircle(500, 500,5,paint)

    Muss ich dann die onDraw iwo aufrufen oder wann passiert das?

    Wenn ich dem deawCircle werten Variblen gebe, dann diese variablen in einer anderen Methode ändere, wird dann die onDraw neu geladen?

    Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
     
    Zuletzt bearbeitet: 17.04.2012
  8. StefMa, 17.04.2012 #8
    StefMa

    StefMa Threadstarter Gewerbliches Mitglied

    Beiträge:
    2,054
    Erhaltene Danke:
    413
    Registriert seit:
    16.10.2010
    Hi,

    also erstmal nochmal danke Dark ;)

    Habe jetzt aber ein neues Problem [Vergiss den oberen Post]:
    Ich will ja das typische "gehe" Verhalten haben. Also alle 200 Millisekunden soll neu gezeichnet werden und angezeigt wo der Punkt jetzt sitzt.
    Dazu habe ich den Code geschrieben
    Code:
    // Hier wird der Vektor brechnet (Wieviel "schritte" nach rechts, wieviel "schritte" nach unten..)
            do
            {
                menschKreis[0] = ((vektorList.get(2)-vektorList.get(0))*0.01F)+menschKreis[0];
                menschKreis[1] = ((vektorList.get(3)-vektorList.get(1))*0.01F)+menschKreis[1];
                Log.e("Mensch X", Float.toString(menschKreis[0]));
                Log.e("Mensch Y", Float.toString(menschKreis[1]));
    // Neu Zeichnen        
                try
                {
                    invalidate();
                    Thread.sleep(200);
                }
                catch(Exception exe)
                {}
            }while((menschKreis[0] <= vektorList.get(2)) && (menschKreis[1] <= vektorList.get(3)));
    
    Leider macht er nicht was ich will.
    Im Logcat kommt zwar schon "Mensch X" und "Mensch Y" mit der jeweiligen NEUEN Position.
    Angezeigt wird es trotzdem nicht?!
    Er bleibt stur auf dem ersten punkt stehen, bis das while()-Ereignis eintrifft, und geht dann auf den Endpunkt...

    Wo ist mein Fehle :confused:

    Gruß
     
    Zuletzt bearbeitet: 18.04.2012

Diese Seite empfehlen