Sprites in Types und Kollisionsabfrage dieser

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Sprites in Types und Kollisionsabfrage dieser

BeitragSa, Jan 14, 2006 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
[Alle hier genannten Themen sind erledigt]

Hallo, habe in B3D ein Thrust-Klon (2D) geproggt und schon zwei Probleme dazu.

1) Ich möchte Rauchpartikel in Form von Sprites mit hilfe von Types einbinden. Müsste aber immer per CopyEntity neue Partikel erstellen. Das Problem: Wie kann ich mit Type-Delete ein Sprite wieder löschen wenn die Zeit des Rauchpartikels abgelaufen ist, ohne später einen Überlauf der Anzahl Partikel zu erzeugen zugleich aber jeden Partikel einzelnd ansprechen können muß?

2) Wie kann ich für jeden Partikel einzelnd eine Kollisionsprüfung (per EntityRadius) machen und nach einer Kollision das einzelne Partikel ansprechen damit ich deren 'Abprallwinkel' neu berechnen kann? Problem ist ja, daß per EntityType eine Kollision durchgeführt wird, ich aber für jeden Partikel nach einer Kollision die Richtung neu berechnen muß, was bei Collisions dann für alle Partikel gild. Möchte nicht ~Partikel(0) und EntityType 3, Partikel(1) und EntityType 4, usw.

Und jetzt mal ein wenig Code, wie ich bisher den Abprallwinkel des Raumschiffes berechnet habe.

Code: [AUSKLAPPEN]
 Collisions 1,2,2,2
 UpdateWorld
 If CountCollisions(schiff)>0 Then
  nx#=CollisionNX(schiff,1)
  ny#=CollisionNY(schiff,1)
  w1=ATan2(yg,xg)
  w2=ATan2(ny,nx)
  w3=180+(w2*2)-w1
  speed#=Sqr(xg^2+yg^2)/1.2
  xg=Cos(w3)*speed
  yg=Sin(w3)*speed
  xp=xpa ;alte X-Position (keine Kollision) zurrücksetzen
  yp=ypa ;alte Y-Position (keine Kollision) zurrücksetzen
 End If

xp = X-Position Schiff
yp = Y-Position Schiff
xg = X-Geschwindigkeit Schiff
yg = Y-Geschwindigkeit Schiff
nx = Kollisionswinkel (EntityRadius Schiff) relativ in X
ny = Kollisionswinkel (EntityRadius Schiff) relativ in Y
w1, w2, w3 = Hilfsvariablen zur Berechnung neuen Winkels
speed = Neue Geschwindigkeit in neue Richtung

In gleicher Art wollte ich eine Kollisionsprüfung der Partikel machen, damit sie von den Wänden abprallen wenn sie kollidiert sind.

Danke im vorraus...
  • Zuletzt bearbeitet von hectic am Mo, Jan 16, 2006 21:47, insgesamt einmal bearbeitet

5k41

BeitragSa, Jan 14, 2006 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh...sry aber ich versteh leider nicht was du genau meinst aber ich denke jetzt einfach mal du willst sowas hier
Code: [AUSKLAPPEN]

;rauch erzeugen
  rauch.rauch=new rauch
  rauch\x=schiffx
  rauch\y=schiffy
  rauch\xspeed=ka irgend ne formel musst du dann ja wissen wegen wind usw..
  rauch\yspeed=s.o.
  usw...

for r.rauch=each rauch
;Kollision
  If kollision(rauch\gfx,raumschiff)=true then xspeed=xspeed*(-1):yspeed=yspeed*(-1)

;Counter+löschen
  r\counter=r\counter+1
  if r\counter=500 then delete r
next

sry wenn ich dich komplett falsch verstanden hab...achja und zugreifen kannste jetzt per first last before und after...hoffe es hilft dir weiter!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jan 14, 2006 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi 5k41, das Problem ist, daß erstellte Sprites in 3D einmal vorhanden 'immer' vorhanden bleiben. Man malt nicht auf dem Bildschirm mit einem Sprite wie mit einem Stempel (DrawImage), sondern man positioniert sie und lässt die Grafikkarte rendern. Wenn man 10 gleiche Sprites darstellen will, muß mal 10 Sprites erstellen (zB mit CopyEntity) und entsprechend alle einzelnd positionieren. Sie werden erst nach RenderWorld sichtbar gemacht. Ich möchte vermeiden, immer mit CopyEntity neue zu erstellen da dann irgendwann ein Überlauf kommen könnte?!?

