Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 17:21 Titel: LunaDefense (Tower-Defense-Game) |
|
|
Hallo Forum,
nach einigen gescheiterten Anläufen mit Visual Basic (6.0 bis 2008) habe ich vor ein paar Tagen angefangen mit FreeBasic ein kleines Spiel zu coden.
Was mich an FreeBasic besonders begeistert ist
- die Einfachheit der Syntax (QB-Like)
- die geniale Einfachheit der Grafikprogrammierung
- integriertes Double-Buffering (hell yeah!)
- plattformübergreifend (Windows, Linux, Mac)
Mein erstes Game heißt LunaDefense und wird ein simples kleines Tower-Defense-Game. Über das Projekt möchte ich hier im Forum ein kleines Tagebuch führen. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 17:22 Titel: |
|
|
Schritt 1 (letztes Wochenende)
- Einführung in FreeBasic
- Tutorials gelesen
- Grafikfenster erzeugt
- Grafik- und Mausfunktionen gelernt
Alles in allem waren das so zwei bis drei Stunden und schon konnte es losgehen.
![](http://www11.pic-upload.de/thumb/09.09.15/kji9eaz2hzmz.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 17:24 Titel: |
|
|
Schritt 2 (diese Woche)
- ein paar Sprites ausgesucht
- erste Versuche mit map-Variablen (z. B. map(x,y) = "fence")
- Demolevel programmiert
![](http://www11.pic-upload.de/thumb/09.09.15/bn32hv8cy9nt.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 17:26 Titel: |
|
|
Schritt 3
- Levelstruktur über den Haufen geworfen
- soll ein "Line Tower" Defense werden
- Grafiken getauscht
- Spielfeldgröße angepasst
- erste Gegner ausgesucht (natürlich Schafe, was sonst?!)
- Sprites extrahiert und mit RGB 255-0-255 transparent gemacht
![](http://www11.pic-upload.de/thumb/09.09.15/q7ijzxov7p8h.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 17:28 Titel: |
|
|
Schritt 4 (gestern und heute)
- Arrays für Gegner und Türme erzeugt
- Werte für Gegner, Gold, usw. erzeugt
- erste Gegner nach Timer zufällig erzeugt
- Animations-Timer und Schleife zur automatischen Sprite-Selektion erzeugt
- Gegner nach Timer vorerst mal abwärts laufen lassen
![](http://www11.pic-upload.de/thumb/09.09.15/dxpfnsg1mt9z.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 17:31 Titel: |
|
|
Schritt 5 (heute)
- Erste Türme eingebaut und ermöglicht diese zu setzen
- Gegnerposition absolut (in Pixeln) und interpoliert (in Feldkoordinaten) ermittelt
- Beginn der Gegner-"KI", d.h. Gegner bleiben stehen wenn es in ihre Richtung nicht mehr weiter geht, im nächsten Schritt müssen sie sich dann einen Weg suchen (das wird kompliziert, ich brauch also eine rekursive Maze-Funktion)
![](http://www11.pic-upload.de/thumb/09.09.15/bi293sp91kwo.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 09.09.2015, 22:54 Titel: |
|
|
...ich seh schon, das mit der KI wird bisschen kniffliger.
Zur Zeit ändern sie zwar ihren Kurs, aber laufen quer durch die Gegend überall hin, nur nicht dahin wo sie hin sollen
Naja, wenigstens können sie sich bereits in alle Richtungen bewegen und verlassen auch das Spielfeld nicht.
Meine Hausaufgabe für heute also:
https://de.wikipedia.org/wiki/L%C3%B6sungsalgorithmen_f%C3%BCr_Irrg%C3%A4rten |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 09.09.2015, 23:57 Titel: |
|
|
Erst einmal ein herzliches Willkommen im Forum!
Das Projekt sieht ja bisher schon sehr interessant aus. Haben die Gegner eine Hauptrichtung, in die sie laufen (also z. B. generell nach unten)? In dem Fall könnte ich mir vorstellen, dass sie, wenn es nach unten nicht möglich ist, eine zufällige Richtung rechts oder links aussuchen und so lange in diese Richtung gehen, bis sie an eine Wand stoßen (dann umkehren) oder bis wieder ein Weg nach unten möglich ist (dann weiter nach unten). Das funktioniert allerdings nicht, wenn es möglich ist, sie so einzusperren, dass sie ohne ein Nach-Oben-Laufen nicht mehr weiterkommen.
Die Rechte-Hand-Methode ist recht einfach umzusetzen (da kann ich dir auch gern eine Umsetzung zeigen), aber nicht allzu effektiv (ggf. viele Umwege) und vor allem sehr vorhersagbar. Man könnte immerhin ein paar Gegner rechter Hand und ein paar linker Hand laufen lassen, damit es nicht gar so offensichtlich ist. Trémaux scheint mir einen deutlich "chaotischeren" Weg zu ermöglichen, ist aber wohl auch deutlich schwerer umzusetzen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 10.09.2015, 14:49 Titel: |
|
|
Danke für das Willkommenheißen
Genau wie Du meintest, werd ichs wohl in der heutigen Entwicklungsphase auf eine zufällige Linke-Hand/Rechte-Hand-Methode zulaufen lassen. Viel interessanter fände ich aber die "stop"/"zuletzt"-Methode, von der ich gestern auch noch gelesen habe, da diese immer den eindeutigen Weg findet. Gerade bei Tower-Defense-Spielen ist es ja wichtig, dass die KI für den Spieler nachvollziehbar ist, damit dieser sein Labyrinth so "clever" wie möglich gestalten kann.
Was ich gerade noch festgestellt habe, man kann ja auch Pointer-Arrays erstellen, sehr nice. Damit erspare ich mir das
Code: | ' Gegner
DIM AS ANY PTR sheep_l1,sheep_l2,sheep_l3
DIM AS ANY PTR sheep_r1,sheep_r2,sheep_r3
DIM AS ANY PTR sheep_u1,sheep_u2,sheep_u3
DIM AS ANY PTR sheep_d1,sheep_d2,sheep_d3
|
und kann einfach
Code: | gegnersprite(gegnertyp,laufrichtung,animations-nr) |
verwenden. Den Umbau erledige ich jetzt mal als erstes.
Edit:
Jup, sieht gleich viel schöner aus
Code: | ' Monster malen
if monsters > 0 then
for i = 1 to monsters
' Debug: Koordinaten
monsterfx(i) = (monsterx(i))/32
monsterfy(i) = (monstery(i)-10)/32
put ( (monsterfx(i)*32) , (monsterfy(i)*32) ),selfield2,TRANS
' k = monstera(i), wenn 4 dann 2
k = monstera(i)
if k = 4 then k = 2
put (monsterx(i),monstery(i)), monstersprite(monster(i),monsterd(i),k), TRANS
next
end if |
|
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 13.09.2015, 11:25 Titel: |
|
|
Kurzes Update... bin noch dran, kam nur die letzten Tage nicht zum Programmieren. Lazy Sunday sollte sich dafür eignen.
Heute will ich schaffen:
- Maze-Funktion zum Weg durch durch Türme finden
- Schüsse der Türme
- Beginn der Balance
Für die Schüsse hab ich mir schon ein paar Sprites zurechtgepfriemelt und ein paar Gedanken gemacht. Zwischen dem Turm und dem Gegner bzw. der (zukünftigen) Position des Gegners wird ein Vektor berechnet (Bsp. -4/2). Je nachdem ob der X/Y-Wert positiv oder negativ ist, wird das entsprechende Bild ausgewählt. Sollte klappen.
![](http://www11.pic-upload.de/13.09.15/gs5d7tdhc7os.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 13.09.2015, 18:26 Titel: |
|
|
So, das mit dem Weg-Finden habe ich jetzt ein wenig unorthodox gelöst, aber sie finden ihren Weg
20.18 Uhr
Hab es jetzt doch über den Haufen geworfen. Mein neuer Ansatz ist:
Jeder Gegner merkt sich, auf welchem Feld er bereits war auf seinem Weg.
Bleib kein Weg mehr übrig bzw. sind alle noch nicht gegangenen Wege versperrt, wird der Gegner den entsprechenden Turm sprengen, um den Spieler zu bestrafen. Auf diese Art sollte der Spieler recht schnell merken, dass es keinen Sinn macht die Gegner einzukesseln bzw. unlösbare Labyrinthe zu bauen
Der graslose Hintergrund dient mir nur zur Überprüfung, gehört also nicht zur Spieloptik. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 13.09.2015, 22:01 Titel: |
|
|
Hier mal ein kleiner Zwischenstand als Video, damit man es sich schon ein bisschen vorstellen kann.
Die lahme Performance ist dem Screen Recorder zu verdanken, in echt läuft das Spiel flüssig.
![](http://www11.pic-upload.de/13.09.15/3q2zxk2lg1v.jpg) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 14.09.2015, 23:59 Titel: |
|
|
Hurra!
Gerade noch fertig geworden für heute (vier Minuten vor Mitternacht).
Was hat geklappt?
- Vektorberechnung für Schüsse
- Timer und verschiedene Stati für Türme (bereit, abgeschossen, aufladen...)
- Zielberechnung
- Geld wird abgezogen und hinzugefügt
- Alle Datenfelder neu strukturiert und die Schleifen zu verbessern
Link zum aktuellen Video:
Edit:
Hab die Geschwindigkeit des Youtube Videos der echten angepasst, da der Screen Recorder zu langsam aufnimmt ![lächeln](images/smiles/icon_smile.gif) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 19.11.2015, 23:15 Titel: |
|
|
Warum immer ein typisches Ballerspiel ?
Geht es nicht ohne Ballerei.... ? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
ThePuppetMaster
![](images/avatars/15203237124744b0302dc46.gif)
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 24.11.2015, 18:23 Titel: |
|
|
@yakyak .. ich finde deinen source sehr schön gestaltet und geschrieben.
anbei habe ich 2 tips für dich, die ich gerade in deinen screenshots gesehen habe, und dir vielleicht (säpter auch mal) einiges erleichtern können.
1. Du kannst z.B.
Code: | var = var + 1
var = var / 2
var = var * 2
'... |
durch
Code: | var += 1
var /= 2
var *= 2
'... |
ersetzen.
2. du verwendest viele array's, die man auch als typenstruktur bauen kann.
Code: | monsterx(id) = 1
monstery(id) = "abc"
monstere(id) = 2 / 4
'... |
so z.B. bei den 'monster...' variablen
hier kannst du z.B. folgendermasen vorgehen:
Code: |
type monster_type
x as integer
y as integer
e as integer
'...
end type
dim shared monster(...) as monster_type |
hierdurch hast du ein array, welches über das typ automatisch alle elemente beinhaltet. (das ist für spätere übergaben an funktionen, oder wenn du mit pointer arbeiten möchtest sehr viel einfacher zu händeln)
auf das array kanst du im anschluß wie folgt zugreifen:
Code: |
monster(id).x = 1
monster(id).y = 2
'...
'oder
with monster(id)
.x = 1
.y = 2
'...
end with
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Grundlagenfan Gast
|
Verfasst am: 03.12.2015, 18:15 Titel: |
|
|
arduno hat Folgendes geschrieben: | Warum immer ein typisches Ballerspiel ?
Geht es nicht ohne Ballerei.... ? |
Ach, davon kann es nicht genug geben. Und gerade Towedefense ist doch ein Knaller. Ich hab diese Art von Spielen früher regelrecht weggesuchtet. ![grinsen](images/smiles/icon_biggrin.gif) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
yakyak
Anmeldungsdatum: 09.09.2015 Beiträge: 13 Wohnort: Berlin
|
Verfasst am: 27.12.2015, 21:34 Titel: |
|
|
Danke PuppetMaster für den Tipp mit den Datentypen!
Ich hab leider das ganze Projekt beim letzten Rechnerwechsel verloren (vergessen ins Backup mit aufzunehmen)... traurig.
Beginne jetzt mit meinem nächsten Spiel, da werd ich das mit den Typen berücksichtigen. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|