kostenloser Webspace werbefrei: lima-city


Probleme mit Zuganimation. (+kleinichkeiten)

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Also, das Hauptproblem:

    Ich habe eine Klasse die als Thread extendisiert ist.
    Zuerst mal der Hauptkonstruktor:

    public player(Toolkit tk)
    {
    	image[0] = tk.getImage(\"img/player/0.png\");
    	image[1] = tk.getImage(\"img/player/1.png\");
    	image[2] = tk.getImage(\"img/player/2.png\");
    	image[3] = tk.getImage(\"img/player/3.png\");
    	image[4] = tk.getImage(\"img/player/4.png\");
    	image[5] = tk.getImage(\"img/player/5.png\");
    }


    Der läd die einzelnen Frames der Animation in ein Image-Array.
    Dann die Bewegung:

    public void move_right()
    {
    	this.frame = 4;
    	this.x++;
    	this.frame = 5;
    	this.x++;
    	this.frame = 4;
    	this.x++;
    	this.frame = 5;
    	this.x++;
    	this.frame = 4;
    	this.x++;
    	this.frame = 3;
    }


    Wird per KeyListener aufgerufen.

    Und dann noch die Abfrage des momentanen Frames:

    public Image getImage()
    {
    	return(this.image[this.frame]);
    }


    Diese wird immer im Paint aufgerufen und plaziert dem Spieler mit dem momentanen Bild an seine Position. Nur ändert sich die Animation nicht. :/
    Es ist als ob er sie überspringt.
    Ich habe schon versucht die Main die Paint, den KeyListener usw. enthält per this an die Bewegung zu übergeben und dann zu repainten, hat aber nichts geändert.
    Jetzt in dem Moment ist mir die Idee gekommen dass ich die KeyEvent-Variable des Listeners übergebe, und immer prüfe ob die Taste gedrückt wurde, wenn ja den Frame ändere und wenn nicht im in Standposition zurücksetze. Werde das mal testen, wäre aber nett wenn ihr mir noch Tipps geben könntet wie man sowas sauber hinbekommt.


    Und noch 2 kleine Dinge:

    Ich lese Dateien immer mit readLine() aus, und splite sie an einem Zeichen (meistens \";\").
    Jetzt bin ich aber bei einem Projekt von einem Array auf eine ArrayList() umgestiegen, um die Größe des Spielfeldes Variable zu machen. Nur weiß ich nicht wie man jetzt genau ausließt. Da ich nicht alle Files konvertieren will will ich es so machen dass immer 2 Chars zu einen String zusammengefügt in die Liste geaddet werden sollen. Kann mir da bitte jemand ein kleines Codefragment schreiben? Das Problem ist dass in der Datei 3 Zeilen stehen, die jeweils in unterschiedliche Listen gespeichert werden sollen.
    Also muss ich auslesen ob ich am Ende des Files angelangt bin, und dann eben in die nächste Zeile wechseln.

    Und ich habe eine Kollisationserkennung auf Basis von Rectangles und intersect(). Gibt es eine Möglichkeit zu prüfen von welcher Seite sie die Rects am \"meisten\" schneiden, ohne mehrere zu machen? Weil das relativ viel Arbeit ist, und ich möchte nur sehen wo sie sich als erstes berühren damit ich dementsprechend einen Rückstoß verursachen kann.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. benutzernaemelchen

    Kostenloser Webspace von benutzernaemelchen

    benutzernaemelchen hat kostenlosen Webspace.

    also das sich die Animation nicht bewegt, ist ganz klar.
    überleg mal:
    Du zeigst das Bild jedesmal erst dann an, wenn du repaint aufrufst. Also müsstest du quasi zwischen jedem Frame-wechsel ein repaint() aufrufen.
    Und selbst, wenn du das machst, ist sie noch zu schnell.
    schau mal nach System.currentTimeMillis(), oder mach einfach ein Thread.sleep() :S


  4. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Das habe ich schon versucht.
    Sah da so aus:

    public void move_right(Main main)
    {
    	this.frame = 4;
    	this.x++;
    	main.repaint();
    	this.frame = 5;
    	this.x++;
    	main.repaint();
    	this.frame = 4;
    	this.x++;
    	main.repaint();
    	this.frame = 5;
    	this.x++;
    	main.repaint();
    	this.frame = 4;
    	this.x++;
    	main.repaint();
    	this.frame = 3;
    }

    Und im KeyListener:
    if(k.getKeyCode() == KeyEvent.VK_RIGHT)
    	player.move_right(this);

    Ändert sich aber nichts.
    Und Thread.sleep hat auch nichts gebracht, dann bleibt er wenn man die Taste drückt dort stehen und erst wenn man loslässt springt der spieler an die Position.
    Habe auch schon versucht (schon am Anfang) eine booleanische Variable festzulegen damit der KeyListener wärend einer Animation nicht nochmals aufgerufen wird. Hatte Angst dass sich die Bewegungsbefehle stapeln wenn die Taste gedrückt wird, so dass der Spieler dann einfach weiterläuft. Ist aber eh nicht passiert.
    Ach ja, und repaint wird am Ende der paint aufgerufen. Läuft Problemlos. ^^

    Da fällt mir noch was ein, ich hängs einfach mal dran:
    Wie kann man eigendlich eine Geschwindigkeitsbegrenzung je nach CPU machen?
    Ich dachte es so:
    Am Anfang einfach eine Schleife die bis 10.000 zählt oder so durchrennen lassen und dann die gebrauchte Zeit durch 10.000 dividieren um die Durchschnittliche Zeit zu berechnen. Nur wie macht man dann die Weiterverarbeitung damit es auf allen CPUs gleich läuft?
  5. e********l

    Naja, der Ansatz als solches ist schon nicht der beste.

    Zum einen benötigst du deine Animationsdaten und dann das jeweils aktuelle Bild das du anzeigen willst. Entweder erzeugst du hierfür eine Bildreferenz oder was einfacher ist, einfach den Index des Arrays festhalten.

    Jetzt musst du im Repaint deiner Player Klasse lediglich den Index erhöhen und beim bevorstehenden Überlauf wieder auf 0 setzen. Somit bekommst du eine Animation hin. Wie benutzernaemelchen aber schon sagte sollte zwischen den einzelnen Bildern eine gewisse Pause liegen.

    Hab jetzt keinen Code zum zeigen da, aber denke das es auch so verständlich genug war :)
  6. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Danke, aber nicht wirklich.
    Weil wenn ich beim repaint immer ändere, rennt der Player nicht \"im Stehen\" die Animation durch?
  7. e********l

    Machst du Timebased oder Framebased Bewegung? Ich empfehle dir ersteres zu machen, das ist wesentlich einfacher und ist bei 2D Spielen sehr gut geeignet. Ich denke mal nicht das du das nächste Doom schreiben willst, wobei selbiges auch Timebased Movement nutzt.

    //edit: Doofe Schreibfehler


    Beitrag geändert: 17.6.2008 12:56:26 von evil-devil
  8. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Ähm, keine Ahnung. Hab gegooglet und in der Wikipedia gesucht, aber keine Erklärung gefunden.
  9. e********l

    Glaub ich dir nicht, ich werde von Erklärungen bei der Suche nach \"timebased movement\" geradezu erschlagen.
  10. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Oh, ja. Ich habs aus versehen mit Abstand geschrieben, und da kamen nur schwer verständliche englische Sachen wo ich nicht richtig mitgekommen bin.
    Ich denke auch dass es Timebased werden wird.
  11. e********l

    Naja, auf deutsch hab ich nur einen Artikel gefunden und Englisch setze ich grundsätzlich als Sprache beim Programmieren voraus. Denn all die API-Dokumentationen sind auch in englisch ;)

    @timebased: Wenn ich zuhause bin, kann ich mal was raussuchen wo ich das auch drin hab.
  12. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Ein bischen kann ich schon, und mit ein wenig Googeln findet man auch deutsche Übersetzungen. ^^
    Danke, bis später.
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!