1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>2022-09-24-190300_Nuki1Retrospective</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<style type="text/css">* {
color: white;
font-family: Arial;
background-color: transparent;
}
html { background-color: #16161d; }
a:link {color: dodgerblue}
a:visited {color: dodgerblue}
a:hover {color: dodgerblue}
a:active {color: dodgerblue}
img {padding: 20px}
code {background-color: #555555; font-family: Courier New; font-size: smaller; background-clip: padding-box; border: 0px solid; display: inline-block; margin: 0px;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
<h1 id="nuki1retrospective">2022-09-24-190300_Nuki1Retrospective</h1>
<h2 id="nuki1-in-retrospective-dev-log">NUKI1 in Retrospective /
dev-log</h2>
<p>See here <a href="https://baden.dev/p/nuki1">NUKI1 - Nuki and I
explore the Galaxy - on baden.dev</a></p>
<h3 id="quick-introduction">Quick introduction</h3>
<p><code>NUKI1</code> or <code>Nuki and I explore the Galaxy</code> is a
puzzle-platformer mix, and my first commercially released game.</p>
<p>I tried to create a new unique genre-mix (in the somehow worn out
platformer genre) implementing ideas that lingered in my mind for years,
a lot of those inspired by some good old DOS games I played.</p>
<h3 id="concept">Concept</h3>
<p>At first I wanted to make a top-down puzzler game, but felt that I
needed more “action” and “physics” like advanced and precise platformer
movement and artillery-game and rocket movement.</p>
<p>Also, an inventory system with object interaction like in a RPG and
puzzles that you need to solve in real life (on paper/via web
lookup/etc.) were on my list.</p>
<p>At the end I decided to make the game in 10 unique levels and
integrate all of my crazy genre-mix-ideas.</p>
<h3 id="implementation">Implementation</h3>
<p>I started the game in Python only using tkinter as a “side-project”,
when I hit performance problems and coincidentally bought an ODROID GO
SUPER device for cheap.</p>
<p>I thought it would be nice to support the ODROID, and from then on I
rewrote the game in C++ with ODROID support in mind (wasn’t far
anyways).</p>
<p>I only wanted to use minimal dependencies, so it was SDL and
tinyxml2, the rest of the game I wanted to write completely on my own,
since that’s where the fun lies! Writing physics/vector/math/… classes
and basically the entire engine on my own!</p>
<h3 id="programming">Programming</h3>
<h4 id="not-so-fun">Not so fun</h4>
<ul>
<li>Collision detection and handling
<ul>
<li>Wanted to have “pixel-perfect” collisions using AABB (Axis-Aligned
Bounding Box) collisions with some second check of “penetration”, which
meant looking at how deep until the first row has a pixel that overlaps
with other entity.
<ul>
<li>Getting this “okay” and also fast enough on the ODROID was quite
challenging</li>
</ul></li>
</ul></li>
<li>Music: I LOVE music and someday I hope I’ll make something, for now
I didn’t want to use third party music, so…</li>
</ul>
<h4 id="the-most-fun">The most fun</h4>
<ul>
<li><p>Physics</p>
<ul>
<li>Movement
<ul>
<li>Jump/Double-jump</li>
<li>Jetpacking</li>
</ul></li>
<li>Trajectory (Bow, Projectiles)
<ul>
<li>Recoil gun</li>
</ul></li>
<li>Spaceship movement</li>
</ul></li>
<li><p>Implementing the “ProNav” algorithm (see Wikipedia:
https://en.wikipedia.org/wiki/Proportional_navigation) for homing
missiles, especially after having the math/vector/linear algebra classes
done</p></li>
<li><p>Item usage / inventory usage</p>
<ul>
<li>equipping items and have them change stuff in the game world</li>
</ul></li>
</ul>
<h3 id="stats">Stats</h3>
<p>All in all, with rewriting a huge part of the game (while getting
better at C++), a lot of pixel painting and planning, I estimate around
1500 - 2500 hrs of work for everything.</p>
<p>A lof of time was lost in the first Py version, me getting better in
C++ and rewriting a lot of stuff.</p>
<h3 id="download">Download</h3>
<p><a href="https://baden.dev/p/nuki1">https://baden.dev/p/nuki1</a></p>
</body>
</html>
|