Monkey Island 1 Stil

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Ironstorm

Erstklassiger Contest-Veranstalter

Betreff: Monkey Island 1 Stil

BeitragSa, Feb 07, 2004 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi @ all!
Hab jetzt mein erstes Spiel an Freunde weitergegeben und sie sagten es wäre gut! Aber jetzt will ich ein Spiel im Monkey Island 1 Stil machen aber ich weis net wie man des macht das Das die Figur sich dort hin bewegt wo man mit der Maus geklickt hat! Irgendwelche Tipps für mich? Smile
..:: blackbird design : blackbird photography : Futuro Verde : X-Commander ::..
MacBook | Intel Core 2 Duo 2,1 GHz | 2048 MB RAM | 80 GB HDD | Mac OS X 10.6.2 (Snow Leopard) | Adobe CS4 Design Premium

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Feb 07, 2004 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber sicher...
schau dir das mal an...Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()
Const ESC = 1, Bildwiederholung = 50, debug =1
Global frameTimer=CreateTimer(Bildwiederholung)
Global posX#= 100,PosY# = 100
While Not KeyDown(ESC)

Rect Int(posX+0.5),Int(PosY+0.5),10,10,0
If MouseHit(1) ; neues ziel zuweisen
  x_Ziel = MouseX()
  Y_Ziel = MouseY()
  grad = Objekt_richtung_grad(x_Ziel ,Y_Ziel,posX ,posY)
    posX_Speed# = Cos(grad )*2 ; 1 = Speed je nachdem wie viele Pixel schnell
    posY_Speed#  = Sin(grad )*2
End If

posX = posX  + posX_Speed
  If  posX_Speed < 0 And posX  < x_Ziel Then; abfrage ob ziel erreicht
   posX_Speed = 0
   posX = x_Ziel
  Else If posX_Speed > 0 And posX  > x_Ziel Then
   posX_Speed = 0
   posX = x_Ziel
  EndIf

posY = posY  + posY_Speed
  If  posY_Speed < 0 And posY  < y_Ziel Then; abfrage ob ziel erreicht
     posY_Speed = 0
     posY = y_Ziel
  Else If posY_Speed > 0 And posY  > y_Ziel Then
    posY_Speed = 0
    posY = y_Ziel
  EndIf
 
If debug Then
Text 500,360, "posX :      "+ posX
Text 500,380, "posY:       "+ posY
Text 500,400, "posX Speed: "+ posX_Speed
Text 500,420, "posY Speed: "+ posY_Speed
Text 500,440, "x_Ziel :     "+  x_Ziel
Text 500,460, "y_Ziel :     "+  y_Ziel
Text 500,480, "Grad :       "+  grad
EndIf

WaitTimer(frameTimer)
   Flip
   Cls

Wend
End
Function Objekt_richtung_grad(Zielpunkt_X,Zielpunkt_Y,Ausgangspunkt_X,Ausgangspunkt_Y )
Waagerechte  = Zielpunkt_X -Ausgangspunkt_X
Hoehe              = Zielpunkt_Y -Ausgangspunkt_Y
  ;0 grad ist hier nach links und im Uhrzeigersinn wird er höher
grad =ATan2(Hoehe ,Waagerechte)
grad = (grad+360)+360
Return grad

End Function

kopieren ... probieren
[BB2D | BB3D | BB+]

Ctuchik

BeitragSa, Feb 07, 2004 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab auch mal ein Adventure programmieren wollen!
Die Bewegung wie in deinem Beispielprogramm hab ich auch hingekriegt, aber ich hatte Probleme mit ner gescheiten Wegfindung, die Hindernisse automatisch umgeht!
Ausserdem war mein Code damals der reinste Schrott, ich hatte riesige ineinander verschachtelte Schleifen und irgendwann hab ichs dann aufgegeben!
Es würd mich aber interessieren ob jemand ne gute Methode für Wegfindung in nem Adventure!

mfG Ctuchik

Hip Teen

BeitragSa, Feb 07, 2004 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, wozu Wegfindung? In einem Adventure im Monkey Island Stil sind ja die Wege vorgegeben. Da würd ich dann Wegpunkte setzen und dann die Figur an denen langlaufen lassen. Nur wird das schwierig wenn dann einem Y-wert mehrere X-Werte zugeordnet werden, ist aber machbar

Freeman

BeitragSa, Feb 07, 2004 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich denk auch da das mit dem pathfinding erstma nich so wichtig is. Aba du machst es einfach so das du mit der maus irgendwo raufklickst(klar ^^) und du einfach davon die koordinaten ermittelst und die dann deiner Figur übergibst, das die dann da hinläuft. ^^ ganz easy oda ^^
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28

Ironstorm

Erstklassiger Contest-Veranstalter

BeitragSo, Feb 08, 2004 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich versteh beim meisten nur Bahnhof Confused ,aber ich kann ja das von Rallimen ausprobieren! Ich versteh bei sein Code das Meiste Razz ! Meld mich wieder wenn es Probleme gibt!
..:: blackbird design : blackbird photography : Futuro Verde : X-Commander ::..
MacBook | Intel Core 2 Duo 2,1 GHz | 2048 MB RAM | 80 GB HDD | Mac OS X 10.6.2 (Snow Leopard) | Adobe CS4 Design Premium