~Habe mal weiter rumprobiert und habe schon wieder ein neues Problem. Habe es jetzt mal mit Dim versucht (da kann man wenigstens jedes einzelnd immer 'wieder' verwenden). Problem: Wenn ich Sprites anzeige (EntityAlpha Sprite,1) und sie während einer Animationsphase langsam ausblende, beliben sie logischerweise dann 'irgendwo' unsichtbar (EntityAlpha Sprite,0) stehen. Werden sie dann wieder neu gebraucht, werden sie wieder an die Düse meines Schiffes positioniert. Wenn ich aber in der Zwischenzeit um ein paar Ecken geflogen bin, bleiben sie hinter dem Nirvana hängen und kommen nicht mehr an meine Düse ran, da sie immernoch eine Kollisionsprüfung haben... Hoffe es ist verständlich.

/EDIT: Ausserdem wird eine Kollisionsprüfung (in meinem Fall) für alle Sprites benutzt. Wenn jedes einzelne eine Kollisionsprüfung bekommen soll, dann müsste ich Collisions 3,2,2,2:Collisions 4,2,2,2: Collisions 5,2,2,2... machen. Das währe (denke ich) nicht Sinnvoll.

Wie geht sowas?[/u]

5k41

BeitragSa, Jan 14, 2006 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ah ok nun hab ich das problem gerafft....zu deinem versuch: mach es doch einfach so das du die kollision auch nochmal in eine if abfrage setzt, so dass sie ausserkraft tritt,sobal der alpha wert 0 ist oder so...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Klaas

BeitragSo, Jan 15, 2006 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
schalte die Sprites doch mit "HideEntity" ab wenn der Alphawert auf Null steht. Soweit ich weiß werden hidden Entities bei der Kollision nicht mit berücksichtigt.
 

Darren

BeitragSo, Jan 15, 2006 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
oder du löschst sie dann einfach wieder. mit freeentity
MFG Darren

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jan 16, 2006 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@Klaas, danke das hat wunderbar geklappt! Smile Habe u.a. jetzt auch mit Dim gearbeitet... Bleibt nur noch das Problem mit der Kollisionsabfrage (und 'manueller' Umrechnung neuer Bewegungswinkel) einzelner Sprites die in einem Array stehen...

@DarrenSharm, geht das denn? Ich muß doch CopyEntity eine Nummer geben. Also beispiel:

Code: [AUSKLAPPEN]
Dim partikel(299)
For q=1 To 299
 partikel(q)=CopyEntity(partikel(0))
Next

Eine Mischung von Dim-Arrays und Types kann ich mir noch nicht vorstellen.

Black Spider

BeitragMo, Jan 16, 2006 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Hectic!
doch, eine Mischung aus Sprites und Dim´s wäre nicht unmöglich (aber unsinnig Wink ).
was die kollision angeht, nimm HideENtity, oder lösch die Kollision wenn alpha<0 ist
[syntax="bb"]
if rauch\alpha < 0 Then
EntityType rauch\sprite,0
Else
EntityType rauch\sprite, type_rauchsprite
End if [/syntax]
aber hideEnitty funzt auch wunderbar .
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Sprites in Types und Kollisionsabfrage [erledigt]

BeitragMo, Jan 16, 2006 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Black Spider, habe es jetzt doch mal mit Dim's gemacht. Das Problem ist, daß ich nach einer Kollision eines Sprites meine eigene Richtungsänderung machen will. Die Sprites sind Rauchwolken die aus der Düse meines Raumschiffes kommen. Wenn sie mit einer Wand kollidieren, dann sollen sie sich seitlich weg bewegen und nicht da langsam 'rumsliden'. Muß also eine eigene Winkelberechnung her. Habe gerstern (bzw. heute Früh) bis 6 Uhr daran rumgearbeitet. Das testen der einzelnen Sprites kann ich mit If CountCollisions(partikel(i))>0 Then durchführen (endlich), und trotz 300 Sprites keine Recourcenverschwendung...

Es sind also immer 300 Sprites in Einsatz. Und werden nacheinander zur Verwendung gebracht, bis sie auslaufen und per HideEntity unsichtbar gemacht werden. Ein Datenroulette also. Werden mal mehr als 300 Sprites zur gleichen Zeit benötigt, dann werden die ältesten gelöscht und für aktuelle Darstellung genommen, kommt aber eigentlich nicht vor...

Ich danke allen die mir geholfen haben... Bin auf jeden Fall schon einen ganzen Schritt weiter gekommen... Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group