Deutsch

Игры чII (продолжение) 29.03.2024

551  
uscheswoi_82 коренной житель29.03.24 02:28
uscheswoi_82
NEW 29.03.24 02:28 
Последний раз изменено 29.03.24 02:34 (uscheswoi_82)

В детстве в Алматы я знал примерно только два человека, у которых была приставка Денди, а у нас же дома в конце 80х был настоящий компьютер. Ну так вот, если память мне не изменият в гости меня никто не приглашал, я знал только про эту приставку. Денди это китайский клон Японской Nintendo Famicom или Nintendo Entertainment System. Я не знаю как делали игры японцы, но лично я пользусь cc65 для компиляции игры с Си в NES, FamiTracker для создания музыки, YY-Chr для создания шрифтов и спрайтов, FCEUX эмулятор, для тестирования игры.


1. Сначало нужно настроить cc65, компилятор у меня находится в директории C:\cc65_2023_new создадим bat-файл, пусть будет называться compile.bat:

@echo off
SET CC65_PATH=C:\cc65_2023_new
SET CC65_HOME=C:\cc65_2023_new
C:\cc65_2023_new\bin\cl65 -L C:\cc65_2023_new\lib -t nes -I C:\cc65_2023_new\include %1 -o %2


2. Небольшой пример hello.c:

#include <nes.h>
void printtext(char *str) {
  *((unsigned char *)0x2006) = 0x21;
  *((unsigned char *)0x2006) = 0x42;
  while(*str) {
    *((unsigned char *)0x2007) = *str; str++;
  }
}
int main() {
  waitvsync();
  *((unsigned char *)0x2006) = 0x3F;
  *((unsigned char *)0x2006) = 0x00;
  *((unsigned char *)0x2007) = 1;
  *((unsigned char *)0x2006) = 0x3F;
  *((unsigned char *)0x2006) = 0x03;
  *((unsigned char *)0x2007) = 0x30;
  printtext("Hallo Forum! Ein Beispiel! Hallo von uscheswoi_82");
  *((unsigned char *)0x2005) = 0x00;
  *((unsigned char *)0x2005) = 0x00;
  *((unsigned char *)0x2001) = 8;   
  while(1);
  return 0;
}


Если в коде будет ошибка cc65 обязательно покажет, в каком месте ошибка например:

C:\cc65_new>compile.bat hello.c hello.nes
hello.c:22: Error: Undefined symbol: 'x'
hello.c:22: Error: ';' expected
2 errors and 0 warnings generated.


Но в нашем коде ошибки не будет, нужно ввести следующую команду:

C:\cc65_new>compile.bat hello.c hello.nes

Программа выводит текст на консоль Hallo Forum! Ein Beispiel! Hallo von uscheswoi_82. Вот запуск программы на эмуляторе FCEUX:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#1 
uscheswoi_82 коренной житель01.04.24 09:57
uscheswoi_82
NEW 01.04.24 09:57 
в ответ uscheswoi_82 29.03.24 02:28

Так выглядет программа YY-Chr:


Итак нарисуем мордочку, вместо 0:


2. Удалим число 0:



3. Нарисуем кружок:


Вот так должна выглядеть морда:


Вот сам весь шрифт:



Вот код:

#include <nes.h>
void printtext(char *str) {
  *((unsigned char *)0x2006) = 0x21;
  *((unsigned char *)0x2006) = 0x42;
  while(*str) {
    *((unsigned char *)0x2007) = *str; str++;
  }
}
int main() {
  waitvsync();
  *((unsigned char *)0x2006) = 0x3F;
  *((unsigned char *)0x2006) = 0x00;
  *((unsigned char *)0x2007) = 1;
  *((unsigned char *)0x2006) = 0x3F;
  *((unsigned char *)0x2006) = 0x03;
  *((unsigned char *)0x2007) = 0x30;
  printtext("0 Hallo Forum! Ein Beispiel! Hallo von uscheswoi_82");
  *((unsigned char *)0x2005) = 0x00;
  *((unsigned char *)0x2005) = 0x00;
  *((unsigned char *)0x2001) = 8;   
  while(1);
  return 0;
}


Вот результат работы программы на эмуляторе:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#2 
uscheswoi_82 коренной житель01.04.24 09:59
uscheswoi_82
01.04.24 09:59 
в ответ uscheswoi_82 01.04.24 09:57

Вместо 0, там подставилась вот такая морда


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#3 
uscheswoi_82 коренной житель01.04.24 10:38
uscheswoi_82
NEW 01.04.24 10:38 
в ответ uscheswoi_82 01.04.24 09:59, Последний раз изменено 01.04.24 10:39 (uscheswoi_82)

Но! Если запускаю на железе (оно тоже эмулирует денди/NES), то происходит искажение:







Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Дневник тяжелобольного инвалида
#4