kostenloser Webspace werbefrei: lima-city


Class an beliebiger Stelle ausführen.

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Ich habe atm. 2 Klassen exklusive. der Main.
    Eine sorgt dafür das sich der Player bewegt, eine sorgt für die globale Gravitation.

    Die erstere hat mir ein Bekannter geschrieben:

    public class checkMove extends Thread
    {
    	public checkMove(){}
    	public void run()
    	{
    		while(true)
    		{
    			if(move_player == true && move_richtung == 1)
    			{
    				playerx -= 1;
    				if(playerx%20 == 0)
    				{
    					move_player = false;
    					playerpos -= 1;
    				}
    			}
    			else if(move_player == true && move_richtung == 2)
    			{
    				playerx += 1;
    				if(playerx%20 == 0)
    				{
    					move_player = false;
    					playerpos += 1;
    				}
    			}
    			else if(move_player == true && move_richtung == 3)
    			{
    				playery -= 1;
    				if(playery%20 == 0)
    				{
    					move_player = false;
    					playerpos -= 1;
    				}
    			}
    			else if(move_player == true && move_richtung == 4)
    			{
    				playery += 1;
    				if(playery%20 == 0)
    				{
    					move_player = false;
    					playerpos += 1;
    				}
    			}
    			repaint();
    			try{ Thread.sleep(1); } catch(Exception e){}
    		}
    	}
    }

    public class gravitation extends Thread
    {
    	public gravitation() {}
    	public void allesfaelltrunter() throws InterruptedException
    	{
    		while(true)
    		{
    			for(int i = 0; i < objectinfo.length; i++)
    			{
    				if(objectinfo[i] == 1 && bodeninfo[i + 40] == 0 && objectinfo[i + 40] == 0 && playerpos != i + 40)
    				{
    					bodeninfo[i] = 0;
    					
    					objectinfo[i + 40] = 1;
    					objectinfo[i] = 0;
    				}
    			}
    			repaint();
    			Thread.sleep(1);
    		}
    	}
    }


    So wird aufgerufen:
    public static void main(String[] args) throws InterruptedException, IOException
    	{
    		new Main();
    	}
    	
    	public Main() throws InterruptedException, IOException
    	{
    		...
    		
    		addKeyListener(this);
    		addMouseListener(this);
    				
    		Toolkit toolkit = Toolkit.getDefaultToolkit();
    		Dimension monitoraufloesung = toolkit.getScreenSize();
    	
    		setSize(800,600);
    		//setSize(monitoraufloesung.width,monitoraufloesung.height);
    		setUndecorated(true);
    		setVisible(true);
    
    		new checkMove().start();
    		new gravitation().allesfaelltrunter();
    	}

    Jetzt würde ich die die mit der Bewegung habe aber gerne in der Modulo-IF returnen lassen, und es bei Tastendruck aufrufen, da das langsam ziemlich CPU-Lastig wird, und Änderungen in der Sleep bremsen nur das Spiel aus. Leider schaffe ich es aber nicht.
    Ich habe z. B. versucht dem new ein Object zuzuweisen, dann hat Eclipse aber verlangt das ich die void auch zum Object mache und so.
    Ich habe alles versucht was mir eingefallen ist, aber wie gesagt, ich habe es nicht geschafft.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. p**i

    Moin,

    verstehe ich das richtig, dass Du im Konstruktor eine Variable übergeben willst?
    Wenn ja, dann müsstest Du diesen halt erweitern:

    public class checkMove extends Thread
    {
       public checkMove(Object o){
         // mach hier was mit dem Objekt
       }
    
    [...]

    Dasselbe mit der Gravitiation-Klasse.
    Dann kannst Du in Deiner Main-Klasse auch per new checkMove(DeinObjekt).start();
    arbeiten.

    Achja, ganz wichtig:
    Bitte gewöhne Dir an, Klassennamen groß zu schreiben.

    Gruß,
    Puni


    Beitrag geändert: 18.5.2008 22:43:19 von puni
  4. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Danke, aber so meinte ich das nicht.
    Sondern so:
    http://www.gailer-net.de/tutorials/java/Notes/chap30/ch30_7.html

    Eben das ich im KeyListener wenn eine Taste gedrückt wird die \"run\" in (jetzt) Checkmove aufrufe. Danke für den Tipp mit der WÜbergabe von Variablen, daran habe ich noch garnicht gedacht.
    Mir geht es vor allem um die Auslagerung von Programmteilen, weil mir zu viel Text auf einmal die Übersicht nimmt.

    Und natürlich das du mal gesagt hast ich soll es bei größeren Projekten machen und es kann nie schaden zu wissen wie was geht.

    Jetzt verlangt er plötzlich das ich beim Aufruf die void static mache, wenn ich es mache beschwert er sich wieder bei der void.

    (Cannot make a static reference to the non-static method run() from the type Main.Checkmove/The method run cannot be declared static; static methods can only be declared in a static or top level type)
  5. p**i

    Also um das berühmte MVC-Konzept zu verstehen, hier mal ein kurzes, gut erklärtes Tutorial:
    http://www.leepoint.net/notes-java/GUI/structure/40mvc.html

    Deshalb ... ich würde das ganze genau so aufbauen, und den KeyListener somit auslagern.
    Dann kommst Du auch nicht in Bedrängnis mit static bzw. non-static Variablen/Methoden.

    So sollte es sonst in Deiner Main-Methode Aussehen, wenn Du nichts auslagerst:

    CheckMode cm = new CheckMove();
    cm.start();
    Gravitation grav = new Gravitation();
    grav.allesfaelltrunter();


    Und das funktioniert nicht oder wie?


    Beitrag geändert: 18.5.2008 23:26:51 von puni
  6. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Danke. Aber es geht ja darum das ich sie nicht nur einmal aufrufen will, sondern immer nur wenn eine Taste gedrückt wurde und dafür nicht ständig eine while rennen lasse. So erhalte ich ein \"cm cannot be resolved\" in KeyListener. Wobei ich dachte das public bedeutet das alles überall darauf Zugriff hat.
  7. p**i

    Ups, war mein Fehler ... natürlich gibt\'s cm.start() nicht, entschuldige.

    Bastel Dir am Besten für den KeyListener eine Controller-Klasse wie in meinem Link beschrieben.
    Dann kannst Du aber die Vererbung von Thread rausnehmen und der Klasse eine ordentliche Methode verpassen.
    Im Beispiel unten habe ich diese einfach mal check() genannt.

    public class Handler{
    
     private CheckMove checkmove;
    
     public Handler(Checkmove cm){
       checkmove = cm;
     }
    
     [...] // hier noch andere Funktionen implementieren
    
     class KeyListener implements java.awt.event.KeyListener {
      public void keyTyped(KeyEvent e) {
      }
    
      public void keyPressed(KeyEvent e) {
        // hier noch die Abfrage, bei welchem Key das Event ausgelöst werden soll
        cm.check();    
      }
    
      public void keyReleased(KeyEvent e) {
      }
     }
    }


    Du könntest diese \"innere\" Klasse natürlich auch einfach Deiner Main-Klasse hinzufügen und brauchst sie somit nicht auslagern.
    Wäre vorerst um einiges einfacher zu verstehen, wie es gehandhabt wird.
  8. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Ich bin nach meinem letzten Post auch auf die Idee gekommen in der Main eine While zu starten und per booleanische Variablen diese Dinge zu steuern. Aber dachte mir dann dass das bei noch größeren Projekten bei denen der Computer bzw. vor allem die CPU sehr viel zu tun hat das testen wiederrum sehr viel Zeit in Anspruch nehmen würde und so beim Aufruf eventuell Verzögerungen entstehen könnten.

    Danke, werde mal mit dem Beispiel, MVC usw. herumexperimentieren. Wenn es nicht klappt hörst du vermutlich wieder von mir. ^_^
  9. mhn wie wärs denn einfach mit ner variablen boolean klick oder so
    die vom Keylistern auf true gesetzt wird

    und die im Thread abgefragt wird also nach dem while(true) noch ne abfrage if(klick==true) und dann das ganze Zeugs und am Ende eben noch klick wieder auf false setzen



    oder willst du was ganz anderes..?
    weil so 100% hab ich nich verstanden was genau du willst xD


  10. 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!