From 61b773ac6d52cac9a5676a63b3534b452d922f69 Mon Sep 17 00:00:00 2001 From: Fabien Freling Date: Mon, 24 Feb 2025 13:15:12 +0100 Subject: [PATCH] bootstrap lua --- flake.nix | 5 ++- justfile | 9 +++++ src/main.lua | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 justfile create mode 100644 src/main.lua diff --git a/flake.nix b/flake.nix index 7b1addc..3a198f9 100644 --- a/flake.nix +++ b/flake.nix @@ -12,11 +12,14 @@ outputs = { self, nixpkgs, playdate-sdk }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; + stdenv = pkgs.stdenv; playdate-sdk-pkg = playdate-sdk.packages.${system}.default; in { - devShell.${system} = with pkgs; + devShell.${system} = with stdenv; with pkgs; mkShell { nativeBuildInputs = [ + just + lua-language-server playdate-sdk-pkg ]; }; diff --git a/justfile b/justfile new file mode 100644 index 0000000..3ece306 --- /dev/null +++ b/justfile @@ -0,0 +1,9 @@ +bin := "Rush.pdx" + +alias b := build +build: + pdc src {{ bin }} + +alias s := simu +simu: build + PlaydateSimulator {{ bin }} diff --git a/src/main.lua b/src/main.lua new file mode 100644 index 0000000..b06ea55 --- /dev/null +++ b/src/main.lua @@ -0,0 +1,95 @@ +-- Name this file `main.lua`. Your game can use multiple source files if you wish +-- (use the `import "myFilename"` command), but the simplest games can be written +-- with just `main.lua`. + +-- You'll want to import these in just about every project you'll work on. + +import "CoreLibs/object" +import "CoreLibs/graphics" +import "CoreLibs/sprites" +import "CoreLibs/timer" + +-- Declaring this "gfx" shorthand will make your life easier. Instead of having +-- to preface all graphics calls with "playdate.graphics", just use "gfx." +-- Performance will be slightly enhanced, too. +-- NOTE: Because it's local, you'll have to do it in every .lua source file. + +local gfx = playdate.graphics + +-- Here's our player sprite declaration. We'll scope it to this file because +-- several functions need to access it. + +local playerSprite = nil + +-- A function to set up our game environment. + +function myGameSetUp() + + -- Set up the player sprite. + + local playerImage = gfx.image.new("Images/playerImage") + assert( playerImage ) -- make sure the image was where we thought + + playerSprite = gfx.sprite.new( playerImage ) + playerSprite:moveTo( 200, 120 ) -- this is where the center of the sprite is placed; (200,120) is the center of the Playdate screen + playerSprite:add() -- This is critical! + + -- We want an environment displayed behind our sprite. + -- There are generally two ways to do this: + -- 1) Use setBackgroundDrawingCallback() to draw a background image. (This is what we're doing below.) + -- 2) Use a tilemap, assign it to a sprite with sprite:setTilemap(tilemap), + -- and call :setZIndex() with some low number so the background stays behind + -- your other sprites. + + local backgroundImage = gfx.image.new( "Images/background" ) + assert( backgroundImage ) + + gfx.sprite.setBackgroundDrawingCallback( + function( x, y, width, height ) + -- x,y,width,height is the updated area in sprite-local coordinates + -- The clip rect is already set to this area, so we don't need to set it ourselves + backgroundImage:draw( 0, 0 ) + end + ) + +end + +-- Now we'll call the function above to configure our game. +-- After this runs (it just runs once), nearly everything will be +-- controlled by the OS calling `playdate.update()` 30 times a second. + +myGameSetUp() + +-- `playdate.update()` is the heart of every Playdate game. +-- This function is called right before every frame is drawn onscreen. +-- Use this function to poll input, run game logic, and move sprites. + +function playdate.update() + + -- Poll the d-pad and move our player accordingly. + -- (There are multiple ways to read the d-pad; this is the simplest.) + -- Note that it is possible for more than one of these directions + -- to be pressed at once, if the user is pressing diagonally. + + if playdate.buttonIsPressed( playdate.kButtonUp ) then + playerSprite:moveBy( 0, -2 ) + end + if playdate.buttonIsPressed( playdate.kButtonRight ) then + playerSprite:moveBy( 2, 0 ) + end + if playdate.buttonIsPressed( playdate.kButtonDown ) then + playerSprite:moveBy( 0, 2 ) + end + if playdate.buttonIsPressed( playdate.kButtonLeft ) then + playerSprite:moveBy( -2, 0 ) + end + + -- Call the functions below in playdate.update() to draw sprites and keep + -- timers updated. (We aren't using timers in this example, but in most + -- average-complexity games, you will.) + + gfx.sprite.update() + playdate.timer.updateTimers() + +end +