Zum Inhalt springen

Devilmarkus

Mitglieder
  • Gesamte Inhalte

    158
  • Benutzer seit

  • Letzter Besuch

  1. 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!
  2. Ok selbst-Beantwortung: Ich hatte im Projektordnernamen ein ! , das mag Java nicht. Von jedem anderen Ordner aus ausgeführt, funktioniert es.
  3. 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?
  4. 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; }
  5. 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
  6. Das Hauptproblem liegt leider darin, dass ich von der Original Hardware keinen Schimmer habe. Also weiss ich nicht, wann, wo in welchem Fall, welche Komponente einen Interrupt erzeugen soll / löschen soll. Ausserdem besteht der Emulator, welchen ich bearbeite, aus 'Mischcode'. Der Emulatorkern ist von 2002-2004 und seitdem kaum noch vom Originalautor überarbeitet worden. Im Prinzip bügel ich nur die Fehler aus, und verbessere die Emulation so gut ich kann, hier & da. Die "CPC Plus" Emulation ist dabei völliges Neuland für mich, und da adaptiere ich den Code, soweit ich ihn verstehe, von einem völlig anderen Emulator, welcher halt in C geschrieben wurde. Selbstverständlich habe ich Erlaubnis von allen Seiten, den Code zu verwenden und zu ändern. Der Rest basiert auf Trial- & Error...
  7. Paar Fehler sind zwar noch irgendwo versteckt (hat nichts mit diesem Thema zu tun), aber dank Klotzkopp funktioniert nun schon einiges mehr. Zum Testen: (Amstrad CPC+ Emulation) JavaCPC games site Im Menü die Standardversion und dann die Amstrad Plus Variante auswählen. Leertaste und Cursortasten fürs Menü. Joystick (im Spiel) liegt auf den Ziffernblocktasten bei Num-Lock ein. Die Raster (Interruptgeschaltet) verwalten hier die Farbbalken und Bildschirmanordnung. Ohne diesen Bugfix sah es Katastrophal aus!!! Also Danke nochmal an Klotzkopp!!!
  8. Waaaahhhhh!!! Klotzkopp!!! Du bist mein Held!!!! Das war es!!! *knutsch* (Manchmal sieht man den Wald vor lauter Bäumen nicht)
  9. Ok... Ein Versuch: Wie kann ich in Java "unsigned short" simulieren? (Es ist tatsächlich abhängig davon!)
  10. Hallo zusammen, momentan beschäftige ich mit einer kleinen Portierung von C zu Java. Dabei bin ich auf ein kleines Problem gestossen: Eine Routine erreicht in meinem Code leider nicht die Punkte "set channel interrupt" und "stop channel". Ist das eventuell ein Fehler, der Aufgrund von Berechnungen erfolgt? Hier die Codebeispiele: C code (Original) void ASIC_DMA_ExecuteCommand(int ChannelIndex) { Z80_WORD Command; int CommandOpcode; int Addr; ASIC_DMA_CHANNEL *pChannel = &ASIC_Data.DMAChannel[ChannelIndex]; Addr = ASIC_Data.DMA[ChannelIndex].Addr.Addr_W; Command = ASIC_DMA_GetOpcode((Z80_WORD)(Addr & 0x0fffe)); CommandOpcode = (Command & 0x07000)>>12; Addr = Addr+2; if (CommandOpcode == 0) { /* LOAD R,D */ int Register; int Data; int PreviousRegisterSelected; /* PSG register */ Register = (Command>>8) & 0x0f; /* data to write */ Data = (Command & 0x0ff); /* store current selected PSG address register */ PreviousRegisterSelected = PSG_GetSelectedRegister(); /* select new register */ PSG_RegisterSelect(Register); /* write data */ PSG_WriteData(Data); /* select previous register again - not to upset other code */ PSG_RegisterSelect(PreviousRegisterSelected); } else { if (CommandOpcode & 0x01) { /* PAUSE n */ /* pause of 0 is equivalent to a NOP */ int PauseCount = Command & 0x0fff; if (PauseCount-1!=0) { pChannel->PauseCount = PauseCount-1; pChannel->PrescaleCount = ASIC_Data.DMA[ChannelIndex].Prescale; pChannel->PauseActive = TRUE; } } if (CommandOpcode & 0x02) { /* REPEAT n */ /* store repeat count */ pChannel->RepeatCount = Command & 0x0fff; /* set next instruction as loop start */ pChannel->LoopStart = Addr & 0x0ffff; } if (CommandOpcode & 0x04) { /* NOP, LOOP, INT, STOP */ if (Command & 0x0001) { /* LOOP */ /* if loop count is 0, this acts like a NOP */ /* check repeat count */ if (pChannel->RepeatCount!=0) { /* decrement count */ pChannel->RepeatCount--; /* reload channel addr from stored loop start */ Addr = pChannel->LoopStart; } } if (Command & 0x0010) { /* INT */ /* set channel interrupt */ ASIC_Data.InternalDCSR|=1<<(6-ChannelIndex); } if (Command & 0x0020) { /* STOP */ /* stop channel */ ASIC_Data.InternalDCSR&=~(1<<ChannelIndex); } } } ASIC_DMA_WriteChannelAddr(ChannelIndex, Addr); /* ASIC_Data.DMA[ChannelIndex].Addr.Addr_W=(unsigned short)Addr; */ ASIC_UpdateRAMWithInternalDCSR(); } Hier meine abgewandelte Java-Version: void ASIC_DMA_ExecuteCommand(int ChannelIndex) { // ASIC_DMA_CHANNEL pChannel[] = this.pChannel; int Command; int CommandOpcode; int Addr; Addr = DMA[ChannelIndex].Addr.getAddr_W(); Command = ASIC_DMA_GetOpcode((Addr & 0x0fffe)); CommandOpcode = (Command & 0x07000) >> 12; Addr = Addr + 2; if (CommandOpcode == 0) { /* * LOAD R,D */ int Register; int Data; int PreviousRegisterSelected; /* * PSG register */ Register = (Command >> 8) & 0x0f; /* * data to write */ Data = (Command & 0x0ff); /* * store current selected PSG address register */ PreviousRegisterSelected = psg.getSelectedRegister(); /* * select new register */ psg.setSelectedRegister(Register); /* * write data */ psg.writeData(Data); /* * select previous register again - not to upset other code */ psg.setSelectedRegister(PreviousRegisterSelected); } else { if ((CommandOpcode & 0x01) != 0) { /* * PAUSE n */ /* * pause of 0 is equivalent to a NOP */ int PauseCount = Command & 0x0fff; if (PauseCount - 1 != 0) { pChannel[ChannelIndex].PauseCount = PauseCount - 1; pChannel[ChannelIndex].PrescaleCount = 0;//ASIC_Data.DMA[ChannelIndex].Prescale; pChannel[ChannelIndex].PauseActive = true; } } if ((CommandOpcode & 0x02) != 0) { /* * REPEAT n */ /* * store repeat count */ pChannel[ChannelIndex].RepeatCount = Command & 0x0fff; /* * set next instruction as loop start */ pChannel[ChannelIndex].LoopStart = Addr & 0x0ffff; } if ((CommandOpcode & 0x04) != 0) { /* * NOP, LOOP, INT, STOP */ if ((Command & 0x0001) != 0) { /* * LOOP */ /* * if loop count is 0, this acts like a NOP */ /* * check repeat count */ if (pChannel[ChannelIndex].RepeatCount != 0) { /* * decrement count */ pChannel[ChannelIndex].RepeatCount--; /* * reload channel addr from stored loop start */ Addr = pChannel[ChannelIndex].LoopStart; } } if ((CommandOpcode & 0x0010) != 0) { /* * INT */ /* * set channel interrupt */ ASIC_Data.InternalDCSR |= 1 << (6 - ChannelIndex); } if ((CommandOpcode & 0x0020) != 0) { /* * STOP */ /* * stop channel */ ASIC_Data.InternalDCSR &= ~(1 << ChannelIndex); } } } ASIC_DMA_WriteChannelAddr(ChannelIndex, Addr); ASIC_UpdateRAMWithInternalDCSR(); } public class ASIC_ADDR { public addrb Addr_B = new addrb(); public void writeAddr_W(int word) { Addr_B.l = (word & 0xff); Addr_B.h = ((word >> 8) & 0x0ff); } class addrb { public int l; public int h; } public int getAddr_W() { return (Addr_B.l & 0xff) | ((Addr_B.h << 8) & 0xff00); } } Addr_B.l und Addr_B.h werden korrekt gesetzt (nicht hier im Code enthalten, da hierfür unwichtig) Gibt es zwischen C und Java mathematische Differenzen, welche ich hier nicht richtig berücksichtigt habe? Die "psg.setSelectedRegister" und - .writeData funktionieren auch korrekt! Es sieht aus, als ob der ChannelOpcode nicht richtig berechnet wird... Ich hoffe, mir kann hier jemand helfen
  11. Nun, ich habe die Routine "Texture zeichnen" auch auf pixels[] umgestellt. Das geht etwas schneller, als g.DrawImage. public void update(final int[] sourcepixels, final boolean usemask) { if (!ispainted) { if (DEBUG) { System.out.println("skipping " + frame++); } Display.painted = true; return; } ispainted = false; SwingUtilities.invokeLater(new Runnable() { public void run() { try{ frame = 0; imageoffset = startoff; for (y = 0; y < (halfsize ? 272 : 544); y++) { System.arraycopy(sourcepixels, 768 * y * (halfsize ? 2 : 1), pixels, imageoffset, 768); imageoffset += (texsizeX); } raster.setDataElements(0, 0, texsizeX, texsizeY, pixels); imagecomponent.set(display); } catch (Exception e){} ispainted = true; Display.painted = true; } }); } InvokeLater, damit wird es "smoother". Ist aber immernoch nicht das Gelbe vom Ei. Bei der kleinen Texturgrösse (1024x512) habe ich locker 50fps, allerdings fehlen hier ein paar Details. Bei der Grossen habe ich ~40fps. "Skipped frames" habe ich übrigens keine!
  12. Ja das OpenGL sicherlich. Das "Textur-Updaten" 50x pro Sekunde nur leider nicht... Im BufferedImage kann ich pixels[] verwenden, um so schnell Bildbereiche zu füllen. In der Textur leider nicht. Da muss ich leider jedesmal "DrawImage(image,x,y,w,h);" verwenden, was wesentlich langsamer ist.
  13. Hallo Zusammen, ich befasse mich momentan mit der Emulation der CRT Bildröhre. Dazu verwende ich JOGL und pinsel das Bild auf eine riesige Kugel mit einer Texturgrösse von 1024x1024 Pixeln. (Die eigentliche Bild-Source ist allerdings nur 768x544 Pixel gross) Nun würde ich gerne wissen, ob man mit Graphics2D auch solch ein Bild derartig verzerren kann: (Zum Vergrössern draufklicken) JOGL ist zwar ganz nett, allerdings bin ich mit der Framerate noch sehr unzufrieden, die bei ~20-30 fps herumdümpelt... (50 sollen es sein) Gibt es also eine Routine, mit der man ein Bild so "abrunden" kann? Achtung! Die Ecken müssen nicht abgerundet werden! Das ist hier eine draufgezeichnete Maske! Normal laufen die Ecken auch spitz zusammen.
  14. Meine Idee wäre ja sowas hier: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jemu.ui; /** * * @author Markus */ public class Converter { public Class converter; public void init() { ClassLoader classLoader = Converter.class.getClassLoader(); try { converter = classLoader.loadClass("Converter"); } catch (ClassNotFoundException e) { converter = null; } } } Nur habe ich nun das Problem, dass ich zwar "Converter.class" lese, damit aber nichts anfangen kann? Ich muss ja anschliessend z.b. converter.Cycle(); ausführen können...
  15. Hallo zusammen, ich habe folgendes Problem: Ich möchte eine Library verwenden, welche ich leider nicht in Source-Form habe. Das Problem ist aber, dass die .class Dateien direkt im "Root" der .JAR Datei stehen. Import mainclass.class funktioniert also nicht. Die Source, die die Library importieren soll, ist NICHT im Root! Beispiel: Ich habe eine Klasse in classes.media Diese beginnt logischerweise mit Package classes.media; Wie kann ich dieser Klasse nun begreiflich machen, dass sie converter.class aus dem Root importieren soll? Import ../../converter.class geht ja nicht... Gibt es dafür eine Lösung?

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...