Advertisement
onilink_

Untitled

Nov 26th, 2020
751
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1.  
  2. void Scorpion::evSendReliable(od::StreamData& s)
  3. {
  4.     // 1-9 bytes message
  5.     _prev_snap = _snap;
  6.    
  7.     const unsigned ChunkWid = 128*16;
  8.     auto x = unsigned(std::max(0.f, std::roundf(pos.x)));
  9.     auto y = unsigned(std::max(0.f, std::roundf(pos.y)));
  10.     NetChunkCell chunk(ChunkCell(x/ChunkWid, y/ChunkWid));
  11.     x %= ChunkWid;
  12.     y %= ChunkWid;
  13.    
  14.     Assert(x < 0xFFFF && y < 0xFFFF);
  15.    
  16.     // Prepare new snapshot
  17.     _snap.chunk  = chunk;
  18.     _snap.fine_x = uint16_t(x);
  19.     _snap.fine_y = uint16_t(y);
  20.     _snap.state  = _state;
  21.     _snap.frame = uint8_t(_frame);
  22.     _snap.reversed  = _scalex < 0.f;
  23.     _snap.berserk = (_fall_state.berserk_timer > 0.f);
  24.    
  25.     // Delta
  26.     od::bitfield<8> flags;
  27.     flags[0] = _snap.chunk.x != _prev_snap.chunk.x;
  28.     flags[1] = _snap.chunk.y != _prev_snap.chunk.y;
  29.     flags[2] = _snap.fine_x != _prev_snap.fine_x;
  30.     flags[3] = _snap.fine_y != _prev_snap.fine_y;
  31.     flags[4] = _snap.state != _prev_snap.state;
  32.     flags[5] = _snap.frame != _prev_snap.frame;
  33.     flags[6] = _snap.reversed;
  34.     flags[7] = _snap.berserk;
  35.    
  36.     s << uint8_t(flags.to_ulong());
  37.     if(flags[0]) { s << _snap.chunk.x; }
  38.     if(flags[1]) { s << _snap.chunk.y; }
  39.     if(flags[2]) { s << _prev_snap.fine_x; }
  40.     if(flags[3]) { s << _prev_snap.fine_y; }
  41.     if(flags[4]) { s << _snap.state; }
  42.     if(flags[5]) { s << _snap.frame; }
  43. }
  44.  
  45. /// @todo stream reader ...
  46. void Scorpion::evReceiveReliable(od::StreamData& s)
  47. {
  48.     _prev_snap = _snap;
  49.    
  50.     uint8_t flags_bits;
  51.     s >> flags_bits;
  52.     od::bitfield<8> flags(flags_bits);
  53.    
  54.     if(flags[0]) { s >> _snap.chunk.x; }
  55.     if(flags[1]) { s >> _snap.chunk.y; }
  56.     if(flags[2]) { s >> _snap.fine_x; }
  57.     if(flags[3]) { s >> _snap.fine_y; }
  58.     if(flags[4]) { s >> _snap.state; }
  59.     if(flags[5]) { s >> _snap.frame; }
  60.     _snap.reversed = flags[6];
  61.     if(flags[7]) {
  62.         _fall_state.berserk_timer = 1.f;
  63.     } else {
  64.         _fall_state.berserk_timer = 0.f;
  65.     }
  66.    
  67.     _snap_frame = 0;
  68. }
  69.  
  70. void Scorpion::clientStep(float dt)
  71. {
  72.     // Compute the interpolation 't' value
  73.     // 20Hz from 60Hz => 1 frame out of 3
  74.     // _snap_frame: [0-3]
  75.     const float t = std::min(1.f, _snap_frame / 4.f);
  76.    
  77.     const unsigned ChunkWid = 128*16;
  78.     Vec2 prev_pos;
  79.     prev_pos.x = _prev_snap.chunk.x*ChunkWid + _prev_snap.fine_x;
  80.     prev_pos.y = _prev_snap.chunk.y*ChunkWid + _prev_snap.fine_y;
  81.    
  82.     Vec2 last_pos;
  83.     last_pos.x = _snap.chunk.x*ChunkWid + _snap.fine_x;
  84.     last_pos.y = _snap.chunk.y*ChunkWid + _snap.fine_y;
  85.    
  86.     pos = Vec2::lerp(prev_pos, last_pos, t);
  87.    
  88.     //pos = Vec2::lerp(_prev_snap.pos, _snap.pos, t);
  89.    
  90.     const Snapshot& snap = _snap;
  91.    
  92.     _state  = State(snap.state);
  93.     _scalex = snap.reversed? -1.f: 1.f;
  94.     _frame  = snap.frame;
  95.    
  96.     ++_snap_frame;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement