Monkey Island 1 Stil
Übersicht

![]() |
IronstormErstklassiger Contest-VeranstalterBetreff: Monkey Island 1 Stil |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() |
||
..:: 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 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
IronstormErstklassiger Contest-Veranstalter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich versteh beim meisten nur Bahnhof ![]() ![]() |
||
..:: 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
um mal meine Variante zu veranschaulichen hab ich mal zwei Skizzen gezeichnet (ist äh extra so einfach gehalten ![]() 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 ![]() |
||
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
Plasma(alt)Betreff: @divi |
![]() Antworten mit Zitat ![]() |
---|---|---|
das ist ja richtiger code divi !
cool du machst dich wenn ich an die DOSE denke |
||
![]() |
soli |
![]() Antworten mit Zitat ![]() |
---|---|---|
Guter Code, kann man verwenden. | ||
solitaire |
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group