A pixel art painter geared specifically at NES pixel art. Includes export for .chr binary file as well as palette and namespace data.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

120 行
2.9KB

  1. import Utils from "/app/js/common/Utils.js";
  2. import NESTile from "/app/js/models/NESTile.js";
  3. import NESPalette from "/app/js/models/NESPalette.js";
  4. export default class NESBank {
  5. constructor(){
  6. this.__LP = []; // Left Patterns (Sprites)
  7. this.__RP = []; // Right Patterns (Backgrounds)
  8. for (var i=0; i < 256; i++){
  9. this.__LP.push(new NESTile());
  10. this.__RP.push(new NESTile());
  11. }
  12. this.__palette = null;
  13. }
  14. get json(){
  15. JSON.stringify({
  16. LP: this.__LP.map(x=>x.base64),
  17. RP: this.__RP.map(x=>x.base64)
  18. });
  19. }
  20. get chr(){
  21. var buff = new Uint8Array(8192);
  22. var offset = 0;
  23. this.__LP.forEach(function(i){
  24. buff.set(i.chr, offset);
  25. offset += 16;
  26. });
  27. this.__RP.forEach(function(i){
  28. buff.set(i.chr, offset);
  29. offset += 16;
  30. });
  31. return buff;
  32. }
  33. get palette(){return this.__palette;}
  34. set palette(p){
  35. if (p !== null && !(p instanceof NESPalette))
  36. throw new TypeError("Expected null or NESPalette object.");
  37. if (p !== this.__palette){
  38. this.__palette = p;
  39. }
  40. }
  41. get lp(){
  42. return new Proxy(this, {
  43. get: function(obj, prop){
  44. if (prop === "length")
  45. return obj.__LP.length;
  46. if (!Utils.isInt(prop))
  47. throw new TypeError("Expected integer index.");
  48. prop = parseInt(prop);
  49. if (prop < 0 || prop >= 256)
  50. throw new RangeError("Index out of bounds.");
  51. return this.__LP[prop];
  52. },
  53. set: function(obj, prop, value){
  54. if (!Utils.isInt(prop))
  55. throw new TypeError("Expected integer index.");
  56. if (!(value instanceof NESTile))
  57. throw new TypeError("Can only assign NESTile objects.");
  58. prop = parseInt(prop);
  59. if (prop < 0 || prop >= 256)
  60. throw new RangeError("Index out of bounds.");
  61. this.__LP[prop].copy(value);
  62. }
  63. });
  64. }
  65. get rp(){
  66. return new Proxy(this, {
  67. get: function(obj, prop){
  68. if (prop === "length")
  69. return obj.__RP.length;
  70. if (!Utils.isInt(prop))
  71. throw new TypeError("Expected integer index.");
  72. prop = parseInt(prop);
  73. if (prop < 0 || prop >= 256)
  74. throw new RangeError("Index out of bounds.");
  75. return this.__RP[prop];
  76. },
  77. set: function(obj, prop, value){
  78. if (!Utils.isInt(prop))
  79. throw new TypeError("Expected integer index.");
  80. if (!(value instanceof NESTile))
  81. throw new TypeError("Can only assign NESTile objects.");
  82. prop = parseInt(prop);
  83. if (prop < 0 || prop >= 256)
  84. throw new RangeError("Index out of bounds.");
  85. this.__RP[prop].copy(value);
  86. }
  87. });
  88. }
  89. copy(b){
  90. if (!(b instanceof NESBank))
  91. throw new TypeError("Expected NESBank object.");
  92. for (var i=0; i < 256; i++){
  93. this.lp[i] = b.lp[i];
  94. this.rp[i] = b.rp[i];
  95. }
  96. return this;
  97. }
  98. clone(){
  99. return (new NESBank()).copy(this);
  100. }
  101. }