/ / कैसे एक अनंत छवि पाश को लागू करने के लिए? - जावा, छवि, awt, पेंट, अनंत

कैसे एक अनंत छवि पाश को लागू करने के लिए? - जावा, छवि, awt, पेंट, अनंत

मैं वर्तमान में चलती पृष्ठभूमि के साथ 2 डी शूटर पर काम कर रहा हूं। पृष्ठभूमि सिर्फ एक साधारण छवि है। मैं लागू करना चाहता हूं कि छवि ऊपर से नीचे तक अंतहीन चल रही है।

मैंने उस छवि के हिस्से को निर्धारित करने के बारे में सोचा जो फ्रेम के दृश्य भाग के बाहर सबसे नीचे है और इसे फिर से शीर्ष पर पेंट करें।

@Override
public void paint(Graphics go) {
Graphics2D g = (Graphics2D) go;

g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.drawImage(this.imgBackground, 0, this.yBackground, this);
}

yBackground वह समन्वय है जहाँ छवि के ऊपरी बाएँ कोने को खींचा जाता है। इसे दूसरे धागे से बदल दिया जाता है:

while (!this.paused) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}

int y = this.display.getBackgroundY();

if (y == this.display.getHeight()) {
y = 0;
} else {
y++;
}
this.display.setBackgroundY(y);
}

तो यहाँ मेरा सवाल है: मैं छवि का हिस्सा कैसे प्राप्त कर सकता हूं यह फ्रेम के दृश्य भाग के बाहर है?

उत्तर:

उत्तर № 1 के लिए 1

ऐसे कई तरीके हैं जिनसे आप इसे प्राप्त कर सकते हैं, लेकिन मूल आधार है, आपको किसी प्रकार के स्क्रॉल ऑफ़सेट की आवश्यकता है जो मूल छवि की शुरुआत को निर्धारित करता है।

फिर आपको उस स्थान को भरने से पहले और बाद में भरना होगा (यदि छवि छोटी है तो उपलब्ध ऊँचाई) जब तक कि स्थान भर न जाए।

निम्नलिखित उदाहरण ए का उपयोग करता है javax.swing.Timer किसी दिए गए राशि से ऑफसेट अपडेट करने के लिए। paintComponent विधि फिर वर्तमान छवि स्थिति सहित, इसके पहले और बाद में सभी स्थान प्रदान करती है।

यहां छवि विवरण दर्ज करें

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ScrollingBackground {

public static void main(String[] args) {
new ScrollingBackground();
}

public ScrollingBackground() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new BackgroundPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class BackgroundPane extends JPanel {

private BufferedImage bg;
private int yOffset = 0;
private int yDelta = 4;

public BackgroundPane() {
try {
bg = ImageIO.read(new File("Background.png"));
} catch (IOException ex) {
ex.printStackTrace();
}

Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
yOffset += yDelta;
if (yOffset > getHeight()) {
yOffset = 0;
}
repaint();;
}
});
timer.start();
}

@Override
public Dimension getPreferredSize() {
return bg == null ? new Dimension(200, 200) : new Dimension(bg.getWidth(), bg.getHeight());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (bg != null) {
Graphics2D g2d = (Graphics2D) g.create();

int xPos = (getWidth() - bg.getWidth()) / 2;
int yPos = yOffset;

while (yPos > 0) {
yPos -= bg.getHeight();
g2d.drawImage(bg, xPos, yPos, this);
}

yPos = yOffset;
while (yPos < getHeight()) {
g2d.drawImage(bg, xPos, yPos, this);
yPos += bg.getHeight();
}

g2d.dispose();
}
}
}
}

आप एक बैकिंग बफर और या सबइमेज का उपयोग करके इसे आशावाद करने में सक्षम हो सकते हैं, लेकिन आपको यह विचार मिलता है ...


उत्तर № 2 के लिए 1

आप बस छवि को फिर से ऊंचाई पर शुरू कर सकते हैं yBackground + imgBackground.getHeight()। दृश्य के ऊपर विस्तार अतिरिक्त बंद हो जाता है, जैसे नीचे आपके कोड में पहले से ही बंद है।