mirror of https://github.com/buggins/dlangui.git
tetris example development
This commit is contained in:
parent
8a448ef8fc
commit
26a90eeb42
|
@ -19,9 +19,11 @@ import dlangui.all;
|
||||||
import dlangui.dialogs.dialog;
|
import dlangui.dialogs.dialog;
|
||||||
import dlangui.dialogs.filedlg;
|
import dlangui.dialogs.filedlg;
|
||||||
import dlangui.dialogs.msgbox;
|
import dlangui.dialogs.msgbox;
|
||||||
|
import dlangui.graphics.drawbuf;
|
||||||
import std.stdio;
|
import std.stdio;
|
||||||
import std.conv;
|
import std.conv;
|
||||||
import std.utf;
|
import std.utf;
|
||||||
|
import std.random;
|
||||||
|
|
||||||
|
|
||||||
mixin APP_ENTRY_POINT;
|
mixin APP_ENTRY_POINT;
|
||||||
|
@ -123,6 +125,7 @@ class SampleAnimationWidget : VerticalLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Cell offset
|
||||||
struct FigureCell {
|
struct FigureCell {
|
||||||
// horizontal offset
|
// horizontal offset
|
||||||
int dx;
|
int dx;
|
||||||
|
@ -134,20 +137,26 @@ struct FigureCell {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Single figure shape for some particular orientation - 4 cells
|
||||||
struct FigureShape {
|
struct FigureShape {
|
||||||
// by cell index 0..3
|
/// by cell index 0..3
|
||||||
FigureCell[4] cells;
|
FigureCell[4] cells;
|
||||||
// number of cells lowest item is below 0,0 cell
|
/// lowest y coordinate - to show next figure above cup
|
||||||
int extent;
|
int extent;
|
||||||
|
/// upper y coordinate - initial Y offset to place figure to cup
|
||||||
|
int y0;
|
||||||
this(int[2] c1, int[2] c2, int[2] c3, int[2] c4) {
|
this(int[2] c1, int[2] c2, int[2] c3, int[2] c4) {
|
||||||
cells[0] = FigureCell(c1);
|
cells[0] = FigureCell(c1);
|
||||||
cells[1] = FigureCell(c2);
|
cells[1] = FigureCell(c2);
|
||||||
cells[2] = FigureCell(c3);
|
cells[2] = FigureCell(c3);
|
||||||
cells[3] = FigureCell(c4);
|
cells[3] = FigureCell(c4);
|
||||||
extent = 0;
|
extent = y0 = 0;
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++) {
|
||||||
if (extent > cells[i].dy)
|
if (extent > cells[i].dy)
|
||||||
extent = cells[i].dy;
|
extent = cells[i].dy;
|
||||||
|
if (y0 < cells[i].dy)
|
||||||
|
y0 = cells[i].dy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,8 +218,10 @@ class CupWidget : Widget {
|
||||||
int _cols;
|
int _cols;
|
||||||
int _rows;
|
int _rows;
|
||||||
int[] _cup;
|
int[] _cup;
|
||||||
|
int _currentFigure;
|
||||||
|
int _nextFigure;
|
||||||
|
|
||||||
static const int RESERVED_ROWS = 4; // reserved for next figure
|
static const int RESERVED_ROWS = 5; // reserved for next figure
|
||||||
enum : int {
|
enum : int {
|
||||||
WALL = -1,
|
WALL = -1,
|
||||||
EMPTY = 0,
|
EMPTY = 0,
|
||||||
|
@ -220,7 +231,6 @@ class CupWidget : Widget {
|
||||||
FIGURE4,
|
FIGURE4,
|
||||||
FIGURE5,
|
FIGURE5,
|
||||||
FIGURE6,
|
FIGURE6,
|
||||||
FIGURE7,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum : int {
|
enum : int {
|
||||||
|
@ -230,7 +240,11 @@ class CupWidget : Widget {
|
||||||
ORIENTATION270
|
ORIENTATION270
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint[] _figureColors = [0xFF0000, 0xFFFF00, 0xFF00FF, 0x0000FF, 0x800000, 0x408000, 0x000080];
|
static const uint[6] _figureColors = [0xFF0000, 0xA0A000, 0xA000A0, 0x0000FF, 0x800000, 0x408000];
|
||||||
|
|
||||||
|
void genNextFigure() {
|
||||||
|
_nextFigure = uniform(FIGURE1, FIGURE6);
|
||||||
|
}
|
||||||
|
|
||||||
this() {
|
this() {
|
||||||
super("CUP");
|
super("CUP");
|
||||||
|
@ -245,7 +259,8 @@ class CupWidget : Widget {
|
||||||
setCell(6, 4, FIGURE4);
|
setCell(6, 4, FIGURE4);
|
||||||
setCell(7, 4, FIGURE5);
|
setCell(7, 4, FIGURE5);
|
||||||
setCell(4, 5, FIGURE6);
|
setCell(4, 5, FIGURE6);
|
||||||
setCell(4, 6, FIGURE7);
|
|
||||||
|
genNextFigure();
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(int cols, int rows) {
|
void init(int cols, int rows) {
|
||||||
|
@ -284,13 +299,13 @@ class CupWidget : Widget {
|
||||||
int w = cellRc.width / 6;
|
int w = cellRc.width / 6;
|
||||||
buf.drawFrame(cellRc, color, Rect(w,w,w,w));
|
buf.drawFrame(cellRc, color, Rect(w,w,w,w));
|
||||||
cellRc.shrink(w, w);
|
cellRc.shrink(w, w);
|
||||||
color = (color & 0xFFFFFF) | 0xC0000000;
|
color = addAlpha(color, 0xC0);
|
||||||
buf.fillRect(cellRc, color);
|
buf.fillRect(cellRc, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void drawFigure(DrawBuf buf, Rect rc, int figureIndex, int orientation, int x, int y, int dy) {
|
protected void drawFigure(DrawBuf buf, Rect rc, int figureIndex, int orientation, int x, int y, int dy, uint alpha = 0) {
|
||||||
uint color = _figureColors[figureIndex];
|
uint color = addAlpha(_figureColors[figureIndex - 1], alpha);
|
||||||
FigureShape shape = FIGURES[figureIndex].shapes[orientation];
|
FigureShape shape = FIGURES[figureIndex - 1].shapes[orientation];
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
Rect cellRc = cellRect(rc, x + shape.cells[i].dx, y + shape.cells[i].dy);
|
Rect cellRc = cellRect(rc, x + shape.cells[i].dx, y + shape.cells[i].dy);
|
||||||
cellRc.top += dy;
|
cellRc.top += dy;
|
||||||
|
@ -299,6 +314,16 @@ class CupWidget : Widget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected bool isPositionFree(int figureIndex, int orientation, int x, int y) {
|
||||||
|
FigureShape shape = FIGURES[figureIndex - 1].shapes[orientation];
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
int value = cell(x + shape.cells[i].dx, y + shape.cells[i].dy);
|
||||||
|
if (value != 0) // occupied
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// Draw widget at its position to buffer
|
/// Draw widget at its position to buffer
|
||||||
override void onDraw(DrawBuf buf) {
|
override void onDraw(DrawBuf buf) {
|
||||||
super.onDraw(buf);
|
super.onDraw(buf);
|
||||||
|
@ -311,20 +336,23 @@ class CupWidget : Widget {
|
||||||
Rect bottomRight = cellRect(rc, _cols - 1, 0);
|
Rect bottomRight = cellRect(rc, _cols - 1, 0);
|
||||||
Rect cupRc = Rect(topLeft.left, topLeft.top, bottomRight.right, bottomRight.bottom);
|
Rect cupRc = Rect(topLeft.left, topLeft.top, bottomRight.right, bottomRight.bottom);
|
||||||
|
|
||||||
int fw = 3;
|
int fw = 7;
|
||||||
uint fcl = 0x80000060;
|
int dw = 0;
|
||||||
buf.fillRect(cupRc, 0x80A0C0B0);
|
uint fcl = 0xA0606090;
|
||||||
buf.fillRect(Rect(cupRc.left - 1 - fw, cupRc.top, cupRc.left - 1, cupRc.bottom + 2), fcl);
|
buf.fillRect(cupRc, 0xC0A0C0B0);
|
||||||
buf.fillRect(Rect(cupRc.right + 2, cupRc.top, cupRc.right + 2 + fw, cupRc.bottom + 2), fcl);
|
buf.fillRect(Rect(cupRc.left - dw - fw, cupRc.top, cupRc.left - dw, cupRc.bottom + dw), fcl);
|
||||||
buf.fillRect(Rect(cupRc.left - 1 - fw, cupRc.bottom + 2, cupRc.right + 2 + fw, cupRc.bottom + 2 + fw), fcl);
|
buf.fillRect(Rect(cupRc.right + dw, cupRc.top, cupRc.right + dw + fw, cupRc.bottom + dw), fcl);
|
||||||
|
buf.fillRect(Rect(cupRc.left - dw - fw, cupRc.bottom + dw, cupRc.right + dw + fw, cupRc.bottom + dw + fw), fcl);
|
||||||
|
|
||||||
for (int row = 0; row < _rows; row++) {
|
for (int row = 0; row < _rows; row++) {
|
||||||
for (int col = 0; col < _cols; col++) {
|
for (int col = 0; col < _cols; col++) {
|
||||||
|
|
||||||
int value = cell(col, row);
|
int value = cell(col, row);
|
||||||
Rect cellRc = cellRect(rc, col, row);
|
Rect cellRc = cellRect(rc, col, row);
|
||||||
|
|
||||||
Point middle = cellRc.middle;
|
Point middle = cellRc.middle;
|
||||||
buf.fillRect(Rect(middle.x - 1, middle.y - 1, middle.x + 1, middle.y + 1), 0x404040);
|
buf.fillRect(Rect(middle.x - 1, middle.y - 1, middle.x + 1, middle.y + 1), 0x80404040);
|
||||||
|
|
||||||
if (value != EMPTY) {
|
if (value != EMPTY) {
|
||||||
uint cl = _figureColors[value - 1];
|
uint cl = _figureColors[value - 1];
|
||||||
drawCell(buf, cellRc, cl);
|
drawCell(buf, cellRc, cl);
|
||||||
|
@ -332,13 +360,20 @@ class CupWidget : Widget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drawFigure(buf, rc, 0, 0, 2, 9, 0);
|
drawFigure(buf, rc, FIGURE1, ORIENTATION0, 2, 9, 0);
|
||||||
drawFigure(buf, rc, 2, 1, 6, 8, 0);
|
drawFigure(buf, rc, FIGURE2, ORIENTATION90, 6, 8, 0);
|
||||||
|
drawFigure(buf, rc, FIGURE3, ORIENTATION270, 4, 12, 0);
|
||||||
|
|
||||||
|
if (_nextFigure != 0) {
|
||||||
|
auto shape = FIGURES[_nextFigure - 1].shapes[0];
|
||||||
|
drawFigure(buf, rc, _nextFigure, ORIENTATION0, _cols / 2 - 1, _rows - shape.extent + 1, 0, 0xA0);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
|
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
|
||||||
override void measure(int parentWidth, int parentHeight) {
|
override void measure(int parentWidth, int parentHeight) {
|
||||||
measuredContent(parentWidth, parentHeight, 300, 550);
|
/// fixed size 350 x 550
|
||||||
|
measuredContent(parentWidth, parentHeight, 350, 550);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,6 +390,12 @@ class StatusWidget : VerticalLayout {
|
||||||
layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT).layoutWeight(2);
|
layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT).layoutWeight(2);
|
||||||
padding(Rect(20, 20, 20, 20));
|
padding(Rect(20, 20, 20, 20));
|
||||||
}
|
}
|
||||||
|
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
|
||||||
|
override void measure(int parentWidth, int parentHeight) {
|
||||||
|
super.measure(parentWidth, parentHeight);
|
||||||
|
/// fixed size 350 x 550
|
||||||
|
measuredContent(parentWidth, parentHeight, 150, 550);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CupPage : HorizontalLayout {
|
class CupPage : HorizontalLayout {
|
||||||
|
@ -369,6 +410,12 @@ class CupPage : HorizontalLayout {
|
||||||
addChild(_cup);
|
addChild(_cup);
|
||||||
addChild(_status);
|
addChild(_status);
|
||||||
}
|
}
|
||||||
|
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
|
||||||
|
override void measure(int parentWidth, int parentHeight) {
|
||||||
|
super.measure(parentWidth, parentHeight);
|
||||||
|
/// fixed size 350 x 550
|
||||||
|
measuredContent(parentWidth, parentHeight, 500, 550);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//FrameLayout
|
//FrameLayout
|
||||||
|
@ -385,7 +432,7 @@ class GameWidget : HorizontalLayout {
|
||||||
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
|
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
|
||||||
override void measure(int parentWidth, int parentHeight) {
|
override void measure(int parentWidth, int parentHeight) {
|
||||||
super.measure(parentWidth, parentHeight);
|
super.measure(parentWidth, parentHeight);
|
||||||
measuredContent(parentWidth, parentHeight, 400, 600);
|
measuredContent(parentWidth, parentHeight, 500, 550);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,12 @@ uint blendAlpha(uint a1, uint a2) {
|
||||||
return (((a1 ^ 0xFF) * (a2 ^ 0xFF)) >> 8) ^ 0xFF;
|
return (((a1 ^ 0xFF) * (a2 ^ 0xFF)) >> 8) ^ 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// applies additional alpha to color
|
||||||
|
uint addAlpha(uint color, uint alpha) {
|
||||||
|
alpha = blendAlpha(color >> 24, alpha);
|
||||||
|
return (color & 0xFFFFFF) | (alpha << 24);
|
||||||
|
}
|
||||||
|
|
||||||
ubyte rgbToGray(uint color) {
|
ubyte rgbToGray(uint color) {
|
||||||
uint srcr = (color >> 16) & 0xFF;
|
uint srcr = (color >> 16) & 0xFF;
|
||||||
uint srcg = (color >> 8) & 0xFF;
|
uint srcg = (color >> 8) & 0xFF;
|
||||||
|
|
Loading…
Reference in New Issue