init commit: migrate to vanilla js
This commit is contained in:
parent
96a8352caa
commit
ba3779b7d4
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
22
index.html
Normal file
22
index.html
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/png" href="/assets/icon.png" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>rUn ThE cAT!</title>
|
||||||
|
|
||||||
|
<!-- Google Fonts -->
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Pixelify+Sans:wght@400..700&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- p5.js + p5.play -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/addons/p5.sound.min.js"></script>
|
||||||
|
<script src="https://p5play.org/v3/planck.min.js"></script>
|
||||||
|
<script src="https://p5play.org/v3/p5play.js"></script>
|
||||||
|
<script src="/lib/scenemanager.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script defer type="module" src="/src/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
204
lib/scenemanager.js
Normal file
204
lib/scenemanager.js
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
//
|
||||||
|
// p5 SceneManager helps you create p5.js sketches with multiple states / scenes
|
||||||
|
// Each scene is a like a sketch within the main sketch. You focus on creating
|
||||||
|
// the scene like a regular sketch and SceneManager ensure scene switching
|
||||||
|
// routing the main setup(), draw(), mousePressed(), etc. events to the
|
||||||
|
// appropriate current scene.
|
||||||
|
//
|
||||||
|
// Author: Marian Veteanu
|
||||||
|
// http://github.com/mveteanu
|
||||||
|
//
|
||||||
|
function SceneManager(p)
|
||||||
|
{
|
||||||
|
this.scenes = [];
|
||||||
|
this.scene = null;
|
||||||
|
|
||||||
|
// Wire relevant p5.js events, except setup()
|
||||||
|
// If you don't call this method, you need to manually wire events
|
||||||
|
this.wire = function()
|
||||||
|
{
|
||||||
|
const P5Events = [ "mouseClicked",
|
||||||
|
"mousePressed",
|
||||||
|
"mouseReleased",
|
||||||
|
"mouseMoved",
|
||||||
|
"mouseDragged",
|
||||||
|
"doubleClicked",
|
||||||
|
"mouseWheel",
|
||||||
|
"keyPressed",
|
||||||
|
"keyReleased",
|
||||||
|
"keyTyped",
|
||||||
|
"touchStarted",
|
||||||
|
"touchMoved",
|
||||||
|
"touchEnded",
|
||||||
|
"deviceMoved",
|
||||||
|
"deviceTurned",
|
||||||
|
"deviceShaken" ];
|
||||||
|
|
||||||
|
var me = this;
|
||||||
|
var o = p != null ? p : window;
|
||||||
|
|
||||||
|
// Wire draw manually for speed reasons...
|
||||||
|
o.draw = function(){ me.draw(); };
|
||||||
|
|
||||||
|
// This loop will wire automatically all P5 events to each scene like this:
|
||||||
|
// o.mouseClicked = function() { me.handleEvent("mouseClicked"); }
|
||||||
|
for(var i = 0; i < P5Events.length; i++)
|
||||||
|
{
|
||||||
|
let sEvent = P5Events[i]; // let is necesary to set the scope at the level of for
|
||||||
|
o[sEvent] = function() { me.handleEvent(sEvent) };
|
||||||
|
}
|
||||||
|
|
||||||
|
return me;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Add a scene to the collection
|
||||||
|
// You need to add all the scenes if intend to call .showNextScene()
|
||||||
|
this.addScene = function( fnScene )
|
||||||
|
{
|
||||||
|
var oScene = new fnScene(p);
|
||||||
|
|
||||||
|
// inject p as a property of the scene
|
||||||
|
this.p = p;
|
||||||
|
|
||||||
|
// inject sceneManager as a property of the scene
|
||||||
|
oScene.sceneManager = this;
|
||||||
|
|
||||||
|
var o = { fnScene: fnScene,
|
||||||
|
oScene: oScene,
|
||||||
|
hasSetup : "setup" in oScene,
|
||||||
|
hasEnter : "enter" in oScene,
|
||||||
|
hasDraw : "draw" in oScene,
|
||||||
|
setupExecuted : false,
|
||||||
|
enterExecuted : false };
|
||||||
|
|
||||||
|
this.scenes.push(o);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the index of a scene in the internal collection
|
||||||
|
this.findSceneIndex = function( fnScene )
|
||||||
|
{
|
||||||
|
for(var i = 0; i < this.scenes.length; i++)
|
||||||
|
{
|
||||||
|
var o = this.scenes[i];
|
||||||
|
if ( o.fnScene == fnScene )
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a scene object wrapper
|
||||||
|
this.findScene = function( fnScene )
|
||||||
|
{
|
||||||
|
var i = this.findSceneIndex( fnScene );
|
||||||
|
return i >= 0 ? this.scenes[i] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if the current displayed scene is fnScene
|
||||||
|
this.isCurrent = function ( fnScene )
|
||||||
|
{
|
||||||
|
if ( this.scene == null )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.scene.fnScene == fnScene;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show a scene based on the function name
|
||||||
|
// Optionally you can send arguments to the scene
|
||||||
|
// Arguments will be retrieved in the scene via .sceneArgs property
|
||||||
|
this.showScene = function( fnScene, sceneArgs )
|
||||||
|
{
|
||||||
|
var o = this.findScene( fnScene );
|
||||||
|
|
||||||
|
if ( o == null )
|
||||||
|
o = this.addScene( fnScene );
|
||||||
|
|
||||||
|
// Re-arm the enter function at each show of the scene
|
||||||
|
o.enterExecuted = false;
|
||||||
|
|
||||||
|
this.scene = o;
|
||||||
|
|
||||||
|
// inject sceneArgs as a property of the scene
|
||||||
|
o.oScene.sceneArgs = sceneArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the next scene in the collection
|
||||||
|
// Useful if implementing demo applications
|
||||||
|
// where you want to advance scenes automatically
|
||||||
|
this.showNextScene = function( sceneArgs )
|
||||||
|
{
|
||||||
|
if ( this.scenes.length == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
var nextSceneIndex = 0;
|
||||||
|
|
||||||
|
if ( this.scene != null )
|
||||||
|
{
|
||||||
|
// search current scene...
|
||||||
|
// can be optimized to avoid searching current scene...
|
||||||
|
var i = this.findSceneIndex( this.scene.fnScene );
|
||||||
|
nextSceneIndex = i < this.scenes.length - 1 ? i + 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var nextScene = this.scenes[nextSceneIndex];
|
||||||
|
this.showScene( nextScene.fnScene, sceneArgs );
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is the SceneManager .draw() method
|
||||||
|
// This will dispatch the main draw() to the
|
||||||
|
// current scene draw() method
|
||||||
|
this.draw = function()
|
||||||
|
{
|
||||||
|
// take the current scene in a variable to protect it in case
|
||||||
|
// it gets changed by the user code in the events such as setup()...
|
||||||
|
var currScene = this.scene;
|
||||||
|
|
||||||
|
if ( currScene == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( currScene.hasSetup && !currScene.setupExecuted )
|
||||||
|
{
|
||||||
|
currScene.oScene.setup();
|
||||||
|
currScene.setupExecuted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( currScene.hasEnter && !currScene.enterExecuted )
|
||||||
|
{
|
||||||
|
currScene.oScene.enter();
|
||||||
|
currScene.enterExecuted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( currScene.hasDraw )
|
||||||
|
{
|
||||||
|
currScene.oScene.draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Handle a certain event for a scene...
|
||||||
|
// It is used by the anonymous functions from the wire() function
|
||||||
|
this.handleEvent = function(sEvent)
|
||||||
|
{
|
||||||
|
if ( this.scene == null || this.scene.oScene == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
var fnSceneEvent = this.scene.oScene[sEvent];
|
||||||
|
if (fnSceneEvent)
|
||||||
|
fnSceneEvent.call(this.scene.oScene);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Legacy method... preserved for maintaining compatibility
|
||||||
|
this.mousePressed = function()
|
||||||
|
{
|
||||||
|
this.handleEvent("mousePressed");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Legacy method... preserved for maintaining compatibility
|
||||||
|
this.keyPressed = function()
|
||||||
|
{
|
||||||
|
this.handleEvent("keyPressed");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
97
lib/scenemanager_.js
Normal file
97
lib/scenemanager_.js
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
//
|
||||||
|
// Draft test of using SceneManager to run multiple scenes in parallel
|
||||||
|
//
|
||||||
|
function SceneManager_()
|
||||||
|
{
|
||||||
|
this.scenes = [];
|
||||||
|
this.visibleScenes = [];
|
||||||
|
|
||||||
|
this.addScene = function( fnScene )
|
||||||
|
{
|
||||||
|
var oScene = new fnScene( this );
|
||||||
|
|
||||||
|
var scene = { fnScene: fnScene,
|
||||||
|
oScene: oScene,
|
||||||
|
hasSetup: oScene.hasOwnProperty("setup"),
|
||||||
|
hasDraw: oScene.hasOwnProperty("draw"),
|
||||||
|
hasMousePressed: oScene.hasOwnProperty("mousePressed"),
|
||||||
|
setupExecuted: false
|
||||||
|
};
|
||||||
|
|
||||||
|
this.scenes.push( scene );
|
||||||
|
|
||||||
|
return scene;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.findScene = function( fnScene )
|
||||||
|
{
|
||||||
|
for(var i = 0; i < this.scenes.length; i++)
|
||||||
|
{
|
||||||
|
var o = this.scenes[i];
|
||||||
|
if ( o.fnScene == fnScene )
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.showScene = function( fnScene )
|
||||||
|
{
|
||||||
|
this.showScenes( [fnScene] );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.showScenes = function( arFnScenes )
|
||||||
|
{
|
||||||
|
this.visibleScenes = [];
|
||||||
|
|
||||||
|
for(var i = 0; i < arFnScenes.length; i++)
|
||||||
|
{
|
||||||
|
var fnScene = arFnScenes[i];
|
||||||
|
var scene = this.findScene( fnScene );
|
||||||
|
|
||||||
|
if ( scene == null )
|
||||||
|
scene = this.addScene( fnScene );
|
||||||
|
|
||||||
|
this.visibleScenes.push( scene );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.draw = function()
|
||||||
|
{
|
||||||
|
if ( this.visibleScenes.length == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(var i = 0; i < this.visibleScenes.length; i++ )
|
||||||
|
{
|
||||||
|
var scene = this.visibleScenes[i];
|
||||||
|
|
||||||
|
if ( scene.hasSetup && !scene.setupExecuted )
|
||||||
|
{
|
||||||
|
scene.oScene.setup();
|
||||||
|
scene.setupExecuted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( scene.hasDraw )
|
||||||
|
{
|
||||||
|
scene.oScene.draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.mousePressed = function()
|
||||||
|
{
|
||||||
|
if ( this.visibleScenes.length == 0 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(var i = 0; i < this.visibleScenes.length; i++ )
|
||||||
|
{
|
||||||
|
var scene = this.visibleScenes[i];
|
||||||
|
|
||||||
|
if ( scene.hasMousePressed )
|
||||||
|
{
|
||||||
|
scene.oScene.mousePressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
1008
package-lock.json
generated
Normal file
1008
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
package.json
Normal file
14
package.json
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "run-the-cat",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vite": "^6.3.1"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/assets/cat.webp
Normal file
BIN
public/assets/cat.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.5 KiB |
BIN
public/assets/icon.png
Normal file
BIN
public/assets/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 728 B |
53
src/cat.js
Normal file
53
src/cat.js
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
export class Cat {
|
||||||
|
constructor(x, y, targetSize) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.size = 171;
|
||||||
|
this.targetSize = targetSize;
|
||||||
|
this.sprite = null;
|
||||||
|
this.loaded = false;
|
||||||
|
|
||||||
|
loadImage('assets/cat.webp', (img) => {
|
||||||
|
this.sprite = new Sprite(this.x, this.y, this.size, this.size);
|
||||||
|
this.sprite.spriteSheet = img;
|
||||||
|
this.sprite.anis.offset.y = 3;
|
||||||
|
this.sprite.anis.frameDelay = 8;
|
||||||
|
this.sprite.friction = 0;
|
||||||
|
this.sprite.addAnis({
|
||||||
|
jump: { row: 0, frames: 4 },
|
||||||
|
death: { row: 1, frames: 4 },
|
||||||
|
hurt: { row: 2, frames: 2 },
|
||||||
|
idle: { row: 3, frames: 4 },
|
||||||
|
walk: { row: 4, frames: 6 }
|
||||||
|
});
|
||||||
|
this.sprite.changeAni('idle');
|
||||||
|
|
||||||
|
const scaleFactor = this.targetSize / 171;
|
||||||
|
this.sprite.scale = scaleFactor;
|
||||||
|
this.loaded = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
if (this.sprite) {
|
||||||
|
this.sprite.position.x = this.x;
|
||||||
|
this.sprite.position.y = this.y;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
draw() {
|
||||||
|
if (this.sprite) this.sprite.draw();
|
||||||
|
};
|
||||||
|
|
||||||
|
changeAni(name) {
|
||||||
|
if (this.sprite) this.sprite.changeAni(name);
|
||||||
|
};
|
||||||
|
|
||||||
|
setPosition(x, y) {
|
||||||
|
if (this.sprite) {
|
||||||
|
this.sprite.position.x = x;
|
||||||
|
this.sprite.position.y = y;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
41
src/main.js
Normal file
41
src/main.js
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
console.log("start fresh :)");
|
||||||
|
|
||||||
|
import { colors } from './theme.js';
|
||||||
|
import StartScene from './scenes/startScene.js';
|
||||||
|
import GameScene from './scenes/gameScene.js';
|
||||||
|
|
||||||
|
let mgr;
|
||||||
|
|
||||||
|
function setup(){
|
||||||
|
createCanvas(windowWidth, windowHeight);
|
||||||
|
textFont('Pixelify Sans', 'sans-serif');
|
||||||
|
textAlign(CENTER);
|
||||||
|
textSize(128);
|
||||||
|
|
||||||
|
mgr = new SceneManager();
|
||||||
|
mgr.addScene(StartScene);
|
||||||
|
mgr.addScene(GameScene);
|
||||||
|
|
||||||
|
mgr.showScene(StartScene);
|
||||||
|
};
|
||||||
|
|
||||||
|
function draw(){
|
||||||
|
background(colors.primary);
|
||||||
|
mgr.draw();
|
||||||
|
};
|
||||||
|
|
||||||
|
function windowResized() {
|
||||||
|
resizeCanvas(windowWidth, windowHeight);
|
||||||
|
mgr.handleEvent('onResize');
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function mousePressed(){
|
||||||
|
mgr.handleEvent('mousePressed');
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
window.setup = setup;
|
||||||
|
window.draw = draw;
|
||||||
|
window.windowResized = windowResized;
|
||||||
|
window.mousePressed = mousePressed;
|
17
src/scenes/gameScene.js
Normal file
17
src/scenes/gameScene.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import { colors } from '../theme.js';
|
||||||
|
import { draw as drawWorld, groundHeight } from '../world.js';
|
||||||
|
import { Cat } from '../cat.js';
|
||||||
|
|
||||||
|
export default function GameScene(p) {
|
||||||
|
let cat;
|
||||||
|
|
||||||
|
this.setup = () => {
|
||||||
|
cat = new Cat(width / 2, height - 200, 200);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.draw = () => {
|
||||||
|
// drawWorld(p, groundHeight);
|
||||||
|
cat.update();
|
||||||
|
cat.draw();
|
||||||
|
};
|
||||||
|
}
|
70
src/scenes/startScene.js
Normal file
70
src/scenes/startScene.js
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
import { colors } from '../theme.js';
|
||||||
|
import { Cat } from '../cat.js';
|
||||||
|
|
||||||
|
export default function StartScene() {
|
||||||
|
let cat;
|
||||||
|
let button = {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
this.setup = () => {
|
||||||
|
cat = new Cat(width / 2, height - 200, 200);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.draw = () => {
|
||||||
|
background(colors.primary);
|
||||||
|
|
||||||
|
fill(colors.tertiary);
|
||||||
|
textSize(128);
|
||||||
|
stroke(colors.secondary);
|
||||||
|
strokeWeight(7);
|
||||||
|
|
||||||
|
text('rUn ThE cAT!', width / 2, height / 2 - 100);
|
||||||
|
|
||||||
|
// Button
|
||||||
|
fill(colors.tertiary);
|
||||||
|
stroke(colors.secondary);
|
||||||
|
strokeWeight(3);
|
||||||
|
rectMode(CENTER);
|
||||||
|
rect(width / 2, height / 2 + 50, 300, 75, 10);
|
||||||
|
|
||||||
|
button.x = width / 2 - 300 / 2;
|
||||||
|
button.y = height / 2 + 50 - 75 / 2;
|
||||||
|
button.width = 300;
|
||||||
|
button.height = 75;
|
||||||
|
|
||||||
|
fill(colors.secondary);
|
||||||
|
noStroke();
|
||||||
|
textSize(32);
|
||||||
|
text('Start', width / 2, height / 2 + 60);
|
||||||
|
|
||||||
|
// Ground
|
||||||
|
fill(colors.secondary);
|
||||||
|
rect(width / 2, height - 100 / 2, width, 100);
|
||||||
|
|
||||||
|
// Sprite
|
||||||
|
cat.draw();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
this.onResize = () => {
|
||||||
|
if (cat) {
|
||||||
|
cat.setPosition(width / 2, height - 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.mousePressed = function (){
|
||||||
|
const x = mouseX;
|
||||||
|
const y = mouseY;
|
||||||
|
|
||||||
|
if (x < button.x || x > button.x + button.width) return;
|
||||||
|
if (y < button.y || y > button.y + button.height) return;
|
||||||
|
|
||||||
|
this.sceneManager.showNextScene();
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
20
src/style.css
Normal file
20
src/style.css
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: #333;
|
||||||
|
margin: 0;
|
||||||
|
padding: 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
/* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
||||||
|
Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; */
|
||||||
|
font-family: "Pixelify Sans", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
font-family: "Pixelify Sans", sans-serif;
|
||||||
|
}
|
10
src/theme.js
Normal file
10
src/theme.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
const colors = {
|
||||||
|
primary: "#a6d1ff",
|
||||||
|
secondary: "#ff4f64",
|
||||||
|
tertiary: "#fff29d",
|
||||||
|
accent: "#a4e4b6"
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
colors
|
||||||
|
}
|
8
src/world.js
Normal file
8
src/world.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import { colors } from './theme.js';
|
||||||
|
|
||||||
|
export const groundHeight = 100;
|
||||||
|
|
||||||
|
export function draw(p, groundHeight) {
|
||||||
|
fill(colors.secondary);
|
||||||
|
rect(0, height - groundHeight, width, groundHeight);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user