Yapmak istediğim şu enter'a basdığımda oyunu başlatmak istiyorum.Bununla ilgili şöyle bir test yazdım.

public class SnakeGame extends JFrame {

private static final long serialVersionUID = 2981978303113913224L;

boolean isNewGame = false;

public SnakeGame() {
    super();

    setTitle("Snake Game");
    setSize(600,600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setLocationRelativeTo(null);
    setVisible(true);

    addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {

            switch (e.getKeyCode()) {

            case KeyEvent.VK_UP:
            case KeyEvent.VK_W:
                break;

            case KeyEvent.VK_DOWN:
            case KeyEvent.VK_S:
                break;

            case KeyEvent.VK_LEFT:
            case KeyEvent.VK_A:
                break;

            case KeyEvent.VK_RIGHT:
            case KeyEvent.VK_D:
                break;

            case KeyEvent.VK_ENTER:
                isNewGame = true;
                break;

            case KeyEvent.VK_P:
                break;
            }
        }
    });
}

public void start() {
    while(true) { 
        if (isNewGame) {
            setSize(200,200);
        }
    }
}

public static void main(String[] args) {
    SnakeGame game = new SnakeGame();
    game.start();
}

}

Şu haliyle enter'a basdığımda ekran 200x200 olması lazım ama olmuyor.Yani if komutu işlemiyor.

Şöyle bir ilginç durum var eğer start metoduna şöyle bir ekleme yaparsam çalışıyor.

Sorun nerde anlayamadım.Yardım ederseniz sevinirim.

public void start() {
    while(true) { 
        if (isNewGame) { System.out.println(isNewGame);
            setSize(200,200);
        }
    }
}

Yeni üyeyim eğer formatın dışına çıktıysam özür dilerim.

soruldu: 16 Eyl '14, 06:49

loser's gravatar image

loser
2066915
cevap kabul oranı: 40%

kapatıldı: 12 Eki '14, 15:03

1

aslında if çalışıyor, çalışmayan setSize(200,200); aslında oda çalışıyor ama, sonsuz döngüde kaldığı için refresh olmuyor

