Ivannio Ivre, The Painter’s Struggle

Met een klein team deed ik mee aan de GMTK 2024 gamejam. Het thema was “Built to Scale”. Na een lange brainstorm kwamen we uit bij een painting game, waarbij je brush constant van grote veranderde. We hadden ook andere modifiers bedacht die met scale te maken hadden alleen waren deze niet te implemeteren. Het verhaal is dat Ivannio een schilder is die bezopen is en dat ie geen steady brush size kan houden. Je moet 6 prompts tekenen op basis van de klant. Na het tekenen mag je zelf kiezen op welke plek je je schilderij plaatst in de gallerij. Als je 6 tekeningen gemaakt hebt kan je je gallerij uploaden en laten raten door andere spelers. Je kan ook ander mans gallerijen raten.
Het eind resultaat is best leuk geworden en we zijn ook op een mooie overall plek geeindigd die we niet verwacht hadden 345e (van de 7.605). Dat is een goede top 500. Ons doel was om minimaal in de top 2.000 te komen. Dat is dus gelukt. Elke categorie zit ook nog eens in de top 1.000.
Project Info:
Teamleden: Floris Koelemaij, Andrich Laker, Tristan Laman
Project tijd: 16-08-2024 t/m 20-08-2024
Engine: Unity
Code Languages: C#, PHP
Game Jam: GMTK 2024



Painting

De speler krijgt een random prompt van de klant die hij moet tekenen. Het tekenen werkt doormiddel van een Texture2D. Verschillende modifiers kunnen ook de canvas bewerken, daarom wordt eerst alle draw data ontvangen en de modifier edits om vervolgens verwerkt te worden. De wetpaint en wind koste de game nog best wat performance aangezien deze elke pixel moest updaten om het gewenste effect te krijgen. Na veel optimalisatie lagte de game niet meer hard als de wetpaint kwam. Nadat de speler klaar was met tekenen kon hij op done klikken om naar de gallerij te gaan en de painting een plekje te geven.
private void WetPaint()
{
Color32[] pixels = currentDrawing.GetPixels32();
for (int y = 1; y < currentDrawing.height; y++)
{
for (int x = 0; x < currentDrawing.width; x++)
{
int index = y * currentDrawing.width + x;
Color32 newColor = pixels[index];
if(IsSameColor(newColor, backgroundColor)) continue;
if (!QuickRandom()) continue;
int aboveIndex = index - currentDrawing.width;
if (aboveIndex >= 0)
{
Color32 checkColor = pixels[aboveIndex];
if (IsSameColor(newColor, checkColor)) continue;
pixels[aboveIndex] = newColor;
}
}
}
currentDrawing.SetPixels32(pixels);
currentDrawing.Apply();
}
Wetpaint functie. Gaat door alle pixels heen en checkt of er een kleur is. Ja? Als de random value ook goed is update dan de pixel er onder.
API
De game maakt gebruik van een API om paintings te uploaden en te gallerijen te bekijken. Deze api staat op de api variant van deze website (https://api.wesleydegraaf.com). Deze api is volledig door mij gemaakt en kan de volgende dingen: Gallerije uploaden (inc images.), Gallerijen lijst, Gallerij bekijken, Gallerij raten Gallerij reporten en voor de developer een gallerij report viewer.
require_once("GMTKconnection.php");
$galleryId = $_GET['id'] ?? null;
if ($galleryId) {
$sql = "SELECT GalleryName, Rating
FROM Gallery
WHERE ID = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $galleryId);
$stmt->execute();
$result = $stmt->get_result();
$response = new stdClass();
$response->gallery = null;
$response->status = "FAILED";
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$gallery = new stdClass();
$gallery->galleryId = $galleryId;
$gallery->galleryName = $row["GalleryName"];
$gallery->rating = $row["Rating"];
$sqlPhotos = "SELECT ID, Name, ImgDir, Modifier
FROM Paintings
WHERE GalleryID = ?";
$stmtPhotos = $conn->prepare($sqlPhotos);
if ($stmtPhotos === false) {
die('Prepare failed: ' . $conn->error);
}
$stmtPhotos->bind_param("i", $galleryId);
$stmtPhotos->execute();
$photosResult = $stmtPhotos->get_result();
$gallery->photos = array();
while ($photo = $photosResult->fetch_assoc()) {
$photoObj = new stdClass();
$photoObj->paintingName = $photo["Name"];
$photoObj->imgDir = $photo["ImgDir"];
$photoObj->modifier = $photo['Modifier'];
$gallery->photos[] = $photoObj;
}
$response->gallery = $gallery;
$response->status = "OK";
$response->customMessage = "Gallery and photos retrieved successfully.";
} else {
$response->customMessage = "Gallery not found.";
}
$stmt->close();
$conn->close();
} else {
$response = new stdClass();
$response->status = "FAILED";
$response->customMessage = "No gallery ID provided.";
}
echo json_encode($response);
Krijg de gallerij met het opgegeven ID. Return: GallerijID, GallerijNaam, Rating, en foto’s [fotonaam, imglocatie, modifier]