Sprite schaut cursor an

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Xezog42

Betreff: Sprite schaut cursor an

BeitragSo, Jun 09, 2013 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 09, 2013 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 09, 2013 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragSo, Jun 09, 2013 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Xezog42

BeitragSo, Jun 09, 2013 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Haben wir, leider nichts gefunden was wirklich das ist was wir suchen. Trotzdem danke, ich werde nochmal nachsehen.

Xeres

Moderator

BeitragSo, Jun 09, 2013 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE 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

BeitragSo, Jun 09, 2013 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jun 10, 2013 7:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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
X#=400
Y#=300

Repeat
Cls

; Berechnung:
Xadd#=MouseX()-X
Yadd#=MouseY()-Y
X=X + Xadd/100
Y=Y + Yadd/100
RichtungsWinkel%=ATan2(Xadd,Yadd)

;Winkel
Color 255,255,255
Text 100,100,"Richtungs-Winkel= " + RichtungsWinkel + "°"

; Spieler:
Color 0,255,0
Oval X-10,Y-10,20,20

; Cursor
Color 255,0,0
Rect MouseX()-15,MouseY(),30,1
Rect MouseX(),MouseY()-15,1,30

Flip 1
Until KeyHit(1)
 

Xezog42

BeitragMo, Jun 10, 2013 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMo, Jun 10, 2013 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
atan2 sollte helfen.
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

BeitragMo, Jun 10, 2013 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMo, Jun 10, 2013 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jun 10, 2013 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 11, 2013 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Smile
 

Kruemelator

BeitragDi, Jun 11, 2013 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Repeat
Cls
Color 255,255,255
Oval 400-5,300-5,10,10,1;Kreis in der Mitte des Fensters
Line 400,300,MouseX(),MouseY();Richtung zur Maus

Color 255,0,0
Line 400,300,400,MouseY();Richtung zur Maus NUR Y
yrichtung = (MouseY()-300);Richtung = abstand = Punkt1 - Punkt2
Text 10,20,"Länge in Y-Richtung: "+yrichtung

Color 0,255,0
Line 400,300,MouseX(),300;Richtung zur Maus NUR X
xrichtung = (MouseX()-400);Richtung = abstand = Punkt1 - Punkt2
Text 10,40,"Länge in X-Richtung: "+xrichtung

Color 255,255,255
Text 10,60,"Atan2("+yrichtung+","+xrichtung+") = "+ATan2(yrichtung,xrichtung)+" Grad"
Color 255,0,0
Text 70,75,"Y"
Color 0,255,0
Text 100,75,"X"

Flip 1
Until KeyHit(1)
End

Midimaster

BeitragDi, Jun 11, 2013 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
R%=ATan2(MouseX()-Player_X , MouseY()-Player_Y)


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) 
; oben
ElseIf (R<-45)
; rechts
ElseIf (R<45)
; unten
ElseIf (R<135)
; rechts
EndIf
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDi, Jun 11, 2013 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xezog42:
Etwas hübscher ginge es, wenn du die Bilder nicht einzeln laden würdest, sondern als Grafikstrip alle in einem Bild mit LoadAnimimage verarbeitest. Das würde
BlitzBasic: [AUSKLAPPEN]
 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

Kürzen auf:
BlitzBasic: [AUSKLAPPEN]
DrawImage player, player_x, player_y, cman
Wobei 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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PhillipK

BeitragDi, Jun 11, 2013 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

Local winkel%=ATan2(MouseX()-Player_X , MouseY()-Player_Y)
Local richtung% = (winkel + 180) Mod 180
richtung% = Floor(richtung / 360.0 * 4.0 )

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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group