2012-10-09 6 views
2

안녕하세요 저는 최근에 뱀 게임을 개발하기 시작했습니다. 나는 움직이는 물체와 그것을 먹기위한 점이있는 시작 단계에있다. 그러나 나의 주요 쟁점은 뱀이 점을 먹었는지 어떻게 확인할 수 있는가? 어떻게 내가 그것을 사라지게 할 수 있는가?
도움이 될 것입니다.스네이크 게임 Java GUI

import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.awt.event.KeyEvent;  
import java.awt.event.KeyListener;  
import javax.swing.*;  
import java.awt.*;  
import java.util.Random;  
import javax.swing.JPanel; 

public class Gui extends JPanel implements ActionListener,KeyListener{ 

    Random rnd= new Random(); 

int pointx=100 + (int)(Math.random() * ((400- 100) + 1));; 

int pointy=100 + (int)(Math.random() * ((300 - 100) + 1)); 

private String text; 

    Timer tm = new Timer(5, this); 

    int x = 300, y = 178, velx = 0, vely = 0; 


     public Gui() 
     { 
      tm.start(); 

      addKeyListener(this); 

      setFocusable(true); 

     } 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.green); 
      g.fillRect(x, y, 35, 15); 
      g.setColor(Color.BLACK); 
      g.fillOval(pointx,pointy, 20,20); 

     } 

     public void keyPressed(KeyEvent e) 
     { 
      int c = e.getKeyCode(); 
      if (c == KeyEvent.VK_LEFT) 
      { 
       velx = -1; 
       vely = 0; 
      } 
      if (c == KeyEvent.VK_UP) 
      { 
       velx = 0; 
       vely = -1; 
      } 
      if (c == KeyEvent.VK_RIGHT) 
      { 
       velx = 1; 
       vely = 0; 
      } 
      if (c == KeyEvent.VK_DOWN) 
      { 
       velx = 0; 
       vely = 1; 
      } 
     } 

     public void actionPerformed(ActionEvent e) 
     { 
      x += velx; 
      y += vely; 
      repaint(); 
      borders(e); 

     } 
     public void borders(ActionEvent e) { 
      if (x < 0) { 
       velx = 0; 
       x = 0; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 
      } 
      if (x > 530) { 
       velx = 0; 
       x = 530; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 
      } 
      if (y < 0) { 
       velx = 0; 
       y = 0; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 
      } 
      if (y > 330) { 
       velx = 0; 
       y = 330; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 

      } 
     } 
     public static void main(String[] args) 
     { 
     JFrame frame = new JFrame("gui"); 
      frame.add(new Gui()); 
      frame.setVisible(true); 
      frame.setSize(600, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     } 
+2

뱀과 "대상"의 "머리"에 대한 참조를 유지해야합니다. 머리와 표적이 같은 지점에 있으면 먹은 후에는 "치료"를 새 위치로 재설정하거나 "null"로 설정하고 다음 페인트 사이클에서 그래픽을 업데이트 할 수 있습니다. 뱀이 스스로 빠져 나갔는지 탐지하는데도 비슷한 기술을 사용해야합니다. – MadProgrammer

+1

나는 아주 빨리 읽을 수있다. 뱀의 x와 y를 읽은 것 같다. x와 y를 비교하지 않은 이유는 무엇인가? 그들이 똑같다면 뱀이 그 지점을 지나가고 있다는 것을 압니다. 그런데 코드가 약간 혼란 스럽습니다. 포인트를 만들 때 pointx와 pointy를 어디에서 사용할 수 있는지 보지 못합니다 ... 나는 잠시 멈춰서서 구조를 다시 생각해야한다고 생각합니다. 계획. 뱀의 "음식"을 나타내는 클래스 "포인트"를 만들 수 있습니다. 다음 당신은 많은 포인트에 의해 형성된 클래스 스네이크와 그것을 이동하는 방법이 필요합니다 (마지막 포인트를 가져 와서 첫 번째 뒤에 넣습니다) 등등 .. – Gianmarco

답변

5

일단 가장 중요한 : 당신의 GUI는 게임 로직에서 분리 된해야한다 여기

는 다음과 같은 코드입니다.

기본적으로 하나 이상의 클래스가 게임 상태를 캡슐화하게합니다. 이 GameState 클래스에는 그리기 원 목록을 반환하는 함수와 입력을 허용하는 다른 함수가 있습니다. GUI 클래스는 패널 설정 및 그리기 요청 처리를 처리합니다. 그러면 사물이 정말로 단순 해집니다. 점을 사라지게하려면 간단히 목록에서 제거하십시오. 두 가지가 충돌했는지 확인하려면 자신의 위치를 ​​비교하십시오.

저는 실제로 자바에서 스네이크 게임을 만들었습니다. 내가 가진 수업 목록은 다음과 같습니다. 이것은 단지 제안 일 뿐이므로 개인적인 취향과 게임의 복잡성에 따라 더 많거나 적은 수업이 필요할 것입니다.

  • GameInstance은 -은 GUI 부
  • 돌이 - - 게임 로직을
  • GameWindow 보유
  • 뱀 이벤트 루프를 설정 - 약 뱀
  • Pnt2 정보를 보유 - 차원 가리킨 추가 논리, 빼기, 거리 테스트 등

분명히 j는 j입니다. 나는 일을하는 한 가지 방법 밖에 없지만, 나는 그것을 권하고 싶습니다.

+0

내 게임에서 대단히 감사합니다. 내 뱀은 실제로 프레임에 채워진 직사각형은 내 점이므로 문제는 사라지게 만드는 방법입니다. 뱀이 점을 만지면 흰색으로 표시하지만 그다지 모호하지는 않습니다. 어떻게 직사각형을 제거 할 수 있을지 생각했습니다. 깨끗한 방법으로 jframe에서? – david1597

+0

방금 ​​프레임 전체를 지우고 각 틱마다 모든 것을 다시 그립니다. 이전 프레임과의 차이점을 수동으로 찾고 변경된 부분 만 그리는 것보다 훨씬 쉽습니다. – Antimony

+0

친절하게, 일하게 최선을 다하십시오. 다시 한 번 감사드립니다. – david1597