Robię łamigłówkę 2D (siatka / plansza) Sokoban, jeśli ktoś o tym słyszał, poniżej jest kod. Szukam sposobu na wyświetlenie planszy (tablicy obrazów).
func makeLevel() {
var cellImageView: [[UIImageView]] = []
var floorImageView: [[UIImageView]] = []
let cellWidth = 35
let cellHeight = 35
let x0 = 190 - 4 * cellWidth
let y0 = 300 - 4 * cellHeight
let imageForCellMarker: [Character: UIImage] = [
".": UIImage(named: "poopgoal30x30")!,
"#": UIImage(named: "wall30x30")!,
"$": UIImage(named: "box30x30")!,
"@": UIImage(named: "cat30x30")!,
"£": UIImage(named: "box30x30")!,
"&": UIImage(named: "cat30x30")!,
]
//Floor
for y in 0..<rows {
floorImageView.append([])
for x in 0..<cols {
let image = UIImage(named: "floor30x30")!
let frame = CGRect(x: x0 + x * cellWidth, y: y0 + y * cellHeight, width: cellWidth, height: cellHeight)
let imageView = UIImageView(frame: frame)
imageView.image = image
floorImageView[y].append(imageView)
view.addSubview(imageView)
}
}
//Level
for y in 0 ..< rows {
cellImageView.append([])
for x in 0 ..< cols {
let image = imageForCellMarker[gameBoard[y][x]]
let frame = CGRect(x: x0 + x * cellWidth, y: y0 + y * cellHeight, width: cellWidth, height: cellHeight)
let imageView = UIImageView(frame: frame)
imageView.image = image
cellImageView[y].append(imageView)
view.addSubview(imageView)
}
}
}
Ponieważ plansza będzie w różnych rzędacha kolumny zależą od poziomu, więc naprawdę nie mogę ustawić go na stałe w widoku. Czy jest więc jakiś z was, szybkich ekspertów, który pokaże mi, jak mogę automatycznie rozmieścić siatkę, aby pasowała do wszystkich urządzeń?
Odpowiedzi:
0 dla odpowiedzi № 1Radziłbym używać automatycznego układu i ograniczeń zamiast wartości bezwzględnych ... co pozwoliłoby uniknąć konieczności ręcznego obliczania rozmiarów i pozycji.
Aby zdobyć obecny aby wyśrodkować „obszar gry”, możesz zmienić te dwie linie:
let x0 = 190 - 4 * cellWidth
let y0 = 300 - 4 * cellHeight
do (zakładam, że 4
powyżej to liczba wierszy i kolumn):
let x0 = Int(view.frame.size.width) / 2 - cols * cellWidth / 2
let y0 = Int(view.frame.size.height) / 2 - rows * cellHeight / 2
Więc...
cols * cellWidth // equals the full width of the game area
rows * cellHeight // equals the full height of the game area
cols * cellWidth / 2 // equals one-half the width of the game area
rows * cellHeight / 2 // equals one-half the height of the game area
Int(view.frame.size.width) / 2 // equals the horizontal center of the view
Int(view.frame.size.height) / 2 // equals the vertical center of the view
aby wyśrodkować obszar gry w widoku, ustaw początkowy X na środek X - połowę szerokości obszaru gry, a początkowy Y ustaw na środku Y - połowę wysokości pola gry .
Spowoduje to wyśrodkowanie obszaru gry, niezależnie od urządzenia. Jednak w przypadku większych urządzeń będzie to mały obszar pośrodku całkowitego widoku ... więc musisz obliczyć cellWidth
i cellHeight
wartości oparte na rozmiarze ekranu / widoku.