2014-02-24 2 views
0

그래서 나는 마리오가 점프하는이 작은 프로젝트를 가지고있다. 그러나 나는 그것을 다시 칠하는 방법을 알아낼 수 없다. 클릭 한 후 Main 클래스에서 처리하면 전체 점프가 매우 번쩍 거립니다.다시 칠하는 법을 알 수 없다

나는 점프 기능의 끝에서 그것을 시도했다. 그러나 그것은 그렇게 일하지 않았다.

홈페이지 : 여기

내 코드입니다

package klassid; 

import java.awt.Toolkit; 
import java.awt.Image; 
import java.awt.Graphics; 

public class Hero { 
    static Main main; 
    int y; 
    Image pilt = Toolkit.getDefaultToolkit().getImage("../mario.png"); 
    private double height = 0, speed = 4; 
    public static final double gravity = 9.81; 
    private double x = 25; 
    private boolean left = false, right = false, up = false; 


    public Hero(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

    public void render(Graphics g, Main pohiKlass){ 
     g.drawImage(pilt, (int) (x), (int) (500-(height*100)), 50, 50, pohiKlass); 
    } 

    public void the_jump() { 
     long previous = 0, start = 0; 

     while(true){ 
      start= System.nanoTime(); 
      if(previous != 0 && up){ 
       double delta = start - previous; 

       height += (delta/1000000000) * speed;   
       speed -= (delta/1000000000) * gravity; 
      } 
      if(left) 
       x -= 3; 
      if(right) 
       x += 3; 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      if(height < 0){ 
       height = 0; 
       speed = 4; 
       up = false; 
      }  
      previous = start; 
      repaint(); 
     } 
    } 
    public void move(int i){ 
     if(i == 38) 
      up=true; 
     if(i == 37) 
      left=true; 
     if(i == 39) 
      right=true; 
    } 
    public void move2(int i){ 
     if(i == 37) 
      left=false; 
     if(i == 39) 
      right=false; 
    } 
} 

가 나는 또한 the_jump 함수에서의 paintComponent에 액세스하려고하지만 그것은 작동하지 않았다

package klassid; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.Timer; 


public class Main extends JComponent implements KeyListener, ActionListener{ 
    static Hero hero; 
    Timer t = new Timer(500,this); 

    public static void main(String[] args) { 
     JFrame aken = new JFrame("Simple jumping simulator"); 
     aken.setSize(600, 600); 
     aken.getContentPane().setBackground(new Color(255,255,255)); 
     aken.getContentPane().add(new Main()); 
     aken.setVisible(true); 
     aken.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     hero.the_jump(); 
    } 

    public Main(){ 
     addKeyListener(this); 
     setFocusable(true); 
     t.start(); 
     hero = new Hero(0, 320); 
    } 

    public void paintComponent(Graphics g){ 
     hero.render(g, this); 
     g.setColor(Color.GREEN); 
     g.fillRect(0, 550, 600, 2); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     hero.move(e.getKeyCode()); 
    } 
    public void keyReleased(KeyEvent e) { 
     hero.move2(e.getKeyCode()); 
    } 
    public void keyTyped(KeyEvent e) {} 
    public void actionPerformed(ActionEvent e) {} 
} 

그리고 나의 영웅 클래스

어떤 종류의 매개 변수가 필요한지 전혀 알지 못합니다.

이 혼란은 어떻게 풀릴 수 있습니까?

super.paintComponent(g); 

JComponent에 당신을 위해 많은 일을 할 것입니다,하지만 당신은 명시 적으로 그렇게 할 수있는 슈퍼 클래스의 메소드를 호출해야합니다

답변

5

당신의 paintComponent 방법의 첫 번째 라인은해야합니다. 오라클 문서 here을보십시오.

타이머 값을 매우 낮은 값으로 줄이면 actionPerformed 메서드에서 repaint()을 호출 할 수 있습니다. 이렇게하면 "연속적으로"다시 그리기가 가능해집니다 (합리적으로 수행 할 수있는만큼 여러 번).

+0

반복해서 반복하면 성능이 크게 향상됩니까? – Veske

+0

CPU에서 그래픽으로 작업하는 것이 이상적이지 않습니다. 테스트를 해보고 성능면에서 한계가 있는지 확인하는 것이 좋습니다. 타이머 값으로 항상 미세 조정할 수 있습니다 (33은 초당 약 30 프레임을 제공하기 때문에 좋은 출발점 일 수 있습니다). – Nathan

관련 문제