HKU Game Blitz
Voor project Context moesten we een game maken voor de opendag van HKU. De game moest te maken hebben met de studie ervaring op HKU. Wij kozen ervoor om de 3 richtingen van de opleidingen te representeren en ook de tijdsdruk die aanwezig is op HKU. De game moest door de toekomstige student gespeeld worden en door een van z’n ouders. We weten allemaal dat ouders vaak moeite hebben met controlls, daarom hadden wij besloten om de Wiimote te gebruiken als input. De Wii is een console die gemaakt is voor familie. Dit was dus een logische keuze.
We hadden voor de Art minigame een painting game gemaakt waar beide spelers moesten verven. Voor de design minigame moest de ene speler een level bouwen en de andere speler dat level halen. Bij de develop minigame moesten beide spelers een instructie set schrijven om een robot naar de finish te krijgen.
Project Info:
Teamleden: Floris Koelemaij, Lloyd Belterman, Arman Aryob, ELL Visser
Project tijd: HKU Jaar 1 Periode 3 (2024)
Engine: Unity
Code Languages: C#
Design Patterns: Singleton & FlyWeight



Wiimotes
De game maakt gebruik van Wiimotes hier heb ik een WiiMote API voor gebruikt (https://github.com/Flafla2/Unity-Wiimote). Ik kreeg de API helaas niet aan de praat voor de nieuwe Wiimotes (WiimotionPlus), dus hij werkt alleen voor de oude Wiimotes. De trilling van de Wiimotes komt, omdat de Wiimotes hele gevoelige input gaven. Lerpen tussen de input gaf ook niet het gewenste resultaat en maakte de input lagy. Ik heb de WiiMote api aangepast en had er een custom inputhandler op gebouwt, hierdoor konden we met de muis een Wiimote nadoen. Dit maakte testen weer makkelijker, maar de WiimoteAPI had een rare inputhandler.
protected void HandleInput()
{
foreach (KeyValuePair key in activeInput)
{
if (key.Value)
{
if (!buttonDown.ContainsKey(key.Key))
{
buttonDown.Add(key.Key, Time.frameCount + 1);
}
}
else if (buttonDown.ContainsKey(key.Key))
{
buttonDown.Remove(key.Key);
if (!buttonUp.ContainsKey(key.Key)) buttonUp.Add(key.Key, Time.frameCount + 1);
else buttonUp[key.Key] = Time.frameCount + 1;
}
}
}
Verwerkt de input van de Wiimote
Painting Game
Bij de painting game krijgt de speler een random prompt van de game en moeten de spelers deze samen tekenen. Beide spelers hebben een set aan kleuren en kunnen elkaars kleuren niet gebruiken. Aan het einde wordt de tekening gereviewed. Dit wouden we met een automatisch systeem doen, maar dit was te complex voor de tijd die beschikbaar was. Het tekenen gebeurt op een Texture2D. Eerst worden alle draw data opgehaald en daarna wordt dit op de texture2D gezet. (Het systeem is dus niet gelimiteerd naar 2 spelers)
public void DrawPixels(Dictionary|int, DrawData| wiiPositions)
{
Texture2D texture2D = currentDrawing;
RenderTexture curText = RenderTexture.active;
RenderTexture renTex = new RenderTexture(texture2D.width, texture2D.height, 32);
Graphics.Blit(texture2D, renTex);
RenderTexture.active = renTex;
texture2D.ReadPixels(new Rect(0, 0, texture2D.width, texture2D.height), 0, 0);
foreach (KeyValuePair pos in wiiPositions)
{
Vector2 newPos = pos.Value.position - new Vector2(Screen.width * .5f, Screen.height * .5f);
newPos += new Vector2(drawingImage.rectTransform.rect.width * drawCanvas.scaleFactor * .5f, drawingImage.rectTransform.rect.height * drawCanvas.scaleFactor * .5f);
newPos = new Vector2(newPos.x / (1238 * drawCanvas.scaleFactor) * width, (newPos.y + 75 * drawCanvas.scaleFactor) / (740 * drawCanvas.scaleFactor) * height);
Vector2Int changePixelPos = new Vector2Int(Mathf.RoundToInt(newPos.x), Mathf.RoundToInt(newPos.y));
List positions = lastDrawData.ContainsKey(pos.Key) ? GetLinearPositions(lastDrawData[pos.Key].position, changePixelPos) : new List() { changePixelPos };
foreach (Vector3 position in positions)
{
List pixels = GetNeighbouringPixels(new Vector2(texture2D.width, texture2D.height), position, brushRadius);
if (pixels.Count > 0)
foreach (Vector2 p in pixels)
texture2D.SetPixel((int)p.x, (int)p.y, pos.Value.color);
}
if (!lastDrawData.ContainsKey(pos.Key)) lastDrawData.Add(pos.Key, new DrawData(newPos, pos.Value.color));
else lastDrawData[pos.Key] = new DrawData(newPos, pos.Value.color);
}
texture2D.Apply();
RenderTexture.active = curText;
renTex.Release();
Destroy(renTex);
curText = null;
renTex = null;
drawingImage.texture = texture2D;
}
Tekent alle pixels op de texture2D.
Programming Game
Voor de programmeer minigame is het doel om de robot van punt A naar punt B te brengen. Dit doen de spelers doormiddel van code blocks. Ze hebben 4 simpele code blocks: Vooruit, achteruit, Draai Links en Draai Rechts. De spelers hebben beide 2 code blocks. Na het schrijven van de instructie set kunnen ze deze runnen. De spelers kunnen na het in elkaar zetten niks meer toevoegen of aanpassen (beoordelings fase). De robot volgt de complete instructie set en laat dit zien op beeld. Als een actie niet kan blijft de robot staan.
{ //(Display fix)
public void AddToCode(DevPlaceButton placeButton)
{
if (codeLines.Count > 0)
{
CodeLines lastIndex = codeLines[codeLines.Count - 1];
if (lastIndex.PlaceButtonName == placeButton.name)
{
lastIndex.AddRunCount();
Destroy(placeButton.gameObject);
return;
}
}
CodeLines tempLine = Instantiate(codeLinePrefab, codeLineParent);
codeLines.Add(tempLine);
tempLine.Setup(codeLines.Count, placeButton);
if (codeLines.Count > 6)
{
Vector2 viewPortLocalPosition = scrollRect.viewport.localPosition;
Vector2 targetLocalPosition = tempLine.transform.localPosition;
Vector2 newTargetPosition = new Vector2(codeLineParent.transform.localPosition.x, 0 - (viewPortLocalPosition.y + targetLocalPosition.y + scrollRect.viewport.rect.height * .38f));
codeLineParent.localPosition = newTargetPosition;
}
}
private IEnumerator RunCode()
{
int executionIndex = 0;
while (true)
{
if (codeLines[executionIndex].RunCode(out int ActionIndex))
{
executionIndex++;
}
robotPlayer.SendInstructions(ActionIndex);
yield return new WaitForSeconds(1);
if (codeLines.Count == executionIndex) break;
}
if (robotPlayer.IsOnFinish())
{
//FINISH
GameManager.Instance.AddScore(1);
GameManager.Instance.LoadNextGame();
}
else
{
GameManager.Instance.LoadNextGame();
}
}
}
Voegt een code block toe aan de code execution en de Code run IEnumerator.
Geen download beschikbaar aangezien het met Wiimotes gespeeld moet worden.