Alle Beiträge von Devilmarkus
-
Java: Wieso werden Resourcen nicht gelesen?
Stimmt, ich Dussel. Das hab ich glatt falsch gemacht. Klar muss ich die Methode run() implementieren! Mache ich normalerweise auch. Das war definitiv ein Tippfehler. Danke für den Tipp!
-
Java: Wieso werden Resourcen nicht gelesen?
Ok selbst-Beantwortung: Ich hatte im Projektordnernamen ein ! , das mag Java nicht. Von jedem anderen Ordner aus ausgeführt, funktioniert es.
-
Java: Wieso werden Resourcen nicht gelesen?
Hallo zusammen, ich bin dabei, ein Spielchen zu programmieren. Dafür möchte ich ein Font definieren und 2 verschiedene Mauspfeile anzeigen. Das klappt im Compiler (Netbeans) auch perfekt! Nur, wenn ich die Datei zur .jar kompiliere, kann die ausgeführte .jar Datei die Resourcen nicht finden?!?!? Folgendes habe ich schon überprüft: - Ja, die Resourcen sind in der .jar Datei am richtigen Platz - Ja, ich habe auf Case-Sensitive geachtet. - In anderen Programmen von mir funktioniert das auch! Code Snippets: public class Scene extends JLabel { public Scene() { InputStream in = this.getClass().getResourceAsStream("/classes/Roman.ttf"); try { font = Font.createFont(Font.TRUETYPE_FONT, in).deriveFont(Font.BOLD, 46); in.close(); } catch (Exception e) { } URL curUrl1 = getClass().getResource("/classes/mouse1.png"); mouse = getToolkit().getImage(curUrl1); URL curUrl2 = getClass().getResource("/classes/mouse2.png"); mouseclicked = getToolkit().getImage(curUrl2); } ---- snip ---- public static void main(String[] args) { final JFrame frame = new JFrame("Test"); frame.setUndecorated(true); BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor"); final Scene scene = new Scene(); scene.setCursor(blankCursor); scene.setPreferredSize(new Dimension(1920, 1080)); frame.setLayout(new BorderLayout()); frame.add(scene, BorderLayout.CENTER); frame.pack(); frame.setAlwaysOnTop(true); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); scene.addKeyListener(scene.keys); scene.addMouseListener(scene.m); scene.addMouseMotionListener(scene.mm); scene.setFocusable(true); scene.setScene(0); Thread runMe= new Thread() { public void start() { while (true) { Graphics g = scene.getGraphics(); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g = g2; scene.drawThisScene(); java.awt.Image img = scene.thisscene.getScaledInstance(-1, scene.getHeight(), java.awt.Image.SCALE_FAST); if (scene.tr == 0) { g.setColor(Color.BLACK); g.fillRect(0, 0, scene.getWidth(), scene.getHeight()); g.drawImage(img, (scene.getWidth() - img.getWidth(null)) >> 1, 0, null); } frame.setTitle(scene.name); scene.requestFocus(); try { Thread.sleep(50); } catch (Exception e) { } } } }; runMe.start(); } ---- snip ---- } Wie gesagt, das Spiel (soweit man schon von Spiel reden kann) funktioniert 100% direkt aus Netbeans kompiliert, aber starte ich es von der Kommandozeile, wenn es zur .JAR kompiliert ist, können die Resourcen nicht aus der .JAR geladen werden. Wer kann mir sagen, warum nicht?
-
Codeschnippel von C++ nach Java - Frage
Ok, habs herausgefunden (Zumindest so, dass es für meine Bedürfnisse funktioniert) public byte[] readCompressed(byte[] srcData, int offset, int w, int h) { w /= 2; int len = -80; byte color; int dOff = 0; int wCur = w; int hCur; do { hCur = h; int dOff2 = dOff; if (len == -80) { len = srcData[offset++]; if ((len & 0x80) != 0) { len = -128 + (len & 0x7f); } } boolean stop = false; for (; !stop;) { if (len >= 0) { color = srcData[offset++]; do { dstData[dOff2] = color; dOff2 += w; if (--hCur == 0) { if (--len < 0) { len = -80; } else { offset--; } stop = true; } } while (!stop && (--len >= 0)); } else { do { dstData[dOff2] = srcData[offset++]; dOff2 += w; if (--hCur == 0) { if (++len == 0) { len = -80; } stop = true; } } while (!stop && ++len != 0); } if (!stop) { len = srcData[offset++]; if ((len & 0x80) != 0) { len = -128 + (len & 0x7f); } } } dOff++; } while (--wCur > 0); return dstData; }
-
Codeschnippel von C++ nach Java - Frage
Hallo zusammen, ich versuche, aus einem alten DOS Spiel die Grafiken zu lesen. Das klappt soweit auch schon sehr gut, aber es gibt in dem Spiel auch komprimierte Grafiken. Nun war ich nicht ganz Faul, und habe mir den Source für die ScummVM angeschaut. Die kann das Spiel auch darstellen. Dort bin ich auch auf die Dekomprimierungsroutine gestoßen: byte *AGOSEngine::vc10_uncompressFlip(const byte *src, uint16 w, uint16 h) { w *= 8; byte *dst, *dstPtr, *srcPtr; byte color; int8 cur = -0x80; uint i, w_cur = w; dstPtr = _videoBuf1 + w; do { dst = dstPtr; uint h_cur = h; if (cur == -0x80) cur = *src++; for (;;) { if (cur >= 0) { /* rle_same */ color = *src++; do { *dst = color; dst += w; if (!--h_cur) { if (--cur < 0) cur = -0x80; else src--; goto next_line; } } while (--cur >= 0); } else { /* rle_diff */ do { *dst = *src++; dst += w; if (!--h_cur) { if (++cur == 0) cur = -0x80; goto next_line; } } while (++cur != 0); } cur = *src++; } next_line: dstPtr++; } while (--w_cur); srcPtr = dstPtr = _videoBuf1 + w; do { dst = dstPtr; for (i = 0; i != w; ++i) { byte b = srcPtr[i]; b = (b >> 4) | (b << 4); *--dst = b; } srcPtr += w; dstPtr += w; } while (--h); return _videoBuf1; } Das byte[]_videoBuf1 ist 32000 Bytes gross. (160x200 Pixel) Nun habe ich versucht, diese Routine in Java umzuwandeln, aber stoße absolut an meine Grenzen für das Verständnis von C++: byte[] vc10_uncompressFlip(byte[] src, int w, int h) { w *= 8; int dst; int soff = 0; int dstPtr; int srcPtr; byte color; int cur = -0x80; int i, w_cur = w; dstPtr = w; //we really write to videoMemory boolean break1 = false; soff = 0; nextline: do { dst = dstPtr; int h_cur = h; if (cur == -0x80) { cur = src[soff++]; } for (;;) { if (cur >= 0) { /* rle_same */ color = src[soff++]; do { _videoBuf1[dst] = color; dst += w; if (--h_cur != 0) { if (--cur < 0) { cur = -0x80; } else { soff--; } break1 = true; break; } } while (--cur >= 0); } else { /* rle_diff */ do { _videoBuf1[dst] = src[soff++]; dst += w; if (--h_cur != 0) { if (++cur == 0) { cur = -0x80; } break1 = true; break; } } while (++cur != 0); } if (break1) { break1 = false; break; } cur = src[soff++]; } dstPtr++; } while (--w_cur != 0); dstPtr = w; srcPtr = dstPtr; do { dst = dstPtr; for (i = 0; i != w; ++i) { int b = _videoBuf1[i + srcPtr] & 0x0ff; b = (b >> 4) | (b << 4); _videoBuf1[--dst] = (byte) b; } srcPtr += w; dstPtr += w; } while (--h >= 0); return _videoBuf1; } Wer kann mir hier weiter helfen? Ich verstehe weder die DO-Schleifen wirklich, noch, wie ich ein "Replacement" für das "goto" schaffen kann. Wer traut sich zu, den obigen Code möglichst 1:1 bzw, so, dass ich es verstehe, in einen Pseudo-Code zu wandeln? LG Markus