1 /* 2 Copyright (C) 2015, by Laszlo Szeremi under the Boost license. 3 4 VDP Engine 5 */ 6 7 8 module app; 9 10 import std.stdio; 11 import std..string; 12 import std.conv; 13 import std.random; 14 15 import bindbc.sdl; 16 //import derelict.freeimage.freeimage; 17 18 //import system.config; 19 20 import PixelPerfectEngine.graphics.outputScreen; 21 import PixelPerfectEngine.graphics.raster; 22 import PixelPerfectEngine.graphics.layers; 23 24 import PixelPerfectEngine.graphics.bitmap; 25 //import PixelPerfectEngine.collision; 26 import PixelPerfectEngine.system.inputHandler; 27 import PixelPerfectEngine.system.file; 28 import PixelPerfectEngine.system.etc; 29 import PixelPerfectEngine.system.config; 30 import PixelPerfectEngine.system.binarySearchTree; 31 import PixelPerfectEngine.system.common; 32 33 public import editor; 34 import PixelPerfectEngine.extbmp.extbmp; 35 36 public Editor prg; 37 38 int main(string[] args){ 39 initialzeSDL(); 40 41 if(args.length > 1){ 42 if(args[1] == "--test"){ 43 TileLayerTest prg = new TileLayerTest(); 44 prg.whereTheMagicHappens; 45 //writeln(prg.isRunning); 46 return 0; 47 } 48 } 49 50 prg = new Editor(args); 51 prg.whereTheMagicHappens; 52 53 //testBinarySearchTrees(11, 1); 54 return 0; 55 } 56 57 void testBinarySearchTrees(int nOfElements, int nOfTimes){ 58 for(int i; i < nOfTimes; i++){ 59 writeln("start test no.",i); 60 BinarySearchTree!(int,int) sequ, rand; 61 //sequential element test 62 for(int j; j < nOfElements; j++){ 63 sequ[j] = j; 64 } 65 writeln(sequ); 66 //randomized element test 67 for(int j; j < nOfElements; j++){ 68 int k = uniform(short.min,short.max); 69 rand[k] = k; 70 } 71 writeln(rand); 72 //rand.optimize(); 73 //writeln(rand); 74 } 75 readln(); 76 } 77 78 class TileLayerTest : SystemEventListener, InputListener{ 79 bool isRunning, up, down, left, right, scrup, scrdown, scrleft, scrright; 80 OutputScreen output; 81 Raster r; 82 TileLayer t; 83 TransformableTileLayer!(Bitmap8Bit,16,16) tt; 84 Bitmap8Bit[] tiles; 85 Bitmap8Bit dlangMan; 86 SpriteLayer s; 87 //Bitmap16Bit[wchar] tiles; 88 InputHandler ih; 89 float theta; 90 //CollisionDetector c; 91 this(){ 92 theta = 0; 93 isRunning = true; 94 Image tileSource = loadImage(File("../assets/sci-fi-tileset.png")); 95 Image spriteSource = loadImage(File("../assets/d-man.tga")); 96 t = new TileLayer(16,16, LayerRenderingMode.COPY); 97 tt = new TransformableTileLayer!(Bitmap8Bit,16,16)(LayerRenderingMode.COPY); 98 s = new SpriteLayer(LayerRenderingMode.ALPHA_BLENDING); 99 //c = new CollisionDetector(); 100 dlangMan = loadBitmapFromImage!Bitmap8Bit(spriteSource); 101 //CollisionModel cm = new CollisionModel(dlangMan.width, dlangMan.height, dlangMan.generateStandardCollisionModel()); 102 dlangMan.offsetIndexes(256,false); 103 s.addSprite(dlangMan, 0, 0, 0, 1); 104 //s.scaleSpriteHoriz(0,-1024); 105 //s.scaleSpriteVert(0,-1024); 106 for(int i = 1 ; i < 10 ; i++){ 107 s.addSprite(dlangMan, i, uniform(-31,320), uniform(-31,240), 1); 108 } 109 //s.collisionDetector[1] = c; 110 //c.source = s; 111 //c.addCollisionModel(cm,0); 112 //c.addCollisionModel(cm,1); 113 //c.addCollisionListener(this); 114 //tiles.length = tileSource.bitmapID.length; 115 tiles = loadBitmapSheetFromImage!Bitmap8Bit(tileSource, 16, 16);//loadBitmapSheetFromFile!Bitmap8Bit("../assets/sci-fi-tileset.png",16,16); 116 for(int i; i < tiles.length; i++){ 117 //string hex = tileSource.bitmapID[i]; 118 //writeln(hex[hex.length-4..hex.length]); 119 //ABitmap ab = loadBitmapFromXMP!Bitmap16Bit(tileSource, hex); 120 //tiles[i] = ab; 121 t.addTile(tiles[i], cast(wchar)i); 122 } 123 //wchar[] mapping; 124 MappingElement[] mapping; 125 mapping.length = 64*64; 126 //attrMapping.length = 256*256; 127 for(int i; i < mapping.length; i++){ 128 //mapping[i] = to!wchar(uniform(0x0000,0x00AA)); 129 const int rnd = uniform(0,1024); 130 //attrMapping[i] = BitmapAttrib(rnd & 1 ? true : false, rnd & 2 ? true : false); 131 mapping[i] = MappingElement(cast(wchar)(rnd & 63), BitmapAttrib(rnd & 1024 ? true : false, rnd & 512 ? true : false)); 132 } 133 ih = new InputHandler(); 134 ih.sel ~= this; 135 ih.il ~= this; 136 ih.kb ~= KeyBinding(0, SDL_SCANCODE_UP,0, "up", Devicetype.KEYBOARD, KeyModifier.ANY); 137 ih.kb ~= KeyBinding(0, SDL_SCANCODE_DOWN,0, "down", Devicetype.KEYBOARD, KeyModifier.ANY); 138 ih.kb ~= KeyBinding(0, SDL_SCANCODE_LEFT,0, "left", Devicetype.KEYBOARD, KeyModifier.ANY); 139 ih.kb ~= KeyBinding(0, SDL_SCANCODE_RIGHT,0, "right", Devicetype.KEYBOARD, KeyModifier.ANY); 140 ih.kb ~= KeyBinding(0, ScanCode.np8,0, "scrup", Devicetype.KEYBOARD, KeyModifier.ANY); 141 ih.kb ~= KeyBinding(0, ScanCode.np2,0, "scrdown", Devicetype.KEYBOARD, KeyModifier.ANY); 142 ih.kb ~= KeyBinding(0, ScanCode.np4,0, "scrleft", Devicetype.KEYBOARD, KeyModifier.ANY); 143 ih.kb ~= KeyBinding(0, ScanCode.np6,0, "scrright", Devicetype.KEYBOARD, KeyModifier.ANY); 144 ih.kb ~= KeyBinding(0, ScanCode.F1,0, "A+", Devicetype.KEYBOARD, KeyModifier.ANY); 145 ih.kb ~= KeyBinding(0, ScanCode.F2,0, "A-", Devicetype.KEYBOARD, KeyModifier.ANY); 146 ih.kb ~= KeyBinding(0, ScanCode.F3,0, "B+", Devicetype.KEYBOARD, KeyModifier.ANY); 147 ih.kb ~= KeyBinding(0, ScanCode.F4,0, "B-", Devicetype.KEYBOARD, KeyModifier.ANY); 148 ih.kb ~= KeyBinding(0, ScanCode.F5,0, "C+", Devicetype.KEYBOARD, KeyModifier.ANY); 149 ih.kb ~= KeyBinding(0, ScanCode.F6,0, "C-", Devicetype.KEYBOARD, KeyModifier.ANY); 150 ih.kb ~= KeyBinding(0, ScanCode.F7,0, "D+", Devicetype.KEYBOARD, KeyModifier.ANY); 151 ih.kb ~= KeyBinding(0, ScanCode.F8,0, "D-", Devicetype.KEYBOARD, KeyModifier.ANY); 152 ih.kb ~= KeyBinding(0, ScanCode.F9,0, "x0+", Devicetype.KEYBOARD, KeyModifier.ANY); 153 ih.kb ~= KeyBinding(0, ScanCode.F10,0, "x0-", Devicetype.KEYBOARD, KeyModifier.ANY); 154 ih.kb ~= KeyBinding(0, ScanCode.PAGEUP,0, "y0+", Devicetype.KEYBOARD, KeyModifier.ANY); 155 ih.kb ~= KeyBinding(0, ScanCode.PAGEDOWN,0, "y0-", Devicetype.KEYBOARD, KeyModifier.ANY); 156 ih.kb ~= KeyBinding(0, ScanCode.NP_PLUS,0, "theta+", Devicetype.KEYBOARD, KeyModifier.ANY); 157 ih.kb ~= KeyBinding(0, ScanCode.NP_MINUS,0, "theta-", Devicetype.KEYBOARD, KeyModifier.ANY); 158 ih.kb ~= KeyBinding(0, ScanCode.n1,0, "sV+", Devicetype.KEYBOARD, KeyModifier.ANY); 159 ih.kb ~= KeyBinding(0, ScanCode.n2,0, "sV-", Devicetype.KEYBOARD, KeyModifier.ANY); 160 ih.kb ~= KeyBinding(0, ScanCode.n3,0, "sH+", Devicetype.KEYBOARD, KeyModifier.ANY); 161 ih.kb ~= KeyBinding(0, ScanCode.n4,0, "sH-", Devicetype.KEYBOARD, KeyModifier.ANY); 162 ih.kb ~= KeyBinding(0, ScanCode.Q,0, "HM", Devicetype.KEYBOARD, KeyModifier.ANY); 163 ih.kb ~= KeyBinding(0, ScanCode.W,0, "VM", Devicetype.KEYBOARD, KeyModifier.ANY); 164 165 t.loadMapping(64,64,mapping); 166 t.setWarpMode(false); 167 168 //t.setWrapMode(true); 169 //tt.D = -256; 170 output = new OutputScreen("TileLayer test", 1280,960); 171 r = new Raster(320,240,output); 172 output.setMainRaster(r); 173 //loadPaletteFromXMP(tileSource, "default", r); 174 175 /*for(int y ; y < 240 ; y++){ 176 for(int x ; x < 240 ; x++){ 177 writeln('[',x,',',y,"] : ", t.transformFunc([x,y])); 178 } 179 }*/ 180 r.addLayer(t, 0); 181 r.addLayer(s, 1); 182 Color[] localPal = loadPaletteFromImage(tileSource); 183 localPal.length = 256; 184 r.palette ~= localPal; 185 localPal = loadPaletteFromImage(spriteSource); 186 localPal.length = 256; 187 r.palette ~= localPal; 188 //r.palette[0].alpha = 255; 189 r.palette[256].raw = 0; 190 //writeln(tt); 191 //r.palette[0] = 255; 192 //r.addRefreshListener(output, 0); 193 194 } 195 private @nogc void ttlHBlankInterrupt(ref short[4] localABCD, ref short[2] localsXsY, ref short[2] localx0y0, short y){ 196 localABCD[0]++; 197 } 198 public void whereTheMagicHappens(){ 199 while(isRunning){ 200 r.refresh(); 201 ih.test(); 202 if(up) s.relMoveSprite(0,0,-1); 203 if(down) s.relMoveSprite(0,0,1); 204 if(left) s.relMoveSprite(0,-1,0); 205 if(right) s.relMoveSprite(0,1,0); 206 if(scrup) t.relScroll(0,-1); 207 if(scrdown) t.relScroll(0,1); 208 if(scrleft) t.relScroll(-1,0); 209 if(scrright) t.relScroll(1,0); 210 //t.relScroll(1,0); 211 } 212 } 213 override public void onQuit() { 214 isRunning = false; 215 } 216 override public void controllerAdded(uint ID) { 217 218 } 219 override public void controllerRemoved(uint ID) { 220 221 } 222 override public void keyPressed(string ID,uint timestamp,uint devicenumber,uint devicetype) { 223 //writeln(ID); 224 import PixelPerfectEngine.graphics.transformFunctions; 225 switch(ID){ 226 case "up": up = true; break; 227 case "down": down = true; break; 228 case "left": left = true; break; 229 case "right": right = true; break; 230 case "scrup": scrup = true; break; 231 case "scrdown": scrdown = true; break; 232 case "scrleft": scrleft = true; break; 233 case "scrright": scrright = true; break; 234 case "A+": tt.A = cast(short)(tt.A + 16); 235 break; 236 case "A-": tt.A = cast(short)(tt.A - 16); 237 break; 238 case "B+": tt.B = cast(short)(tt.B + 16); break; 239 case "B-": tt.B = cast(short)(tt.B - 16); break; 240 case "C+": tt.C = cast(short)(tt.C + 16); break; 241 case "C-": tt.C = cast(short)(tt.C - 16); break; 242 case "D+": tt.D = cast(short)(tt.D + 16); break; 243 case "D-": tt.D = cast(short)(tt.D - 16); break; 244 case "x0+": tt.x_0 = cast(short)(tt.x_0 + 1); break; 245 case "x0-": tt.x_0 = cast(short)(tt.x_0 - 1); break; 246 case "y0+": tt.y_0 = cast(short)(tt.y_0 + 1); break; 247 case "y0-": tt.y_0 = cast(short)(tt.y_0 - 1); break; 248 case "sH-": 249 if(s.readSpriteAttribute!("scaleHoriz", int)(0) == 16){ 250 s.scaleSpriteHoriz(0,-16); 251 return; 252 } 253 s.scaleSpriteHoriz(0,s.readSpriteAttribute!("scaleHoriz", int)(0) - 16); 254 writeln(s.readSpriteAttribute!("scaleHoriz", int)(0)); 255 break; 256 case "sH+": 257 if(s.readSpriteAttribute!("scaleHoriz", int)(0) == -16){ 258 s.scaleSpriteHoriz(0,16); 259 return; 260 } 261 s.scaleSpriteHoriz(0,s.readSpriteAttribute!("scaleHoriz", int)(0) + 16); 262 writeln(s.readSpriteAttribute!("scaleHoriz", int)(0)); 263 break; 264 case "sV-": 265 if(s.readSpriteAttribute!("scaleVert", int)(0) == 16){ 266 s.scaleSpriteVert(0,-16); 267 return; 268 } 269 s.scaleSpriteVert(0,s.readSpriteAttribute!("scaleVert", int)(0) - 16); 270 break; 271 case "sV+": 272 if(s.readSpriteAttribute!("scaleVert", int)(0) == -16){ 273 s.scaleSpriteVert(0,16); 274 return; 275 } 276 s.scaleSpriteVert(0,s.readSpriteAttribute!("scaleVert", int)(0) + 16); 277 break; 278 case "HM": 279 s.scaleSpriteHoriz(0,s.readSpriteAttribute!("scaleHoriz", int)(0) * -1); 280 break; 281 case "VM": 282 s.scaleSpriteVert(0,s.readSpriteAttribute!("scaleVert", int)(0) * -1); 283 break; 284 case "theta+": 285 theta += 1; 286 short[4] newTP = rotateFunction(theta); 287 tt.A = newTP[0]; 288 tt.B = newTP[1]; 289 tt.C = newTP[2]; 290 tt.D = newTP[3]; 291 break; 292 case "theta-": 293 theta -= 1; 294 short[4] newTP = rotateFunction(theta); 295 tt.A = newTP[0]; 296 tt.B = newTP[1]; 297 tt.C = newTP[2]; 298 tt.D = newTP[3]; 299 break; 300 default: break; 301 } 302 } 303 override public void keyReleased(string ID,uint timestamp,uint devicenumber,uint devicetype) { 304 switch(ID){ 305 case "up": up = false; break; 306 case "down": down = false; break; 307 case "left": left = false; break; 308 case "right": right = false; break; 309 case "scrup": scrup = false; break; 310 case "scrdown": scrdown = false; break; 311 case "scrleft": scrleft = false; break; 312 case "scrright": scrright = false; break; 313 default: break; 314 } 315 } 316 /*public void spriteCollision(CollisionEvent ce){ 317 writeln("COLLISION!!!!11!1111!!!ONEONEONE!!!"); 318 } 319 320 public void backgroundCollision(CollisionEvent ce){}*/ 321 }