(16 Eyl '14, 08:24) Fatih Aşlamacı Fatih%20A%C5%9Flamac%C4%B1's gravatar image

setSize(200,200); -den sonra break; yazıp döngüyü kırmayı denedim ama Frame yenilenmedi.Sanırım sebebi bu da değil.

(17 Eyl '14, 12:47) loser loser's gravatar image
2

bunun gibi, soruyu soran arkadaşın elinden geldiğince açıklayıcı olmaya çalışıp sorduğu bir soruya neden - verildiğini anlayabilmiş değilim. Sonrada sormuyoruz ,araştırmıyoruz, öğrenmiyoruz vs vs..

(18 Eyl '14, 03:02) mft mft's gravatar image

Bu soru 12 Eki '14, 15:03 loser tarafından "Bu soru cevaplandı ve bir cevap daha önce kabul edildi" gerekçesiyle kapatıldı.


volatile boolean isNewGame = false;

Böyle dene. Değeri tanımlarken başına volatile eklediğin zaman programa, o nesnenin başka kanallardan bilgi alabileceği uyarısını yapıyorsun. Haliyle programın herhangi tarafında değeri değiştirsen de sonsuz while döngüsüne dışardan etki edebiliyor.

permanent link

cevaplandı: 18 Eyl '14, 09:01

Forgewright's gravatar image

Forgewright
1264
cevap kabul oranı: 25%

While ile if arasina

Thread.sleep(500);

yaz da dene

Sonucunu da ilet buradan, oldu mu olmadi mi

permanent link

cevaplandı: 17 Eyl '14, 00:45

MCY's gravatar image

MCY
1.1k2622
cevap kabul oranı: 16%

değiştirildi: 18 Eyl '14, 09:34

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288

Evet bu şekilde çalışıyor.Hatta 1 milisaniyede bile çalışıyor.Peki bunun sebebi nedir? boolean değer true olmadan if' e mi dallanıyor.Açıklarsanız sevinirim.Teşekkürler.

(17 Eyl '14, 12:26) loser loser's gravatar image
1

While true ile if false arasinda hang oluyor programin. Enter ile yarattigin interruption i yakalayamaz duruma geliyor. Thread sleep bu loopu seyreltiyorsun birnevi.

(17 Eyl '14, 13:17) MCY MCY's gravatar image

Tam olarak derdini anlayamadım ancak yapmak istediğin herhangi bir tuş'a veya klavyetuşuna bastığında isNewGame boolean'ının değerine göre JFrame boyutunun değişmesini istiyorsan JFrame'i extends şeklinde ekleme. Ana sınıfın içine örnek değişken olarak ekle. Ufak bir kod yazdım senin için, umarım derdine çare olur.

package snakegame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SnakeGame implements ActionListener
{
    public JFrame ekran;
    JButton tus = new JButton();
    private boolean basladi=false;

SnakeGame()
{
    ekran = new JFrame();
    ekran.setSize(500,500);
    ekran.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ekran.setResizable(false);
    ekran.setLayout(null);

    tus.setSize(100,100);
    tus.setText("küçült");
    tus.setLocation(100,100);
    tus.addActionListener(this);

    ekran.add(tus);
    ekran.setVisible(true);
}

public void actionPerformed(ActionEvent ae)
{
    if(ae.getSource()==tus)
    {
        if(basladi==false)
        {
            oyunbaslat();
        }
    }
}

public void oyunbaslat()
{
    ekran.setSize(100,100);
}

public static void main(String args[])
{
    SnakeGame wqeq = new SnakeGame();
}

}

permanent link

cevaplandı: 16 Eyl '14, 07:29

Forgewright's gravatar image

Forgewright
1264
cevap kabul oranı: 25%

Ben aslında bir yılan oyunu yapmaya çalışıyorum.Enter'a basdığımda oyun başlayacak bir butona değil.Ben alternatif bir öneri istemiyorum. Yukarıdaki sorunun cevabını istiyorum.Enter'a basıldığında isNewGame true oluyor.Ama if komutu işlemiyor.Cevaplarınız için teşekkürler.Umarım anlatabilmişimdir.

(16 Eyl '14, 07:48) loser loser's gravatar image

main'in içinde çalıştırdığın start metodu sadece bir kere kontrol ediyor değeri. Eğer enter'a bastığında metodun içini tekrar taramasını istiyorsan main'inin içine değil de bu şekilde eklemen gerekiyor :

case KeyEvent.VK_ENTER: isNewGame = true; start(); break;

Yalnız while komutunu kaldırmanı öneririm bu şekilde deneyeceksen, aksi taktirde sürekli frame boyutunu 200 olarak her an güncelleyecektir.

(16 Eyl '14, 07:53) Forgewright Forgewright's gravatar image

Hayır orada start metoduna girdiğinde sonsuz döngüye girmiyor mu?Yani sürekli taranıyor.isNewGame true olduğunda da ekranı 200x200 yapması gerekiyor ama yapmıyor.Eğer while döngüsünün içine System.out.println(isNewGame); eklersen çalışıyor.Bana göre kodda bir hata yok.Sebebini anlayamadım.

(16 Eyl '14, 08:07) loser loser's gravatar image
1

Sonsuz döngüyü metodun içinde yapıyor. Bütün programı sonsuz döngüye sokmuyorsun, haliyle boolean while loop içinde değiştirilmeli ki istediğin olabilsin. Ki döngü tam olarak istediğin şekilde çalışsa bile alacağın sonuç kesinlikle tatmin edici olmayacaktır, öyle ki her "an" için frame(200,200) olarak güncellenecek. Timer eklentisini bir araştır istersen, zamanlayıcı içinde çalıştırdığın bir metod ve değerler an ve an güncellemeye göre davranış sergiler. Oyun motorlarındaki update() metoduna benzer bir çalışma ortamı oluşturabilirsin. Ancak while ile zannetmiyorum.

(16 Eyl '14, 08:27) Forgewright Forgewright's gravatar image

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,076
×79

Soruldu: 16 Eyl '14, 06:49

Görüntüleme: 1,053 kez

Son güncelleme: 12 Eki '14, 15:03

powered by BitNami OSQA