NPC-Programmierung.

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

LorDtaiBsn

Betreff: NPC-Programmierung.

BeitragMi, Jan 06, 2010 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute, ich hoffe ich schreib' ins richtige Forum.
Also mein Problem ist folgendes: Ich habe jetzt eine Landschaft, eine Engine und einen First Person Charakter. Als nächstes würde ich gern ein paar Gegner machen, die einfach nur zufällig irgendwo auf dem Terrain (wenn möglich über y=1) lang laufen und sich abknallen lassen. Wünschenswert wär's natürlich, dass sie auch zurückschießen, aber soweit bin ich eigentlich noch nicht.
Also zum eigentlichen Problem: Ich habe einfach nicht die leiseste Ahnung, mit welchen Befehlen ich arbeiten muss, um 1. 'ne künstliche Intelligenz zu schaffen und 2. Figuren bzw. Meshes zufällig auf einem Gebiet (welches natürlich dann auch über y=1 sein sollte, weil sie sonst im Wasser rumläuft) rumlaufen zu lassen.

Kann mir vielleicht irgendjemand behilflich sein, ich brauche wenigstens irgendeinen Ansatz. Sad

Danke im Voraus!

NightPhoenix

BeitragMi, Jan 06, 2010 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Du legst einen Type für Gegner an.
Code: [AUSKLAPPEN]
type Gegner
   field mesh
   field schiessen
   field .....
end type

Diesen fügst du so viele Gegner hinzu wie du möchtest. ("ty" kann auch anders heißen, völlig egal)
Code: [AUSKLAPPEN]
ty.Gegner = new Gegner

Jedem Schleifendurchlauf gehst du jetzt diese Typeeinträge durch...
Code: [AUSKLAPPEN]
for ty.Gegner = each Gegner
  ;inhalt
next

... und lässt sie z.b. laufen, sich drehen, oder nur stehen lassen.
Hier könntest du z.b. für das "erkennen" des Spielers auch Distanzabfragen einbauen. Wenn der Gegner innerhalb einer best. Distanz ist so drehen sich die Gegner zum Spieler und schießen.

Schießen geht auch über Types. Du brauchst dafür einen neuen Typ für Schüsse.

Ist z.b. innerhalb dieser "for ty.Gegner = each Gegner" ein Typeintrag ty\schiessen=1 so erstellt man ein neues Schuss-type (shu.schuss = new schuss z.b.) und bewegt diese Schüsse in jeder Schleige ebenso mit einer for-each Schleife vorwärts bis ihre Lebenszeit erlischt oder sonstiges eintrifft.

Meiner Meinung nach solltest du erstmal mit etwas leichteren anfangen.
  • Zuletzt bearbeitet von NightPhoenix am Mi, Jan 06, 2010 21:06, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragMi, Jan 06, 2010 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Die ehrliche Antwort?
Schreib erstmal ein Pong oder ein simples Jump 'n' Run bevor Du dich an solche Dinge wagst.
Programmieren braucht Zeit und Übung.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

LorDtaiBsn

BeitragDo, Jan 07, 2010 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Die ehrliche Antwort?
Schreib erstmal ein Pong oder ein simples Jump 'n' Run bevor Du dich an solche Dinge wagst.
Programmieren braucht Zeit und Übung.


Ich habe damals mit QBasic angefangen und bin nach einer mehrjährigen Pause direkt auf Blitz3D umgestiegen, und da hierbei ja das selbe Prinzip gilt wie bei BlitzBasic (bzw. wenigstens annäherungsweise), habe ich es gleich so probiert.^^

Und NightPhoenix, ich danke dir für die Antwort, ich mache mich gleich mal ran!
 

LorDtaiBsn

BeitragDo, Jan 07, 2010 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich bin jetzt so weit, dass ich vier Gegner erstellt habe:
BlitzBasic: [AUSKLAPPEN]

CreateEnemy()
CreateEnemy()
CreateEnemy()
CreateEnemy()

While Not KeyHit(1)
...

