Guest User

main.cpp

a guest
Mar 2nd, 2017
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.57 KB | None | 0 0
  1. #include "chip8.h"
  2.  
  3. #include <SFML\Graphics.hpp>
  4.  
  5. void drawDisplay(const Chip8 &emu, sf::RenderWindow &window);
  6. void updateKeyState(Chip8 &emu, sf::Keyboard::Key key, unsigned char value);
  7.  
  8. int main(int argc, char **argv) {      
  9.     if(argc < 2)
  10.     {
  11.         std::cerr << "Usage: myChip8.exe \"file\"\n\n" << std::endl;
  12.         return -1;
  13.     }
  14.  
  15.     // initialize the Chip8 system and load the game into the memory
  16.     Chip8 emu;
  17.     emu.initialize();
  18.     if(!emu.loadGame("tetris.c8")) {
  19.         std::cerr << "Error: Could open the game file " << argv[1] << std::endl;
  20.         return -1;
  21.     }
  22.  
  23.     // set up render system and register input callbacks
  24.     sf::RenderWindow window(sf::VideoMode(832, 416), "rChip-8", sf::Style::Titlebar | sf::Style::Close);
  25.     //sf::RenderWindow window(sf::VideoMode(1664, 832), "rChip-8", sf::Style::Titlebar | sf::Style::Close);
  26.     //window.setVerticalSyncEnabled(true);
  27.     //window.setFramerateLimit(60);
  28.  
  29.     sf::Clock clock;
  30.     sf::Time elapsedTime = sf::Time::Zero;
  31.     const sf::Time updateFrequency = sf::seconds(1.0f / 60.0f);
  32.    
  33.     // start the game loop
  34.     sf::Event event;
  35.     while(window.isOpen()) {    
  36.         //if(emu.extendedScreenEnabled())
  37.         //    emu.drawFlag = true;
  38.        
  39.         //if(emu.forceExitEnabled())
  40.         //    window.close();
  41.  
  42.         // variant 1
  43.         while(window.pollEvent(event)) {
  44.             switch(event.type) {
  45.                 case sf::Event::Closed:
  46.                     window.close();
  47.                 break;
  48.                 case sf::Event::KeyPressed:
  49.                     if(event.key.code == sf::Keyboard::Escape)
  50.                         window.close();
  51.  
  52.                     updateKeyState(emu, event.key.code, 1);
  53.                 break;
  54.                 case sf::Event::KeyReleased:
  55.                     updateKeyState(emu, event.key.code, 0);
  56.                 break;
  57.             }
  58.         }
  59.  
  60.         elapsedTime += clock.restart();
  61.         while(elapsedTime >= updateFrequency) {
  62.             emu.emulateCycle();
  63.            
  64.  
  65.            
  66.             emu.updateTimers();
  67.        
  68.             elapsedTime -= updateFrequency;
  69.         }
  70.              if(emu.drawFlag) {
  71.                 window.clear();
  72.                 drawDisplay(emu, window);
  73.                 window.display();
  74.  
  75.                 emu.drawFlag = false;
  76.             }      
  77.         // variant 2
  78.         /*while(window.pollEvent(event)) {
  79.             switch(event.type) {
  80.                 case sf::Event::Closed:
  81.                     window.close();
  82.                 break;
  83.                 case sf::Event::KeyPressed:
  84.                     if(event.key.code == sf::Keyboard::Escape)
  85.                         window.close();
  86.  
  87.                     updateKeyState(emu, event.key.code, 1);
  88.                 break;
  89.                 case sf::Event::KeyReleased:
  90.                     updateKeyState(emu, event.key.code, 0);
  91.                 break;
  92.             }
  93.         }        
  94.            
  95.         if(clock.getElapsedTime() > updateFrequency) {
  96.             emu.emulateCycle();
  97.             emu.updateTimers();
  98.             clock.restart();
  99.         }
  100.        
  101.         if(emu.drawFlag) {
  102.             window.clear();
  103.             drawDisplay(emu, window);
  104.             window.display();
  105.  
  106.             emu.drawFlag = false;
  107.         }*/
  108.            
  109.         // variant 3
  110.         /*while(window.pollEvent(event)) {
  111.             switch(event.type) {
  112.                case sf::Event::Closed:
  113.                    window.close();
  114.                break;
  115.                case sf::Event::KeyPressed:
  116.                    if(event.key.code == sf::Keyboard::Escape)
  117.                        window.close();
  118.  
  119.                    updateKeyState(emu, event.key.code, 1);
  120.                break;
  121.                case sf::Event::KeyReleased:
  122.                    updateKeyState(emu, event.key.code, 0);
  123.                break;
  124.            }
  125.         }        
  126.        
  127.         elapsedTime += clock.restart();
  128.         while(elapsedTime >= updateFrequency) {
  129.             emu.emulateCycle();
  130.             emu.updateTimers();
  131.        
  132.             elapsedTime -= updateFrequency;
  133.         }
  134.        
  135.         if(emu.drawFlag) {
  136.             window.clear();
  137.             drawDisplay(emu, window);
  138.             window.display();
  139.  
  140.             emu.drawFlag = false;
  141.         }*/
  142.     };
  143.  
  144.     return 0;
  145. }
  146.  
  147. void drawDisplay(const Chip8 &emu, sf::RenderWindow &window) {
  148.     //define pixel size. since resolution is constant, variables won't be used
  149.     sf::RectangleShape rectangle(sf::Vector2f(13, 13));
  150.     for(int y = 0; y < 32; ++y) {
  151.         for(int x = 0; x < 64; ++x) {
  152.             unsigned char gfx = emu.gfxValueAt(x + (64 * y));
  153.             if(gfx > 0) {
  154.                 rectangle.setPosition((float)(x * 13), (float)(y * 13));
  155.                 window.draw(rectangle);
  156.             }
  157.         }
  158.     }
  159. }
  160.  
  161. void updateKeyState(Chip8 &emu, sf::Keyboard::Key key, unsigned char value) {
  162.     /*emu.mapKey(0x1, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num1));
  163.     emu.mapKey(0x2, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num2));
  164.     emu.mapKey(0x3, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num3));
  165.     emu.mapKey(0xC, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Num4));
  166.  
  167.     emu.mapKey(0x4, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Q));
  168.     emu.mapKey(0x5, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W));
  169.     emu.mapKey(0x6, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::E));
  170.     emu.mapKey(0xD, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::R));
  171.  
  172.     emu.mapKey(0x7, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A));
  173.     emu.mapKey(0x8, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S));
  174.     emu.mapKey(0x9, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D));
  175.     emu.mapKey(0xE, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::F));
  176.  
  177.     emu.mapKey(0xA, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Z));
  178.     emu.mapKey(0x0, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::X));
  179.     emu.mapKey(0xB, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::C));
  180.     emu.mapKey(0xF, sf::Keyboard::isKeyPressed(sf::Keyboard::Key::V));*/
  181.     int index = -1;
  182.  
  183.     switch(key) {
  184.         case sf::Keyboard::Key::Num1: index = 0x1; break;
  185.         case sf::Keyboard::Key::Num2: index = 0x2; break;
  186.         case sf::Keyboard::Key::Num3: index = 0x3; break;
  187.         case sf::Keyboard::Key::Num4: index = 0xC; break;
  188.         case sf::Keyboard::Key::Q: index = 0x4; break;
  189.         case sf::Keyboard::Key::W: index = 0x5; break;
  190.         case sf::Keyboard::Key::E: index = 0x6; break;
  191.         case sf::Keyboard::Key::R: index = 0xD; break;
  192.         case sf::Keyboard::Key::A: index = 0x7; break;
  193.         case sf::Keyboard::Key::S: index = 0x8; break;
  194.         case sf::Keyboard::Key::D: index = 0x9; break;
  195.         case sf::Keyboard::Key::F: index = 0xE; break;
  196.         case sf::Keyboard::Key::Y: index = 0xA; break;
  197.         case sf::Keyboard::Key::X: index = 0x0; break;
  198.         case sf::Keyboard::Key::C: index = 0xB; break;
  199.         case sf::Keyboard::Key::V: index = 0xF; break;
  200.     }
  201.  
  202.     if(index >= 0)
  203.         emu.mapKey(index, value);
  204. }
Add Comment
Please, Sign In to add comment