1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Copyright 2021 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.
- package main
- import (
- "fmt"
- "math/rand/v2"
- )
- // Level represents a Game level.
- type Level struct {
- w, h int
- tiles [][]*Tile // (Y,X) array of tiles
- tileSize int
- }
- // Tile returns the tile at the provided coordinates, or nil.
- func (l *Level) Tile(x, y int) *Tile {
- if x >= 0 && y >= 0 && x < l.w && y < l.h {
- return l.tiles[y][x]
- }
- return nil
- }
- // Size returns the size of the Level.
- func (l *Level) Size() (width, height int) {
- return l.w, l.h
- }
- // NewLevel returns a new randomly generated Level.
- func NewLevel() (*Level, error) {
- // Create a 108x108 Level.
- l := &Level{
- w: 108,
- h: 108,
- tileSize: 64,
- }
- // Load embedded SpriteSheet.
- ss, err := LoadSpriteSheet(l.tileSize)
- if err != nil {
- return nil, fmt.Errorf("failed to load embedded spritesheet: %s", err)
- }
- // Fill each tile with one or more sprites randomly.
- l.tiles = make([][]*Tile, l.h)
- for y := 0; y < l.h; y++ {
- l.tiles[y] = make([]*Tile, l.w)
- for x := 0; x < l.w; x++ {
- t := &Tile{}
- isBorderSpace := x == 0 || y == 0 || x == l.w-1 || y == l.h-1
- val := rand.IntN(1000)
- switch {
- case isBorderSpace || val < 275:
- t.AddSprite(ss.Wall)
- case val < 285:
- t.AddSprite(ss.Statue)
- case val < 288:
- t.AddSprite(ss.Crown)
- case val < 289:
- t.AddSprite(ss.Floor)
- t.AddSprite(ss.Tube)
- case val < 290:
- t.AddSprite(ss.Portal)
- default:
- t.AddSprite(ss.Floor)
- }
- l.tiles[y][x] = t
- }
- }
- return l, nil
- }
|