Hip Teen

BeitragSo, Feb 08, 2004 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
um mal meine Variante zu veranschaulichen hab ich mal zwei Skizzen gezeichnet (ist äh extra so einfach gehalten Smile).
Bild1
Das gelbe soll der Weg sein auf der die Spielfigur gehen soll
Dann malst du in einen, am besten selbst gemachten Programm, ein Bild änhlich dem folgenden, bei dem die Punkte die Koordinaten sind auf der die Figur laufen soll.
Bild 2
Dann speicherst du in einem eindimensionalen Dim Feld den Y-Wert. Wenn zum Beispiel der X-Wert 5 ist und der Y-Wert 300 sieht das folgender maßen aus:Code: [AUSKLAPPEN]
Dim(5) = 300

Wenn nun die Figur den X Wert 5 hat setzt du den Y Wert der in dem Array gespeichert ist, in dem fall 300. Ich hoffe das ich das man das verstehen kann Wink

DivineDominion

BeitragSo, Feb 08, 2004 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Yup, du musst Wegpunkte haben und die verbinden. Habe mal eine billige Testroutine gemacht mit der man KReise einen Weg verfolgen lassen konnte. Muss aber geschlossener KreisLAUF sein, sonst gibts absturz beim letzten Wink

Code: [AUSKLAPPEN]
Graphics 640,480,0,2
SetBuffer BackBuffer()


;LEERTASTE - Modus wechseln
; -> Anfang(0): Punkte setzen (linksklick) und verbinden (rechtsklick, erst start, dann ziel)
; -> NAch druck(1): Kreise auf Linien zum Laufen bringen
;Nach nochmaligen Drücken, wechselt der Modus (0->1, 1->0)

Type tWaypoint
   Field x, y   ;Koordinate
   Field nxt.tWaypoint   ;"Zeiger" auf nächsten Punkt
   Field num   ;Nummer zum anzeigen und identifizieren
End Type

Type tEntity
   Field x#,y#   ;Koordinaten
   Field speed#   ;Geschwindigkeit, im mom nicht benutzt
   Field angle#   ;Winkel
   Field destX, destY   ;Nächster Punkt (Ziel)
   Field startX, startY ;Letzter Startpunkt
End Type

;Waypointnummer
Global num = 1

;Pick = Aktuell angewählter Waypoint
;StartX,Y koordinaten des angewählten waypoints
Global pick,startx, starty

;Mauskoordinaten
Global mx, my

;Control zum setzen der waypoints ODER der kreise :)
Global control = False

HidePointer()
While Not KeyHit(1)
   Cls
   
   main()
   updategfx()
   
   Flip
Wend
End

