Sprite schaut cursor an
Übersicht

Xezog42Betreff: Sprite schaut cursor an |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Community,
Ich und ein Freund von mir haben gestern angefangen zu Programmieren, sind also wirklich noch ganz am anfang, das "Spiel" an dem wir momentan "arbeiten" wird ein topdown shooter und wir wollten das der Spieler den cursor nachschaut, man soll immernoch mit WASD laufen können, aber mit der maus zielen. Hoffe uns kann jemand helfen. -Xezog42 |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
TranslateEntity zum Bewegen
AlignToVector zum Drehen. Zum AlignToVector, der Aufruf geht ungefähr so: AlignToVector(SpriteName, GetWidth()/2-MouseX(), 0, GetHeight()/2-MouseY(), 2, 1) Viel Spaß! (Alles innerhalb von zwei Minuten aus der Hilfe zusammengesammelt...) |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Xezog42 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die schnelle Antwort!
Aber wie gesagt, wir haben gestern erst begonnen, wäre also nett wenn du ein bisschen genauer erklären könntest wo wir den Befehl schreiben müssen, bzw. wo wir was einsetzen müssen (Sorry wenn das total offensichtlich ist). Nur um das nochmal klar zu stellen, wir brauchen ein Befehl der einfach nur ein "Bild" auf dem Bildschirm der Maus nachschauen lässt, also wenn meine maus rechts vom spieler ist schaut er nach rechts, wenn ich den cursor 5 pixel weiter runter schiebe schaut der spieler 5 pixel weiter runter. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Grüße.
Wenn du/ihr noch Anfänger seid, dann lest euch doch bitte ein paar Tutorials durch. Wir helfen immer gern, aber anstatt jedem persönlich eine Schritt für Anleitung zu geben, solltet ihr euch im Beginners-Corner und in der Tutorial Sektion selbst umsehen. Davon habt ihr auf längere Sicht einfach mehr. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Xezog42 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Haben wir, leider nichts gefunden was wirklich das ist was wir suchen. Trotzdem danke, ich werde nochmal nachsehen. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schaut mal nach, ob bei der Beginner's Practice Series etwas für euch dabei ist, z.B. BPS 3&4.
Alte, aber größtenteils noch richtige Tutorials finden sich hier. Und da es auch nicht um 3D geht: ~VERSCHOBEN~ Edit: Link verbessert. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
- Zuletzt bearbeitet von Xeres am So, Jun 09, 2013 20:59, insgesamt einmal bearbeitet
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Xerxes, dein Link geht nicht. Richtiger Link: https://www.blitzforum.de/scene/links/tutorials/
Schaut euch auch mal das hier an: https://www.blitzforum.de/showcase/347/ |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für Eure Frage gibt ers mehrere Lösungsansätze von einfach bis kompliziert. Ihr solltet zunächst immer erst mal Teilaspekte des Problems lösen und so Euch dem Ziel nähern. So versteht man es besser.
Hier der einfachste Weg. Der Spieler ist nur ein Kreis, also noch kein Bild, das man auch noch drehen müsste. Dadurch wird es einfacher: Der Spieler hat ein bestimmtes Koordinatenpaar X# und Y#. Der Cursor ein anderes Koordinatenpaar, in Eurem Fall immer MouseX() und MouseY() Eine Bewegung des Spielers kann man, dadurch erreichen, dass zu den Koordinaten immer was addiert oder subtrahiert wird: Mit zwei Teilbewegungen Xadd# und Yadd# kommt man so überall hin. Die benötigte Bewegungsrichtung vom Spieler zum Cursor wird einfach aus den Differenzen der Koordinaten errechnet. Xadd# = MouseX() -X Yadd# = MouseY() -Y Ein Drehwinkel für ein Sprite errechnet sich auch aus diesen Differenzen. Die Funktion nennt man Arcustangens und das Blitz-Command ist Atan2(). RichtungsWinkel%=ATan2(Xadd,Yadd) In diesem Beispiel ist noch vieles verbesserungswürdig, aber zum ersten Kennenlernen taugt es: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 |
||
Xezog42 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke fürs ausführliche Erklären, kann sein das wir was falsch verstanden haben, aber in deinem code wird die Maus von dem Spieler verfolgt bzw. das Bild fährt der Maus nach. Was wir wollten ist das sich das Bild mitdreht, nicht mitläuft. Trotzdem danke für die Antworten. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
atan2![]() Bist Du / seid ihr noch in der Schule? Wenn ja: welche Klasse besucht ihr, dann hat man eine Ahnung welche Mathematikkentnisse ihr mitbringt. |
||
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 |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
es gibt einen Befehl RoateImage![]() das Ding ist, dass der Befehl nicht in Echtzeit arbeitet. Also müsste man die gedrehten Bilder speichern. Wenn ihr das Bild während dem Spiel in jedem Frame neu berechnet, habt ihr eher eine Diashow als ein Spiel. Daher ein Array erstellen, vordrehen, Winkel ausrechnen, aus dem Array laden. |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und wenn ihr das tut, bitte bitte bitte nicht jedes Grad einzeln, ein durchschnittlich großes Bild benötigt bestenfalls 5- 20 Grad Schritte, sprich 72 - 16 Schritte. Alles andere kostet nur unnötig Speicher und Zeit und bringt optisch nicht wirklich viel. | ||
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 |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ah! das war mir nicht ganz klar. Deshalb hatte ich einfach beides reingepackt. Die Bewegung hin zur Maus und das Anzeigen der Richtung in Grad mit ATan2()
Sowas in einem Spiel zu nutzen ist leider schon etwas anspruchsvoller: Durch ATan2() bekommt Ihr die Richtung vom Spieler zur Maus in Grad. Die Werte gehen von -180 bis +180. Wenn Ihr zu diesem Wert +180 addiert und dann das Ergebnis durch 30 teilt, erhaltet ihr Werte von 0 bis 11. 0=0° 1=30° 2=60° ... 11=330° so bleiben nur 12 "Richtungen" übrig. Das genügt vollkommen! Da in Blitzbasic kein Echtzeit-Drehen von Sprites möglich ist, rate ich Euch den Original Sprite schon zu Beginn des Spiels 12 mal in 30° Schritten zu drehen und daraus 12 Variationsbilder zu erzeugen. Beispiel gibt es bei RotateImage() in der BlitzBasic Help. Im Spiel solltet ihr dann anhängig vom Ergebnis der Winkelberechnung jeweils das entsprechende Variationsbild malen. Na dann viel Spaß.... ...vielleicht lieber doch erst mal ein einfacheres Spiel? ...oder vielleicht erst mal doch nur mit einem Kreis, eher symbolisch? |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
- Zuletzt bearbeitet von Midimaster am Sa, Jun 15, 2013 9:19, insgesamt einmal bearbeitet
Xezog42 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay, hat wohl gestimmt das das ein wenig zu kompliziert für uns war, wir haben das Problem jetzt anderst gelöst: Da uns 4 richtungen (oben unten rechts und links) genug sind, haben wir vier dreiecke doppelt so groß wie der Bildschirm gemacht, welche immer mit dem Spieler mitlaufen. Die Dreiecke symbolisieren die obere, rechte, linke und unteren Teile des Bildschirms, wenn die Maus jetzt auf dem oberen Dreieck ist, wird eine Variable geändert, welche widerum das Aussehen des Spielers beeinflussen, damit man diese Dreiecke nicht sieht werden sie unter den Hintergrund gemacht, indem sie als erstes in dem Code vorkommen. Dies hat zwar weit mehr Zeilen in Anspruch genommen als sonst, aber es funktioniert.
Code: [AUSKLAPPEN] Graphics 640,480,32,0 SetBuffer BackBuffer() player_x = 320 player_y = 240 ;sprites background= LoadImage("background.png") position1 = LoadImage("positionright.jpg") ;position of the pic to look right position2 = LoadImage("positiondown.jpg") ;position of the pic to look down position3 = LoadImage("positionleft.jpg") ;position of the pic to look left position4 = LoadImage("positionup.jpg") ;position of the pic to look up playerup = LoadImage("charup.png") playerleft=LoadImage("charleft.png") playerright= LoadImage("charright.png") playerdown= LoadImage("chardown.png") cman = 1 ;direction of the player ;Masks MaskImage position1,255,255,255 MaskImage position2,255,255,255 MaskImage position3,255,255,255 MaskImage position4,255,255,255 MaskImage playerup,0,0,0 MaskImage playerright,0,0,0 MaskImage playerdown,0,0,0 MaskImage playerleft,0,0,0 ;main loop Repeat Cls pos1=player_y-465 pos2=player_x-625 pos3a=player_x-625 pos3b=player_y-465 pos4a=player_x-625 pos4b=player_y-465 DrawImage position1,player_x,pos1 DrawImage position2,pos2,player_y DrawImage position3,pos3a,pos3b DrawImage position4,pos4a,pos4b DrawImage background,0,0 If ImageRectCollide(position1,player_x,pos1,0,MouseX(),MouseY(),10,10) Then cman=4 If ImageRectCollide(position2,pos2,player_y,0,MouseX(),MouseY(),10,10) Then cman= 3 If ImageRectCollide(position3,pos3a,pos3b,0,MouseX(),MouseY(),10,10) Then cman=2 If ImageRectCollide(position4,pos4a,pos4b,0,MouseX(),MouseY(),10,10) Then cman=1 If KeyDown(30) Then player_x = player_x -1 ;left If KeyDown(32) Then player_x = player_x +1 ;right If KeyDown(17) Then player_Y = player_y -1 ;up If KeyDown(31) Then player_y = player_y +1 ;down If cman=1 Then DrawImage playerup,player_x,player_y ElseIf cman=2 Then DrawImage playerleft,player_x,player_y ElseIf cman=3 Then DrawImage playerdown,player_x,player_y ElseIf cman=4 Then DrawImage playerright,player_x,player_y End If Flip Until KeyDown(1) ;By Broco and Xezog42 (höhö) End Trotzdem danke an die Leute die geholfen haben! ![]() |
||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dies ist eine sehr ineffektive Art das Problem zu lösen.
Ich habe mal etwas programmiert was euch vielleicht hilft "Atan2" zu verstehen. BlitzBasic: [AUSKLAPPEN] Graphics 800,600 |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
das ist sehr vernünftig von euch gewesen, sich auf 4 Richtungen zu beschränken und diese Bilder im Voraus zu zeichnen.
Ich würde Euch aber dennoch raten, lieber den Atan2() zu verwenden als soviele unnötige Grafik-Resourcen zu verbrauchen. Das kostet alles Rechenleistung... Man muss den Atan2() nicht unbedingt verstanden haben, um sich zu trauen, ihn zu benutzen. Seht die Funktion wie eine Blackbox, in die man die Koordinaten von 2 Objekten oben reinwirft und unten kommt die Richtung in Grad raus: BlitzBasic: [AUSKLAPPEN] ; Berechnung: Dann erhält man schon mal Werte zwischen -180 und + 180. Es bedeuten: -180=oben, -90=links, 0=unten, 90=rechts, 180=oben So, nun kann man mit IF die Entscheidungen treffen: BlitzBasic: [AUSKLAPPEN] If (R<-135) Or (R>135) |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Xezog42:
Etwas hübscher ginge es, wenn du die Bilder nicht einzeln laden würdest, sondern als Grafikstrip alle in einem Bild mit LoadAnimimage ![]() BlitzBasic: [AUSKLAPPEN] If cman=1 Then Kürzen auf: BlitzBasic: [AUSKLAPPEN] DrawImage player, player_x, player_y, cmanWobei der Framezähler cman nicht bei 1 sondern 0 anfängt. Siehe zu dem Thema auch BPS #5 |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich greife mal grade midimaster auf:
[quote=Midimaster]Es bedeuten: -180=oben, -90=links, 0=unten, 90=rechts, 180=oben [/quote] Bezüglich Atan2. Wie Midimaster schon sagte, man brauchts nicht verstehen, aber nutztn kann mans trotzdem. Kurzgesagt, es gibt euch den winkel zwischen 2 koordinaten, wenn wie folgt verwendet: Code: [AUSKLAPPEN] Atan2 ( Ziel_Y - Objekt_Y, Ziel_X - Objekt_X ) Ziel_Y ist die "wohin wird geguckt" Y position. Das gleiche gilt für Ziel_X Objekt_y ist dein momentanes objekt, üblicherweise ein spieler oder gegner, der irgendwo hingucken soll. Gleiches gilt für X Dies gibt dir effektiv einen winkel aus. In Blitzmax hatte ich immer 0° = RECHTS aber pfff. Ich rate zu etwas wie folgendem: BlitzBasic: [AUSKLAPPEN]
Wenn ich mich nicht irre, gibt dir das einen wert zwischen 0 und 3 raus. Kurze erklärung (kannst du überspringen, ich kann nicht erklären xD) : Da der winkel zwischen -180 und 180 liegen kann, rechnen wir 180drauf (gibt werte zwischen 0 und 360 aus). Danach wird eine Modulus Division drauf angewendet. Diehnt nur der sicherheit, das der wert wirklich zwischen 0 und 360 liegt. Dann bringen wir das ganze mit einer Division durch 360 auf einen wert zwischen 0.0 und 0.999999 und multiplizieren das ganze mit 4. Warum 0.99999 ? Atan2 gibt keine 180 aus. 179.99999 ist das maximal mögliche, sozusagen; 180 würde direkt zur -180 werden. Das ist von vorteil, dadurch können wir es durch Floor() auf einen wert von 0...3 bringen, genau den input den du brauchst. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group