Aloitin eilen pelin tekemisen, kirjan innoittamana. Olen koodannut Javalla abouttia rallaa 1,5 vuotta.
Sain eilen 13 tunnissa jo ihan hyvät pohjat aikaan, kuten pelihahmon, tile mapin ja animaatioita. Hommahan toimii ihan hyvin, pelihahmo liikkuu, ruutu skrollaa ja hahmolla voi ampua. Jokaisella "entityllä" on omat animaatiot myöskin toteuttu.
Kun painat näppäintä I, pitäisi ponnahtaa inventory. Osaan implemoida ActionListener rajapinnan, mutta varsinainen ongelma on se, että miten saan inventoryn ruudulle ja pystyn liikuttelemaan sitä. (Myöhemmässä vaiheessa toteutan MouseListener rajapinnan).
Yritin aluksi JDialogilla, ei onnaa, dialogi jäi fullscreenin alle.
Yritin myös jotain omaperäisempiä ratkaisuja kuten:
public class Inventory extends JPanel
Sain paneelin piirtämään itsensä ruudulle. Paikkaa en saanut vaihdettua. Onko tuo järkevä ratkaisu? Jos on voisiko joku, mahdollisesti sinä, näyttää miten homma toimisi? Grafiikka hommat Javalla (eikä millään muullakaan kielellä) ole niin tuttua hommaa.
Ilmeisesti piirrät varsinaista peliä suoraan ikkunaan? Jos piirtäisit sen omaan paneeliinsa, muu käyttöliittymä olisi helppo toteuttaa ihan tavalliseen Swing-tyyliin.
Joo, suoraan ikkunaan atm. Täytyypä pistää korvan taakse tuo omaan paneeliin piirtäminen. Keksin nyt vaihtoehtoisen ratkaisun, ei ehkä paras, mutta toimii sen aikaa kun keksin paremman tai toteutan tuon omaan paneeliin piirron, mutta tälläsellä ratkaisulla pelitti:
NullRepaintManager.java
public class NullRepaintManager extends RepaintManager { public static void install() { RepaintManager repaintManager = new NullRepaintManager(); repaintManager.setDoubleBufferingEnabled(false); RepaintManager.setCurrentManager(repaintManager); } // pari muuta metodia, tyhjiä }
Game.java
public void init() { // muut alustukset ylempänä NullRepaintManager.install(); JFrame frame = (JFrame) screen.getFullScreenWindow(); Container contentPane = frame.getContentPane(); contentPane.setLayout(null); // absolute layout ((JComponent) contentPane).setOpaque(false); contentPane.add(inventoryGUI); } public void draw(Graphics g) { // muut piirrokset tapahtuu ylempänä frame.getContentPane().paintComponents(g); }
InventoryGUI.java
@Override // InventoryGUI toteuttaa MouseMotionListener rajapinnan public void mouseDragged(MouseEvent e) { setBounds(e.getX()+getLocation().x, e.getY()+getLocation().y, WIDTH, HEIGHT); }
Mielipiteitä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.