From f361bb05dd54daa4dec3013916589951e3f9bb7a Mon Sep 17 00:00:00 2001 From: Cesar Gimenes Date: Sat, 9 Feb 2019 22:39:11 -0200 Subject: [PATCH] examples: Add doom fire algorithm example (#808) --- examples/doomfire/main.go | 139 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 examples/doomfire/main.go diff --git a/examples/doomfire/main.go b/examples/doomfire/main.go new file mode 100644 index 000000000..7756b62c7 --- /dev/null +++ b/examples/doomfire/main.go @@ -0,0 +1,139 @@ +// Copyright 2019 The Ebiten Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build example jsgo + +package main + +import ( + "image/color" + "log" + "math/rand" + "time" + + "github.com/hajimehoshi/ebiten" +) + +const ( + screenWidth = 100 + screenHeight = 50 + screenSize = screenWidth * screenHeight +) + +var ( + pixels = make([]byte, screenSize*4) + firePixels = make([]byte, screenSize) + firePalette = []color.RGBA{ + {R: 7, G: 7, B: 7, A: 255}, // 0 + {R: 31, G: 7, B: 7, A: 255}, // 1 + {R: 47, G: 15, B: 7, A: 255}, // 2 + {R: 71, G: 15, B: 7, A: 255}, // 3 + {R: 87, G: 23, B: 7, A: 255}, // 4 + {R: 103, G: 31, B: 7, A: 255}, // 5 + {R: 119, G: 31, B: 7, A: 255}, // 6 + {R: 143, G: 39, B: 7, A: 255}, // 7 + {R: 159, G: 47, B: 7, A: 255}, // 8 + {R: 175, G: 63, B: 7, A: 255}, // 9 + {R: 191, G: 71, B: 7, A: 255}, // 10 + {R: 199, G: 71, B: 7, A: 255}, // 11 + {R: 223, G: 79, B: 7, A: 255}, // 12 + {R: 223, G: 87, B: 7, A: 255}, // 13 + {R: 223, G: 87, B: 7, A: 255}, // 14 + {R: 215, G: 95, B: 7, A: 255}, // 15 + {R: 215, G: 95, B: 7, A: 255}, // 16 + {R: 215, G: 103, B: 15, A: 255}, // 17 + {R: 207, G: 111, B: 15, A: 255}, // 18 + {R: 207, G: 119, B: 15, A: 255}, // 19 + {R: 207, G: 127, B: 15, A: 255}, // 20 + {R: 207, G: 135, B: 23, A: 255}, // 21 + {R: 199, G: 135, B: 23, A: 255}, // 22 + {R: 199, G: 143, B: 23, A: 255}, // 23 + {R: 199, G: 151, B: 31, A: 255}, // 24 + {R: 191, G: 159, B: 31, A: 255}, // 25 + {R: 191, G: 159, B: 31, A: 255}, // 26 + {R: 191, G: 167, B: 39, A: 255}, // 27 + {R: 191, G: 167, B: 39, A: 255}, // 28 + {R: 191, G: 175, B: 47, A: 255}, // 29 + {R: 183, G: 175, B: 47, A: 255}, // 30 + {R: 183, G: 183, B: 47, A: 255}, // 31 + {R: 183, G: 183, B: 55, A: 255}, // 32 + {R: 207, G: 207, B: 111, A: 255}, // 33 + {R: 223, G: 223, B: 159, A: 255}, // 34 + {R: 239, G: 239, B: 199, A: 255}, // 35 + {R: 255, G: 255, B: 255, A: 255}, // 36 + } +) + +func init() { + for i := screenSize - screenWidth; i < screenSize; i++ { + firePixels[i] = 36 + } +} + +func updateFirePixels() { + for i := 0; i < screenWidth; i++ { + for j := 0; j < screenHeight; j++ { + idx := i + (screenWidth * j) + updateFireIntensityPerPixel(idx) + } + } +} + +func updateFireIntensityPerPixel(currentPixelIndex int) { + below := currentPixelIndex + screenWidth + if below >= screenSize { + return + } + + d := rand.Intn(3) + newI := int(firePixels[below]) - d + if newI < 0 { + newI = 0 + } + + if currentPixelIndex-d < 0 { + return + } + firePixels[currentPixelIndex-d] = byte(newI) +} + +func renderFire() { + for i, v := range firePixels { + p := firePalette[v] + pixels[i*4] = p.R + pixels[i*4+1] = p.G + pixels[i*4+2] = p.B + pixels[i*4+3] = p.A + } +} + +func update(screen *ebiten.Image) error { + updateFirePixels() + renderFire() + + if ebiten.IsDrawingSkipped() { + return nil + } + + screen.ReplacePixels(pixels) + return nil +} + +func main() { + rand.Seed(time.Now().UnixNano()) + + if err := ebiten.Run(update, screenWidth, screenHeight, 6, "Doom Fire (Ebiten Demo)"); err != nil { + log.Fatal(err) + } +}