func CreateResourceManager(config *ResourceManagerConfig) *ResourceManager { /* defaultTileConfig := TileConfig{Name: DEFAULT_TILE_NAME, Filename: DEFAULT_TILE_NAME} config.TileConfigs = append(config.TileConfigs, defaultTileConfig) tileConfs := make([]TileConfig, 0) for _, v := range config.TileConfigs { tileConfs = append(tileConfs, v) } var manager ResourceManager nBmps := len(tileConfs) log.Printf("Loading %v bitmaps", nBmps) loadedBmps := make([]*allegro.Bitmap, nBmps) manager.tileMetadatas = make([]tileMetadata, nBmps) var wg sync.WaitGroup wg.Add(nBmps) for j := 0; j < nBmps; j++ { go func (i int) { cfg := tileConfs[i] // Load the bitmap var bmp *allegro.Bitmap if cfg.Name == DEFAULT_TILE_NAME { bmp = allegro.NewBitmap(DEFAULT_TILE_WIDTH, DEFAULT_TILE_HEIGHT) } else { bmp = allegro.LoadBitmap(cfg.Filename) } if bmp == nil { log.Fatalf("Failed to load bmp %v", cfg) } loadedBmps[i] = bmp manager.tileMetadatas[i] = generateMetadata(bmp, cfg) wg.Done() } (j) } wg.Wait() log.Printf("Loaded bitmaps") manager.tileBmps = make([]*Bitmap, nBmps) for i, bmp := range loadedBmps { metadata := manager.tileMetadatas[i] fBmp := &Bitmap{gl.Texture(bmp.GetGLTexture()), bmp, metadata.offx, metadata.offy, metadata.w, metadata.h} manager.tileBmps[i] = fBmp } manager.tilePos = make(map[string]int, nBmps) for i, metadata := range manager.tileMetadatas { manager.tilePos[metadata.name] = i }*/ var manager ResourceManager manager.tileMetadatas = make(map[string]tileMetadata) manager.tileBmps = make(map[string]Bitmap) // Load the fonts manager.fontMap = make(map[string]*allegro.Font) for _, v := range config.FontConfigs { var font *allegro.Font if v.Filename == "builtin" { font = allegro.CreateBuiltinFont() } else { font = allegro.LoadFont(v.Filename, v.Size, 0) } manager.fontMap[v.Name] = font } return &manager }
func (d *DisplayEngine) drawFrame() { toDraw := make([][]*resources.Bitmap, d.config.MapW*d.config.MapH) drawPasses := 0 for x := 0; x < d.config.MapW; x++ { for y := 0; y < d.config.MapH; y++ { toDraw[x*d.config.MapW+y] = (*d.gameEngine).GetTile(x, y) length := len(toDraw[x*d.config.MapW+y]) if length > drawPasses { drawPasses = length } } } viewport := d.viewport font := allegro.CreateBuiltinFont() // Don't want anyone changing the viewport mid frame or any such highjinks d.Display.SetTargetBackbuffer() allegro.RunInThread(func() { r, g, b, a := d.config.BGColor.GetRGBA() gl.ClearColor( gl.GLclampf(r)/255.0, gl.GLclampf(g)/255.0, gl.GLclampf(b)/255.0, gl.GLclampf(a)/255.0) gl.Clear(gl.COLOR_BUFFER_BIT) viewport.SetupTransform() for p := 0; p < drawPasses; p++ { m := d.config.MapW n := d.config.MapH for s := 0; s < m+n; s++ { for x := 0; x < s; x++ { y := s - x - 1 if x >= m || y < 0 || y >= n { continue } if len(toDraw[x*d.config.MapW+y]) < p { continue } // Coordinates in terms of pixels px := (y - x) * d.config.TileW / 2 py := (x + y) * d.config.TileH / 2 bmp := toDraw[x*d.config.MapW+y][p] /* ox := bmp.OffX oy := bmp.OffY*/ bw, bh := bmp.W, bmp.H if viewport.OnScreen(px, py, bw, bh) { gl.Begin(gl.QUADS) bmp.Tex.Bind(gl.TEXTURE_2D) gl.TexCoord2f(0, 0) gl.Vertex3i(px, py, 0) gl.TexCoord2f(0, 1) gl.Vertex3i(px, py+bw, 0) gl.TexCoord2f(1, 1) gl.Vertex3i(px+bh, py+bw, 0) gl.TexCoord2f(1, 0) gl.Vertex3i(px+bh, py, 0) gl.End() } } } } gl.Flush() }) var trans allegro.Transform trans.Identity() trans.Use() font.Draw(allegro.CreateColor(0, 255, 0, 255), 0, 0, 0, fmt.Sprint(int(d.fps))) allegro.Flip() d.frameDrawing.Unlock() }