Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

LunaDefense (Tower-Defense-Game)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 16:21    Titel: LunaDefense (Tower-Defense-Game) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 16:22    Titel: Antworten mit Zitat

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.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 16:24    Titel: Antworten mit Zitat

Schritt 2 (diese Woche)

- ein paar Sprites ausgesucht
- erste Versuche mit map-Variablen (z. B. map(x,y) = "fence")
- Demolevel programmiert

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 16:26    Titel: Antworten mit Zitat

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

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 16:28    Titel: Antworten mit Zitat

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

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 16:31    Titel: Antworten mit Zitat

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)

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 09.09.2015, 21:54    Titel: Antworten mit Zitat

...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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 09.09.2015, 22:57    Titel: Antworten mit Zitat

Erst einmal ein herzliches Willkommen im Forum! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 10.09.2015, 13:49    Titel: Antworten mit Zitat

Danke für das Willkommenheißen lächeln

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 lächeln


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
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 13.09.2015, 10:25    Titel: Antworten mit Zitat

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.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 13.09.2015, 17:26    Titel: Antworten mit Zitat

So, das mit dem Weg-Finden habe ich jetzt ein wenig unorthodox gelöst, aber sie finden ihren Weg lächeln



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 zwinkern



Der graslose Hintergrund dient mir nur zur Überprüfung, gehört also nicht zur Spieloptik.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 13.09.2015, 21:01    Titel: Antworten mit Zitat

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.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 14.09.2015, 22:59    Titel: Antworten mit Zitat

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 19.11.2015, 22:15    Titel: Antworten mit Zitat

Warum immer ein typisches Ballerspiel ?
Geht es nicht ohne Ballerei.... ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 24.11.2015, 17:23    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Grundlagenfan
Gast





BeitragVerfasst am: 03.12.2015, 17:15    Titel: Antworten mit Zitat

arduno hat Folgendes geschrieben:
Warum immer ein typisches Ballerspiel ?
Geht es nicht ohne Ballerei.... ?


Ach, davon kann es nicht genug geben. grinsen Und gerade Towedefense ist doch ein Knaller. Ich hab diese Art von Spielen früher regelrecht weggesuchtet. grinsen
Nach oben
yakyak



Anmeldungsdatum: 09.09.2015
Beiträge: 13
Wohnort: Berlin

BeitragVerfasst am: 27.12.2015, 20:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz