새로운 질문이이 후 질문되었습니다 here을 발견했습니다.동시에 두 개 이상의 객체를 스크롤하는 방법은 무엇입니까?
저는 Java에 익숙하지 않지만 "Flappy Bird"를 재 작성하여 Java 및 그래픽 표시 방법에 대해 자세히 배우고 있습니다. 모든 질문에 대한 해결책이나 제안은 대단히 감사하겠습니다. 감사!
지금, 내 프로그램이 임의의 파이프와 스크롤을 만드는,하지만 난x1-3 = -83
(
이것은 파이프가 완전히 화면 해제 할 때입니다 더 이상을 필요) 때 스크롤을 계속 할 필요가 없습니다
.
질문
가 어떻게 내 Game.class
스크롤 Pipes.class
개 이상의 인스턴스 사이에 미리 설정된 거리를 추가하는 동안 만들 수 있습니까? 나는 그 (것)들 사이두기 위하여 거리를 알아낼 수 있었다, 그러나 1 개 이상을 표시하기까지, 나는 그것을하는 방법을 모른다. 최대 3 개의 파이프가 동시에 표시되어야합니다.
주 메뉴에 대한 패널을 표시 한 다음 시작 버튼을 누른 후 파이프 패널로 전환하려면 어떻게합니까?
클래스
Game.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Game {
Pipes panel = new Pipes();
public Game() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(panel);
f.setTitle("Pipe Game");
f.setResizable(false);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
Timer timer = new Timer(10, new ActionListener() { //pipe speed
@Override
public void actionPerformed(ActionEvent e) {
panel.move();
}
});
timer.start();
Timer refresh = new Timer(30, new ActionListener() { //refresh rate
@Override
public void actionPerformed(ActionEvent e) {
panel.repaint();
}
});
refresh.start();
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Game();
}
});
}
}
Pipes.java
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Pipes extends JPanel {
//Declare and initialiaze variables
int x1 = 754; //xVal start
int x2 = 75; //pipe width
//total width is 83
int y1 = -1; //yVal start
int y2 = setHeightVal(); //pipe height
int gap = 130; //gap height
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.clearRect(0,0,750,500); //Clear screen
g.drawRect(x1,y1,x2,y2); //Draw part 1
g.drawRect(x1-3,y2-1,x2+6,25); //Draw part 2
g.drawRect(x1-3,y2+25+gap,x2+6,25); //Draw part 3
g.drawRect(x1,y2+25+gap+25,x2,500-y2-49-gap); //Draw part 4
}
public void move() {
x1--;
}
public int getMyX() { //To determine where the pipe is horizontally
return x1-3;
}
public int getMyY() { //To determine where the pipe is vertically
return y2+25;
}
public int setHeightVal() { //Get a random number and select a preset height
int num = (int)(9*Math.random() + 1);
int val = 0;
if (num == 9)
{
val = 295;
}
else if (num == 8)
{
val = 246;
}
else if (num == 7)
{
val = 216;
}
else if (num == 6)
{
val = 185;
}
else if (num == 5)
{
val = 156;
}
else if (num == 4)
{
val = 125;
}
else if (num == 3)
{
val = 96;
}
else if (num == 2)
{
val = 66;
}
else
{
val = 25;
}
return val;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(751, 501);
}
}
타이머 타이머 = 새 타이머 (10, 새로운 ActionListener() {매우 짧은 지연 시간, 최소 새로 고침 빈도로 23-30을 사용해야 함, – mKorbel
감사합니다. 그냥 궁금 해서요, 새로 고침 빈도가 중요한 이유는 무엇입니까? 그리고 최적의 것은 무엇이 될까요? 그래서 나는 깜빡 거리지 않고 파이프가 부드럽게 움직입니다. –
또한이 숫자는 새로 고침 빈도가 아니며 파이프를 이동하기 전에 기다릴 시간을 결정하므로 파이프의 속도도 제어합니다. –