Add Game Of Life Wallpaper
This commit is contained in:
parent
070c22c2c7
commit
0cb0b21bf2
5 changed files with 246 additions and 0 deletions
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
||||
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
||||
<kcfgfile name=""/>
|
||||
|
||||
<group name="General">
|
||||
<entry name="color" type="String">
|
||||
<label>Color</label>
|
||||
<default>#00ff00</default>
|
||||
</entry>
|
||||
</group>
|
||||
|
||||
</kcfg>
|
|
@ -0,0 +1,103 @@
|
|||
|
||||
const State = {
|
||||
DEAD: 0,
|
||||
ALIVE: 1,
|
||||
DYING: 2,
|
||||
SPAWNING: 3,
|
||||
}
|
||||
|
||||
var cell_count_x = 0;
|
||||
var cell_count_y = 0;
|
||||
var SIZE = 10;
|
||||
|
||||
var cells = [];
|
||||
var cells_back = [];
|
||||
|
||||
function fillRandom() {
|
||||
for(let y=0;y<cell_count_y;y++) {
|
||||
for(let x=0;x<cell_count_x;x++) {
|
||||
let idx = y*cell_count_x+x;
|
||||
cells[idx] = Math.random() < 0.1 ? State.ALIVE : State.DEAD; // fill only 10%
|
||||
cells_back[idx] = State.DEAD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function dimensionChanged(width,height) {
|
||||
cell_count_x = width / SIZE;
|
||||
cell_count_y = height / SIZE;
|
||||
fillRandom();
|
||||
}
|
||||
|
||||
function getNeighbourCount( x, y)
|
||||
{
|
||||
var sum = 0;
|
||||
// top
|
||||
y--;
|
||||
var idx = y*cell_count_x+x;
|
||||
if (cells[idx-1] == State.ALIVE)
|
||||
sum++;
|
||||
if (cells[idx] == State.ALIVE)
|
||||
sum++;
|
||||
if (cells[idx+1] == State.ALIVE)
|
||||
sum++;
|
||||
// middle
|
||||
idx += cell_count_x;
|
||||
if (cells[idx-1] == State.ALIVE)
|
||||
sum++;
|
||||
if (cells[idx+1] == State.ALIVE)
|
||||
sum++;
|
||||
// bottom
|
||||
idx += cell_count_x;
|
||||
if (cells[idx-1] == State.ALIVE)
|
||||
sum++;
|
||||
if (cells[idx] == State.ALIVE)
|
||||
sum++;
|
||||
if (cells[idx+1] == State.ALIVE)
|
||||
sum++;
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function advanceGeneration() {
|
||||
for(let y=0;y<cell_count_y;y++){
|
||||
for(let x=0;x<cell_count_x;x++){
|
||||
let neighbours = getNeighbourCount(x,y);
|
||||
|
||||
let idx = y*cell_count_x+x;
|
||||
|
||||
if (neighbours < 2 && cells[idx] == State.ALIVE)
|
||||
cells_back[idx] = State.DEAD;
|
||||
else if (neighbours == 3 && cells[idx] == State.DEAD)
|
||||
cells_back[idx] = State.ALIVE;
|
||||
else if (neighbours > 3 && cells[idx] == State.ALIVE)
|
||||
cells_back[idx] = State.DEAD;
|
||||
else
|
||||
cells_back[idx] = cells[idx];
|
||||
}
|
||||
}
|
||||
// copy back into main matrix
|
||||
for(let y=0;y<cell_count_y;y++){
|
||||
for(let x=0;x<cell_count_x;x++){
|
||||
let idx = y*cell_count_x+x;
|
||||
cells[idx] = cells_back[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function paintMatrix(ctx, color){
|
||||
for(let y=0;y<cell_count_y;y++){
|
||||
for(let x=0;x<cell_count_x;x++) {
|
||||
let idx = y*cell_count_x+x;
|
||||
if (cells[idx] == State.ALIVE) {
|
||||
ctx.fillStyle = color;
|
||||
ctx.fillRect(x*SIZE,y*SIZE,SIZE,SIZE);
|
||||
} else {
|
||||
ctx.fillStyle = "black";
|
||||
ctx.fillRect(x*SIZE,y*SIZE,SIZE,SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
|
||||
// for "units"
|
||||
import org.kde.plasma.components as PlasmaComponents
|
||||
import org.kde.kquickcontrols as KQuickControls
|
||||
import org.kde.plasma.core as PlasmaCore
|
||||
|
||||
|
||||
ColumnLayout {
|
||||
id: root
|
||||
|
||||
property alias cfg_color : colorButton.color;
|
||||
|
||||
Row {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.top: parent.top
|
||||
|
||||
Label {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
rightPadding: 15
|
||||
text: i18n("Cell color")
|
||||
}
|
||||
KQuickControls.ColorButton {
|
||||
id: colorButton
|
||||
dialogTitle: i18n("Select cell color")
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Copyright (C) %{CURRENT_YEAR} by %{AUTHOR} <%{EMAIL}>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Library General Public License as
|
||||
* published by the Free Software Foundation; either version 2 or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import org.kde.plasma.plasmoid
|
||||
import "code/life.js" as Life
|
||||
import org.kde.plasma.core as PlasmaCore
|
||||
|
||||
WallpaperItem {
|
||||
id: root
|
||||
|
||||
Canvas {
|
||||
id: gameCanvas
|
||||
anchors.fill: parent
|
||||
property int mleft: 0
|
||||
property int mtop: 0
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
|
||||
onPaint: {
|
||||
var ctx = getContext("2d");
|
||||
Life.paintMatrix(ctx, wallpaper.configuration.color);
|
||||
}
|
||||
|
||||
onWidthChanged: {
|
||||
stepTimer.stop();
|
||||
Life.dimensionChanged(width, height);
|
||||
stepTimer.start();
|
||||
}
|
||||
|
||||
onHeightChanged: {
|
||||
stepTimer.stop();
|
||||
Life.dimensionChanged(width, height);
|
||||
stepTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: stepTimer
|
||||
interval: 1000
|
||||
repeat: true
|
||||
running: true
|
||||
triggeredOnStart: true
|
||||
|
||||
onTriggered: {
|
||||
gameCanvas.mleft++;
|
||||
gameCanvas.mtop++;
|
||||
Life.advanceGeneration();
|
||||
gameCanvas.requestPaint();
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
// Initialize the Life simulation using the actual dimensions
|
||||
Life.dimensionChanged(width, height);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"KPackageStructure": "Plasma/Wallpaper",
|
||||
"KPlugin": {
|
||||
"Authors": [
|
||||
{
|
||||
"Email": "%{EMAIL}",
|
||||
"Name": "%{AUTHOR}"
|
||||
}
|
||||
],
|
||||
"Id": "org.kde.plasma.gameoflife",
|
||||
"License": "LGPLv2+",
|
||||
"Name": "Conway's Game of Life",
|
||||
"Version": "%{VERSION}",
|
||||
"Description": "Allows you to use Shaders as your wallpaper"
|
||||
},
|
||||
"X-KDE-ParentApp": "org.kde.plasmashell",
|
||||
"X-Plasma-API-Minimum-Version": "6.0",
|
||||
"X-Plasma-ContainmentType": "Desktop"
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in a new issue