Zpět na domů

Java pro Sega Mega Drive: technická příručka

Článek popisuje proces vývoje her pro Sega Mega Drive s použitím Java prostřednictvím translátoru Java Grinder. Jsou zváženy grafický systém, práce s paletou, sprity, pozadím a zpracování vstupu z gamepadu.

Je možné psát hry pro Sega v Javě? Ano!
Advertisement 728x90

# Vývoj her pro Sega Mega Drive v Javě: technická příručka

Ano, v Javě lze psát hry pro Sega Mega Drive. To je možné díky projektu Java Grinder – překladači bajtového kódu JVM do assembleru Motorola 68000. I když je platforma zastaralá, zájem o retro vývoj mezi inženýry zůstává vysoký, zejména když se objevují nekonvenční způsoby interakce se starým hardwarem.

Příprava prostředí

Java Grinder byl původně vyvíjen pro Linux, proto pro práci na Windows se doporučuje použít WSL. Je nutné nainstalovat kompilátor javac (např. přes OpenJDK) a utilitu make. Dále se provádějí následující kroky:

  • Klonování repozitáře Java Grinder a sestavení spustitelného souboru java_grinder.
  • Vygenerování knihovny JavaGrinder.jar příkazem make java.
  • Sestavení assembleru naken_asm a umístění do adresáře Java Grinder.
  • Použití šablonského projektu (např. Empty-project-Java-Grinder) jako základu pro novou hru.

Všechny tyto komponenty tvoří minimální nástrojový řetězec pro převod Java kódu do ROM obrazu kompatibilního s emulátory nebo originální konzolí.

Google AdInline article slot

Práce s grafikou

Sega Mega Drive používá dlaždicovou grafickou architekturu: obrazovka je složena z bloků 8×8 pixelů. Každý tile zabírá 32 bajtů ve video paměti (VRAM), barva každého pixelu je určena indexem v 16barevné paletě. Paleta je uložena v CRAM (Color RAM) a sestává z 9bitových hodnot.

Příklad definice palety:

public static short[] palette = {
  0xECE, 0x0A0, 0x0C0, 0x080, 0xEEE, 0x88C, 0xAAE, 0x246,
  0x8AE, 0x68C, 0x66A, 0xE80, 0xEA0, 0xC60, 0xC40, 0xA00
};

Barvy jsou zadány ve formátu 9bitové palety, kde je každý kanál (R, G, B) reprezentován 3 bity. Převod z RGB probíhá podle vzorce:

Google AdInline article slot
((B >> 5) << 9) | ((G >> 5) << 5) | ((R >> 5) << 1)

Obrácený převod není přesný kvůli ztrátě informací při posunu.

Pozadí a sprity

Pozadí se skládá ze tří komponent:

  • Paleta – pole short[].
  • Dlaždice – pole int[] pattern, obsahující zakódovaná pixelová data.
  • Mapa dlaždic – pole int[] image, určující, které dlaždice a v jakém pořadí zobrazit.

Načtení pozadí probíhá přes API:

Google AdInline article slot
SegaGenesis.setPaletteColors(palette);
SegaGenesis.setPatternTable(pattern);
SegaGenesis.setImageData(image);

Sprity fungují podobně, ale bez mapy dlaždic. Každý sprite se načte přímo do VRAM, což je méně efektivní, ale jednodušší na implementaci. Pro ovládání spritů slouží metody:

  • setSpritePosition(index, x, y) – nastavuje souřadnice.
  • setSpriteConfig1() a setSpriteConfig2() – definují velikost, paletu, adresu ve VRAM a vlajky zrcadlení.

Důležité: sprity se vykreslují v souřadnicovém systému 512×512, kde levý horní roh obrazovky odpovídá bodu (128, 128).

Vstup z gamepadu

API poskytuje metodu SegaGenesis.getJoypadValuePort1(), která vrací bitovou masku stavu tlačítek. Konstanty pro kontrolu:

public static final int JOYPAD_UP    = 0x0001;
public static final int JOYPAD_DOWN  = 0x0002;
public static final int JOYPAD_LEFT  = 0x0004;
public static final int JOYPAD_RIGHT = 0x0008;
public static final int JOYPAD_B     = 0x0010;
public static final int JOYPAD_C     = 0x0020;
public static final int JOYPAD_A     = 0x1000;
public static final int JOYPAD_START = 0x2000;

Správná kontrola stisku vyžaduje bitovou operaci:

int state = SegaGenesis.getJoypadValuePort1();
if ((state & SegaGenesis.JOYPAD_A) != 0) {
  // Zpracování stisku tlačítka A
}

To umožňuje správné zpracování současného stisku více tlačítek.

Omezení a specifika

  • Podporován je pouze velký latinský alfabet pro textový výstup.
  • Funkce print() neprovádí automatický zalomení řádků.
  • Písmo zabírá fixní rozsah VRAM (0x0460–0x0479) – nelze ho přepsat.
  • Maximální velikost palety – 16 barev na jeden prvek (pozadí nebo sprite).
  • Pro sprity jsou k dispozici samostatné sloty palet (indexy 16–63 v CRAM).

Co je důležité

  • Java Grinder překládá bajtový kód JVM do assembleru 68K, což umožňuje použití Javy pro retro platformy.
  • Grafika je založena na dlaždicích 8×8 s 16barevnou 9bitovou paletou.
  • Ovládání vyžaduje bitovou kontrolu stavu gamepadu.
  • Pozadí a sprity se načítají odděleně s různými omezeními paměti.
  • Přesné reprodukování barev z RGB není možné bez tabulky odpovídajících hodnot.

— Editorial Team

Advertisement 728x90

Číst dál