Function main()
   ;Mausknöpfe
   btn1 = MouseHit(1)
   btn2 = MouseHit(2)
   
   ;Leertaste - Modus
   space = KeyHit(57)
   
   ;Koordinaten d. Maus
   mx = MouseX()
   my = MouseY()
   
   ;Editiermodus ändern
   If space Then control = Not control
   
   If control = True
      ;Neue, laufende KReise setzen (Linksklick=
      If btn1
         ;Wegpunkt nach koordinaten finden
         aktPoint.tWaypoint = findXY(mx, my)
         
         ;Prüfen, ob Punkt gefunden
         If aktPoint <> Null
            ;KReis erstellen
            e.tEntity = New tEntity
            
            ;Kreis berechnen
            calcentity(e, aktPoint)
         EndIf
      EndIf      
   Else
      ;WEgpunkte steuern ( Beide maustasten)
      If btn1
         ;Linksklick-Neuen Punkt erstellen
         newPoint.tWaypoint = New tWaypoint
         
         ;Koordinaten auf Maus setzen
         newPoint\x = mx
         newPoint\y = my
         
         ;Nummer setzen
         newPoint\num = num
         
         ;erhöhen
         num = num + 1
      ElseIf btn2
         ;Rechtsklick-Verbindung erstellen
         ;Punkt nach koordinate finden
         aktPoint.tWaypoint = findXY(mx, my)
         If aktPoint <> Null Then
            If pick = 0
               ;Noch keiner gewählt, also diesen wählen
               ;Koordinaten (für LINE später) setzen
               startx = aktPoint\x
               starty = aktPoint\y
               
               ;Nummer setzen, zum identifizieren
               pick = aktPoint\num
            Else
               ;Einer gewählt, also den neuen mit dem gewählten verbinden
               ;Punkt nach Nummer finden
               zielPoint.tWaypoint = findNum(pick)
               
               ;Nächsten punkt übergeben
               zielPoint\nxt.tWaypoint = aktPoint
               
               ;Pick zurücksetzen
               pick = 0
            EndIf
         EndIf
      EndIf   
   EndIf
   
End Function

Function UpdateGFX()
   ;Waypoints malen
   DrawWaypoints()
   ;Kreise malen
   DrawEntities()
   
   ;Mauszeiger malen
   Color 150,150,200
   Rect mx, my, 5, 5
   
   ;Linie vom gewählten Punkt zum Mauszeiger malen, wenn
   ;punkt gewählt
   If pick > 0
      Color 255,255,255
      Line startx, starty, mx, my
   EndIf
End Function

Function DrawWaypoints()
   For curr.tWaypoint = Each tWaypoint
      ;Punkt malen
      Color 255,120,0
      Rect curr\x, curr\y, 10, 10
      
      ;Nummer anzeigen
      Color 30,100,160
      Text curr\x, curr\y, curr\num
      
      ;Wenn eine Verbindung zum "nächsten" (NeXT) punkt
      ;besteht, linie malen
      If curr\nxt <> Null
         Color 255,255,255
         Line curr\x, curr\y, curr\nxt\x, curr\nxt\y
      EndIf
   Next
End Function

Function DrawEntities()
   For curr.tEntity = Each tEntity   
      ;Abstand vom Kreis zum letzten (Start-)punkt
      absX = Abs(curr\destX - curr\startX)
      absY = Abs(curr\destY - curr\startY)
      
      ;Abstand vom Zielpunkt zum letzen (Start-)punkt
      actX = Abs(curr\X - curr\startX)
      actY = Abs(curr\Y - curr\startY)
      
      ;Wenn der abstand KREIS->START größer ist als der
      ;von ZIEL->START, kommt etwas größeres als 0 raus.
      ;Deswegen auch mit Abs() vorher alles positiv gemacht
      If actX-absX > 0 Or actY-absY > 0
         ;Kreis neu berechnen, indem man den Kreis und
         ;den aktuellen (ab jetzt Start)punkt übergibt.
         ;Das Ziel wird dann autom. Gesucht (-> siehe func. selber)
         CalcEntity(curr, findXY(curr\destX, curr\destY))
      EndIf
      
      ;Strecke mit dem Winkel ablaufen
      curr\x# = curr\x# + Cos(curr\angle#)
      curr\y# = curr\y# + Sin(curr\angle#)
      
      ;KReis malen
      Color 255,0,0
      Oval curr\x, curr\y, 5, 5
   Next
End Function


Function CalcEntity (ent.tEntity, aktWp.tWaypoint)
   ;aktWp->nxtWp ist die vorher festgelegte
   ;Verbindung
   nxtWp.tWaypoint = aktWp\nxt
   
   ;Startkoordinaten
   ent\startX = aktWp\x
   ent\startY = aktWp\y
   
   ;Aktuelle Koordinaten auf Start zurücksetzen
   ent\X = aktWp\x
   ent\Y = aktWp\y
   
   ;Zielkoordinaten
   ent\destX = nxtWp\x
   ent\destY = nxtWp\y
   
   ;Abstant ZIEL->START
   absX = ent\destX - ent\x
   absY = ent\destY - ent\y
   
   ;Mit ATAN2()-Beispiel der blitzbase den WInkel
   ;berechnen
   ent\angle# = (ATan2(absY,absX)+360) Mod 360
End Function

Function findXY.tWaypoint(x,y)
   ;x und y sind gesucht
   ;Alle Wegpunkte durchgehen, bis die Koordinaten
   ;im Bereich der angeklickten liegen. Wenn sich
   ;2 übershcneiden, ist das unpraktisch, aber auch
   ;unsinnig :)
   For aktWp.tWaypoint = Each tWaypoint
      ;Bereich von 10 pixeln prüfen
      If x >= aktWp\x And x <= aktWp\x + 10
         If y >= aktWp\y And y <= aktWp\y + 10
            ;"Handle" zurückgeben
            Return aktWp
         EndIf
      EndIf
   Next
   
   ;War wohl nix...
   Return Null
End Function

Function findNum.tWaypoint(n)
   ;n ist die gesuchte Nummer
   ;Alle WEgpunkte durchgehen, bis die Nummer
   ;mit der gesuchten übereinstimmt
   For aktWp.tWaypoint = Each tWaypoint
      If n = aktWp\num Then Return aktWp
   Next
   
   ;War wieder nix, heh
   Return Null
End Function



Steuerung steht ja in den obersten Kommentaren. Damit sei dir schon mal geholfen, wenn du einfach nur Punkte setzen willst und den direkten weg zwischen eben diesen finden möchtest. Geht dabei um die Berechnungen des Winkels. Man hab ich da geschwitzt Wink Ist teiwleise kommentiert und es sollte schon stehen wo die berechnung ist Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS

Plasma(alt)

Betreff: @divi

BeitragSo, Feb 08, 2004 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist ja richtiger code divi !
cool du machst dich wenn ich an die DOSE denke

soli

BeitragMo, Feb 09, 2004 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Guter Code, kann man verwenden.
solitaire

Ctuchik

BeitragMo, Feb 09, 2004 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre schon recht brauchbar, aber man bräuchte auch mehrere Abzweigungen bei denen der Computer den Weg zum Zielpunkt sucht, dann wäre es perfetk Wink

Auf jedenfall krieg ich grad wieder Lust ein Adventure zu programmieren,
aber ich werde sie unterdrücken, zumindest bis ich mit meinem akutellen Projekt fertig bin!

mfG Ctuchik

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group