Zum Inhalt springen

Devilmarkus

Mitglieder
  • Gesamte Inhalte

    158
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Devilmarkus

  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?
  16. Beispiel: (Achtung! Applet!) Legale Webseite: JavaCPC games site Nun ist jemand (Ich) auf die Glorreiche Idee gekommen, das Spiel auf einer Fremdwebseite (Auch meine) einzubauen. Ergebnis: http://cpc-live.com/pirated.html
  17. Ja, danke, Funktioniert!!! (Man, hätte ich doch drauf kommen müssen.... tztztztz)
  18. Hallo Zusammen, kann mir jemand sagen, wie mein Applet erkennen kann, wenn es auf einer fremden Webseite eingebunden ist? getCodeBase() ist ja hilfreich, und verwende ich auch schon, aber woran kann ich erkennen, dass es nicht sogar von meinem Server geladen wird? Mit <param name="codebase" value="pfad_zu_meiner_webseite/"> lässt sich ja so ein Applet normal von jedem Server aus einbetten... Ich selbst verwende diesen Parameter auch, um Stress mit einigen Webbrowsern zu vermeiden. Gibt es da eine Möglichkeit, dass das Applet auch erkennt, dass die HTML bzw. PHP Seite, in die es eingebunden ist, nicht auf meinem Server liegt?
  19. Ich habe das Problem relativ simpel lösen können. int random = Util.random(999999999); scoreurl = new java.net.URL(domain+"/score/" + highs + "/" + highs + ".scores?"+random); ?xxxxxxxxx wird beim Lesen ignoriert, suggeriert dem Programm aber, dass es sich um eine andere Datei handelt... Und es wäre schon ein riesen Zufall, wenn die Spieler gleichzeitig die gleiche Zufallszahl generieren!
  20. Nun, die Datei wird korrekt geändert. Nur halt jedesmal, wenn ich sie neu einlese, steht dort noch im result der alte Inhalt. Auf dem Server ist aber die geänderte Datei.
  21. Kann man denn nicht den Java-Buffer irgendwie leeren? Ich habe mir schon einen Wolf gesucht
  22. Nun, das mag sicherlich sein. Die Datei gibt es nur auf meinem Server und das Applet wird auch nur auf meinem Server laufen. Allerdings habe ich auf meinem Server keinen Shell-Zugriff und kann demnach auch leider keine Scripte/Programme installieren. Und die Datei ist ja nun auch nur sehr klein (<1k) Von Remote Method Invocation, Common Object Request Broker, etc... habe ich leider Null Plan. Könnte mir da Jemand ein kleines Beispiel liefern?
  23. Hallo zusammen, ich habe folgendes Problem: Ich möchte eine Highscore-Tabelle während eines laufenden Spieles auf meinem Server aktualisieren. Ich kann: -> Die -Highscoretabelle einlesen. -> Prüfen, ob die Punkte meines aktuellen Spieles dort reingeschrieben werden sollen -> Die Liste erneut abspeichern. Nun taucht allerdings folgendes Problem auf: Obwohl ich, bevor ich die Liste neu abspeichere, erneut einlese, bringt sie nach JEDEM Aufruf immer das gleiche Ergebnis. (Also immer das Ergebnis, welches beim ersten Aufruf gelesen wurde). Deshalb geht es z.B. nicht, dass mehrere Spieler GLEICHZEITIG das Spiel spielen und die Liste aktuell halten. Was kann ich nun hier ändern, dass die Datei WIRKLICH jedesmal erneut geladen wird, und nicht irendwo in irgendeinem JavaBuffer herumdümpelt? public void checkScores() { write = false; for (int i = 0; i < display.score.length; i++) { if (display.highscores > display.score[i]) { display.score[i] = display.highscores; display.users[i] = display.user; write = true; break; } } if (write) { try { String inputLine = null; String result = ""; scoreurl = new java.net.URL(domain+"/score/" + highs + "/" + highs + ".scores"); scoreconnection = scoreurl.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(scoreconnection.getInputStream())); while ((inputLine = in.readLine()) != null) { result += inputLine; } in.close(); System.gc(); // -SNIP- (Liste wird hier noch weiterverarbeitet, ist aber für das Problem unwichtig
  24. Also folgendes Problem taucht auf: Werte von 0 - 0x02ff bzw 0 - 0x03ff werden korrekt dargestellt. Werte von 0x0ff00 - 0x0ffff nicht. Die sind an falscher Position dann. Den Fehler sieht man hier deutlich: Erstellt von Camtasia Studio 7 Die "falsch" dargestellten Sprites haben eine X-Koordinate zwischen 0x0ff00 und 0x0ffff.
  25. Hallo zusammen, ich bin dabei, Sprite-Koordinaten einzulesen und sogenannte "Hardware Sprites" in meinem Schneider/Amstrad CPC Emulator darzustellen. Dabei bin ich auf ein Rechenproblem gestossen, welches die X-Koordinate betrifft. Vielleicht kann mir hier jemand helfen, es "richtig" umzurechnen: Die Sprite-X Koordinate wird aus dem RAM gelesen. Dabei gilt folgende Regel: Offset 0 Low byte of X coordinate Offset 1 High byte of X coordinate Offset 2 Low byte of Y coordinate Offset 3 High byte of Y coordinate When reading offsets 0,1,2 and 3, the following apply: Offset 0 and 2: any written byte is readable, the same value that is written is readable! BYTE_READ = BYTE_WRITTEN; Offset 1: If byte written & 0x03 is 0,1 or 2, the value & 0x03 is read back. If the byte written & 0x03 is 3 then 0x0ff is read back. if ((BYTE_WRITTEN & 0x03)==0x03) { BYTE_READ = 0x0ff; } else { BYTE_READ = BYTE_WRITTEN & 0x03; } Soweit, so gut, das mache ich mit dieser Funktion: spritepos = 0x6000 + (index * 0x08); posbuf[0] = (byte) readFromAsic(spritepos); posbuf[1] = (byte) readFromAsic(spritepos + 1); if ((posbuf[1] & 0x03) == 3) { posbuf[1] = (byte) 0x0ff; } else { posbuf[1] = (byte) (posbuf[1] & 0x03); } spriteX[index] = getWord(posbuf, 0); Nun ergibt sich ein schwierigeres Problem für mich. Regel: The range is &000-&3FF (0-1023) or &FF00-&2FF (-256 to +767). Dieses versuche ich so zu berechnen, aber das ist Falsch: if ((spriteX[index] & 0x0300) == 0x0300) { // spriteX[index] = spriteX[index] & 0x02ff; spriteX[index] |= 0x0ff00; } if ((spriteX[index] & 0x08000) != 0) { spriteX[index] = -((0 - spriteX[index]) & 0x0ffff); } Kann mir jemand sagen, wie ich die Regel hier verwenden muss? Ich wäre SEHR dankbar hierfür Gruss, Markus

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...