Визуальная электроника

Flappy Bird — игра для мобильных устройств, разработанная вьетнамским разработчиком Донгом Нгуеном, в которой игрок с помощью касаний экрана должен контролировать полёт птицы между рядами зелёных труб, не задевая их. Была реализована на платформах iOS и Android.

Игра была выпущена 24 мая 2013 года и получила внезапный рост популярности в начале 2014 года. Была подвергнута критике за сложный игровой процесс, плагиат графики и игровой механики, другие обозреватели посчитали, что она вызывает привыкание. В конце января 2014 стала самой скачиваемой бесплатной игрой в App Store. В течение этого времени разработчик зарабатывал $50 000 в день за рекламу внутри приложения.

10 февраля 2014 года Flappy Bird была удалена разработчиком из App Store и Google Play. После этого появилась тенденция продавать смартфоны с заранее установленной игрой, чаще всего за крупную сумму. Это также вызвало появление множества клонов игры, создаваемых разработчиками в надежде повторить успех оригинала.

На всеми любимом GitHub была найдена эта замечательная игра. Мы по старой традиции решили портировать ее под нашу плату VE-XC6SLX9, естественно в надежде повторить успех оригинала :))). Основной модуль дизайна представлен ниже:

Verilog Code:
  1. module TopModule(Clk,Button,Reset, vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B,Speaker);
  2. input Clk,Button,Reset;
  3. output vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B ,Speaker;
  4.  
  5. wire inDisplayArea;
  6. wire [9:0] CounterX;
  7. wire [8:0] CounterY;
  8. wire [24:0] Clks;
  9. wire Status;
  10. wire [15:0] Pattern1;
  11. wire [15:0] Pattern2;
  12. wire [15:0] PipesPosition1;
  13. wire [15:0] PipesPosition2;
  14. wire [15:0] R_Pipes_off;
  15. wire [15:0] R_Bird_off;
  16. wire Button;
  17. wire Clk25;
  18.  
  19. //Генератор с фазовой автоподстройкой частоты 50МГц -> 25 МГц
  20. clk_wiz_v3_6 main_pll(.CLK_IN1(Clk),.CLK_OUT1(Clk25));
  21.  
  22. //Модуль синхронизации VGA сигнала
  23. VGAOut syncgen(.Clk(Clk25), .vga_h_sync(vga_h_sync), .vga_v_sync(vga_v_sync), .inDisplayArea(inDisplayArea), .CounterX(CounterX), .CounterY(CounterY));
  24.  
  25. //Антидребезг, не используется
  26. //Debouncer deb (Clk25,Button,Button);
  27.  
  28. //Счетчик временных состояний
  29. SlowClock s1 (Clk25,Reset,Clks);
  30.  
  31. //Проверка состояния игры
  32. StatusChecker s7 (Reset,CounterX,R_Pipes_off,R_Pipes2_off,R_Bird_off,Status);
  33.  
  34. //Прорисовка игровых объектов
  35. DrawBackground s2 (Clks,Status,CounterX,CounterY,R_Background,G_Background,B_Background);
  36. DrawOnBackground s22 (Clks,CounterX,CounterY,R_OnBackground_on,G_OnBackground_on,B_OnBackground_on,R_OnBackground_off,G_OnBackground_off,B_OnBackground_off);
  37.  
  38. DrawBird s3 (Clks,Reset,CounterX,CounterY,Button,Status,R_Bird_on,G_Bird_on,B_Bird_on,R_Bird_off,G_Bird_off,B_Bird_off);
  39.  
  40. DrawPipes s4 (Clks,Reset,CounterX,CounterY,Button,Status,Pattern1,R_Pipes_on,G_Pipes_on,B_Pipes_on,R_Pipes_off,G_Pipes_off,B_Pipes_off,PipesPosition1);
  41. DrawPipes2 s44 (Clks,Reset,CounterX,CounterY,Button,Status,Pattern2,R_Pipes2_on,G_Pipes2_on,B_Pipes2_on,R_Pipes2_off,G_Pipes2_off,B_Pipes2_off,PipesPosition2);
  42.  
  43. Pattern p (Clks,Reset,PipesPosition1,PipesPosition2,Button,Pattern1,Pattern2);
  44.  
  45. DrawScore s5 (Clks,~Reset,PipesPosition1,PipesPosition2,CounterX,CounterY,Button,Status,R_Score_on,G_Score_on,B_Score_on,R_Score_off,G_Score_off,B_Score_off);
  46.  
  47. DrawItem s6 (Clks,CounterX,CounterY,Button,R_Item_on,G_Item_on,B_Item_on,R_Item_off,G_Item_off,B_Item_off);
  48.  
  49. DrawBoard dd (Clks,Reset,CounterX,CounterY,Button,Status,R_Board_on,G_Board_on,B_Board_on,R_Board_off,G_Board_off,B_Board_off);
  50.  
  51. //Звуковое сопровождение
  52. Sound so (Clk25,PipesPosition1,PipesPosition2,Speaker);
  53.  
  54. //Комбинация сигналов
  55. wire RLayer0 = (R_Background | R_OnBackground_on) & ~R_OnBackground_off;
  56. wire GLayer0 = (G_Background | G_OnBackground_on) & ~G_OnBackground_off;
  57. wire BLayer0 = (B_Background | B_OnBackground_on) & ~B_OnBackground_off;
  58.  
  59. wire RLayer1 = (RLayer0 & ~R_Pipes_off) & ~R_Pipes2_off;
  60. wire GLayer1 = ((GLayer0 | G_Pipes_on | G_Pipes2_on) & ~G_Pipes_off) & ~G_Pipes2_off;
  61. wire BLayer1 = (BLayer0 & ~B_Pipes_off) & ~B_Pipes2_off;
  62.  
  63. wire RLayer2 = (RLayer1 | R_Board_on) &~R_Board_off;
  64. wire GLayer2 = (GLayer1 | G_Board_on) &~G_Board_off;
  65. wire BLayer2 = (BLayer1 | B_Board_on) &~B_Board_off;
  66.  
  67. wire RLayer3 = (RLayer2 | R_Bird_on) & ~R_Bird_off;
  68. wire GLayer3 = (GLayer2 | G_Bird_on) & ~G_Bird_off;
  69. wire BLayer3 = (BLayer2 | B_Bird_on) & ~B_Bird_off;
  70.  
  71. wire RLayer4 = (RLayer3 | R_Score_on) & ~R_Score_off;
  72. wire GLayer4 = (GLayer3 | G_Score_on) & ~G_Score_off;
  73. wire BLayer4 = (BLayer3 | B_Score_on) & ~B_Score_off;
  74.  
  75. reg vga_R, vga_G, vga_B;
  76. always @(posedge Clk25)
  77. begin
  78. begin
  79. vga_R <= RLayer4 & inDisplayArea;
  80. vga_G <= GLayer4 & inDisplayArea;
  81. vga_B <= BLayer4 & inDisplayArea;
  82. end
  83. end
  84. endmodule

Назначение модулей, входящих в проект, расписано в комментариях к коду. Ниже можно увидеть результат работы, и скачать исходные файлы:

Проект игры Flappy Bird: flappy_bird.zip

Добавить комментарий