(Ich weiß nicht, wie man das ganze in einer Zeile schreiben kann, z.B. (CreateEnemy())*4) oder so, geht das?)

Die Funktion sieht so aus:
BlitzBasic: [AUSKLAPPEN]
Function CreateEnemy(anzahl$)
g.gegner= New gegner
g\mesh=CopyEntity(gegnermesh,0)
g\x=Rnd(0,50)
g\y=Rnd(10,50)
g\z=Rnd(0,50)
EntityType g\mesh,CAM_COL
;EntityRadius g\mesh,20
PositionEntity g\mesh,g\x,g\y,g\z
MoveEntity g\mesh,Rnd(5,10),0,Rnd(5,10)
End Function


Und dann in der Hauptschleife initialisiere ich die Gegner mit
BlitzBasic: [AUSKLAPPEN]

If gx>128 And gz>128
For g.gegner=Each gegner
TranslateEntity g\mesh,-(Rand(0.005,0.002)),0,-(Rand(0.005,0.002))
Next
Else
For g.gegner=Each gegner
TranslateEntity g\mesh,Rnd(-0.5,0.5),0,Rnd(-0.5,0.5)
Next
EndIf

Jetzt bewegen die sich aber viel zu schnell, ich weiß nicht wie ich mithilfe des MilliSecs()-Befehls oder sonstigen Zeitintervallbefehlen irgendwie die Viecher langsamer laufen lassen kann?!

Ich habe einfach zum kompletten Nachschauen den Code (incl. Ressourcen, damit man's auch starten kann und sich anschauen kann, was da passiert) mal hochgeladen:
HIER
Ich weiß, mir scheinen die Grundlagen zu fehlen, aber ehrlich gesagt möchte ich jetzt nicht erst wieder zu BlitzBasic zurücksetzen, vor allem weil ich im Februar eine Mappe zu einem vorgegebenen Thema anfertigen muss und bis dahin schon gern ein bisschen mehr auf Blitz3D eingespielt sein möchte. Das klingt ignorant ich weiß, aber ich bin ein visueller Typ und wenn ich nicht unmittelbar sehen kann, was ich mache, dann verliere ich schnell die Lust, und das soll mir bei dem Spiel nicht passieren, deswegen bin ich gleich in Blitz3D rein.

Tankbuster

BeitragDo, Jan 07, 2010 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast aber eine komische Methode, um die NPCs zufällig zu bewegen.

Ich würde zufällige Wegpunkte irgendwo hinsetzen. Der NPC begibt sich dann auf den Weg dorthin. Wenn er dorf angekommen ist, bleibt er eine Zeit lang stehen und geht dann weiter.
Twitter
Download Jewel Snake!
Windows|Android
 

LorDtaiBsn

BeitragDo, Jan 07, 2010 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie macht man das nun wieder? Sad

Tankbuster

BeitragDo, Jan 07, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine leichte Methode wäre:

Jeder NPC hat einen Pivot. Der wird zufällig irgendwo platziert.
Du richtest den NPC mit PointEntity darauf und lässt ihn vorwärts laufen.
Wenn er in einem bestimmten Abstand ist, schaltest du irgendeine Variable auf 1000, die dann runterläuft.
Solange diese Variable >0 ist, steht der NPC nur rum.
Ist sie <0 positionierst du den Pivot dann neu und der NPC bewegt sich zum neuen Punkt.

Ich hoffe das Hilft etwas
Twitter
Download Jewel Snake!
Windows|Android
 

LorDtaiBsn

BeitragDo, Jan 07, 2010 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok verstehe, also ein Pivot is in dem Falle dann quasi sowas wie ein NullObjekt?

Tankbuster

BeitragDo, Jan 07, 2010 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Ein Objekt, dass du nicht sehn kannst, das aber trotzdem da ist.
CreatePivot
damit kannst du genauso umgehen wie mit allen anderen Objekten (Kamera, Würfel, ect).
Twitter
Download Jewel Snake!
Windows|Android
 

LorDtaiBsn

BeitragDo, Jan 07, 2010 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool danke, ich werds mal probieren!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group