Volledige versie bekijken : diagonale instances?
frankje
%Europe/Berlin %021 %2006, 01:30
Hoi ik ben frankje en ben een spel aan het maken - het gaat redelijk. :)
Hoewel... :S ik ben nu al een week kwijt aan het zoeken naar een manier om instances diagonaal te maken. :(
Ik maak in het spel veel gebruik van HitTest tussen onderlinge instances. Maar nu wil/moet ik een diagonaal raakvlak maken.
Zodra je een instance gebruikt bij "HitTest" blijkt dat iedere instance in Flash uiteindelijk een rechthoekige vorm heeft. Dit komt door de "boundingbox" waar je, hoe je hem ook kantelt, geen verticaal raakvlak uit kunt halen. Ik ben nog niet heel erg goed met ActionScript en hoop dus dat hier een simpele oplossing voor is.
Mijn vraag is dus kan dit ook echt niet?
Hoe kan ik een diagonaal raakvlak maken dat effectief blijft bij het gebruik van HitTest op onderlinge instances?
...Ofwel hoe maak je een raakvlak in Flash diagonaal?
Bedankt voor het lezen, dit is mijn eerste post op flashfocusforum.
Ik hoop dat iemand hier me kan helpen. Het zou een grote stap vooruit betekenen voor het spel.
theFlashWizard
%Europe/Berlin %032 %2006, 01:46
Dat is normaal gesproken vrij pittige wiskunde. Ik raad je aan daar een boek over te kopen. ik ben het nu uit actionscript animation, making things move aan het leren.
Ik neem aan dat je niet meer flash5 hebt (dat staat alleen nog wel in je profile), maar als je flash8 hebt kun je ook bitmap hitesten.
Actionscript Tutorials -> bitmap hittest (http://www.flashfocus.nl/forum/showthread.php?t=6338#bitmap hittest)
frankje
%Europe/Berlin %044 %2006, 02:03
Dat is normaal gesproken vrij pittige wiskunde. Ik raad je aan daar een boek over te kopen. ik ben het nu uit actionscript animation, making things move aan het leren.
Ik neem aan dat je niet meer flash5 hebt (dat staat alleen nog wel in je profile), maar als je flash8 hebt kun je ook bitmap hitesten.
Actionscript Tutorials -> bitmap hittest (http://www.flashfocus.nl/forum/showthread.php?t=6338#bitmap hittest)
Bedankt voor je snelle reactie Flash Wizard. Ja, ik werk ook met andere versies van Flash, maar ben het meeste thuis in Flash5, vandaar. :)
Ik zal de tutorial zeker gaan bekijken.
De tip (van dat boek (http://www.friendsofed.com/book.html?isbn=1590595181) ) kreeg ik eerder deze week ook al. Ik heb al een week achter examples e.d. aangelopen en me erin verdiept. Je komt dan al snel uit op "tile based games" enz. Maar mijn probleem is vrij specifiek. Aangezien het spel al een aardig eindje op weg is kan ik niet plots alles omgooien.
frankje
%Europe/Berlin %535 %2006, 13:50
Oke, het schijnt niet mogelijk te zijn de bounding box werkelijk kwijt te raken. En in Flash 8 kun je idd met bitmapjes werken.
Hier (http://www.kirupa.com/forum/showpost.php?p=1922772&postcount=4) zijn twee duidelijke voorbeelden die ik gister gevonden heb. Als iemand nog andere oplossingen heeft hoor ik dat graag. :)
Erwinzzz
%Europe/Berlin %555 %2006, 14:19
Zoek anders even in de flash help op 'shapeflag' bij hittest. Ik denk dat je daar wel wat aan hebt..
frankje
%Europe/Berlin %592 %2006, 15:13
Oke, bedankt.
SaphuA
%Europe/Berlin %726 %2006, 18:25
Ik weet niet hoe geadvanceerd je wilt gaan, maar Tony's vector tutorials zijn ook super.
http://www.tonypa.pri.ee/vectors/index.html
Denk echter dat dat iets te ver gegrepen is voor je.
frankje
%Europe/Berlin %761 %2006, 19:16
Ach ja, ik begin net. Dit kan later wellicht van pas komen.
Bedankt!
frankje
%Europe/Berlin %687 %2006, 17:30
Iemand zei me dat 'distance checking' misschien de meest simple oplossing is. Zal ik hier een nieuw topic voor aanmaken of kan dat in het verlengde van dit topic? :)
Erwinzzz
%Europe/Berlin %689 %2006, 17:32
Wat bedoel je daar precies mee? (met distance-checking dan natuurlijk ;))
frankje
%Europe/Berlin %693 %2006, 17:38
Wat bedoel je daar precies mee? (met distance-checking dan natuurlijk ;))
:P Uhm... ja, ik weet zelf ook niet hoe dat werkt, maar het zou met punten te werken waardoor je minder snelheid verliest in veeleisende berekeningen. :)
Erwinzzz
%Europe/Berlin %695 %2006, 17:41
dan zou ik die 'iemand' maar even verder vragen :p ik weet er niets van en heb ff op internet gezocht, en ook niets gevonden...
frankje
%Europe/Berlin %700 %2006, 17:48
dan zou ik die 'iemand' maar even verder vragen :p ik weet er niets van en heb ff op internet gezocht, en ook niets gevonden...
Haha, :D dat zal ik dan maar eens gaan doen.
Hoewel ik zelf ook al een oplossing had bedacht. Waarbij het van belang is dat hittestjes in verschillende frames niet blijven rekenen als je in een ander frame zit.
Dan verdeel ik de actieve hittestjes in een level van mijn spel gewoon onder verschillende frames die je letterlijk in en uit loopt zonder dat je het merkt. :)
Ik hoop dat het gaat werken.
SaphuA
%Europe/Berlin %714 %2006, 18:09
Maak even voor het gemak een tekening over wat voor een hitTest je het precies hebt. Dan is het voor iedereen duidelijk.
frankje
%Europe/Berlin %732 %2006, 18:35
Maak even voor het gemak een tekening over wat voor een hitTest je het precies hebt. Dan is het voor iedereen duidelijk.
http://i11.tinypic.com/2zjc4r6.jpg
Dit is het idee omdat ik niet met bitmap hittest werk.
Zo'n muur heeft dan een helebooel losse dezelfde berekeningen:
onClipEvent (enterFrame) {
while (_root.sch.hitTest(this)) {
_root.sch._x--;
_root.sch._y++;
}
}
...die kan ik dan uitschakelen door verschillende hittest gebieden/muren (in een enkel level) in andere frames onder te brengen. En doormiddel van de positie van mijn "char" te bepalen in wel frame "hij" zit. :)
Emveedee
%Europe/Berlin %734 %2006, 18:38
Hmm, lijkt me een vrij omslachtige methode.
Wanneer je mc naar rechts beweegt,
hoef je alleen de rechtse muur
te hittesten. Wanneer je naar links beweegt
alleen de linkse muur, wanneer je naar onder
beweegt alleen de vloer, en wanneer je
naar boven beweegt alleen t plafond.
BernardV
%Europe/Berlin %735 %2006, 18:38
Distance checking: http://www.flashfocus.nl/forum/showpost.php?p=175216&postcount=7
Je tekent namelijk een (denkbeeldinge) cirkel om je object.. dat is het makkelijkste :)
frankje
%Europe/Berlin %736 %2006, 18:40
Hmm, lijkt me een vrij omslachtige methode.
Wanneer je mc naar rechts beweegt,
hoef je alleen de rechtse muur
te hittesten. Wanneer je naar links beweegt
alleen de linkse muur, wanneer je naar onder
beweegt alleen de vloer, en wanneer je
naar boven beweegt alleen t plafond.
De bewegingen zijn iets complexer,
onClipEvent (load) {
// declare and set initial variables
thrust = 2;
decay = 0.00;
maxSpeed = 8.0;
}
onClipEvent (enterFrame) {
// rotate right or left
if (Key.isDown(Key.RIGHT)) {
_rotation += 9;
}
if (Key.isDown(Key.LEFT)) {
_rotation -= 9;
}
//
//
if (Key.isDown(Key.UP)) {
// calculate speed and trajectory based on rotation
xSpeed += thrust*Math.sin(_rotation*(Math.PI/180));
ySpeed += thrust*Math.cos(_rotation*(Math.PI/180));
} else if (Key.isDown(Key.DOWN)) {
// calculate speed and trajectory based on rotation
xSpeed -= thrust*Math.sin(_rotation*(Math.PI/180))/2;
ySpeed -= thrust*Math.cos(_rotation*(Math.PI/180))/2;
} else {
// deccelerate when Up Arrow key is released
xSpeed *= decay;
ySpeed *= decay;
}
//
// maintain speed limit
speed = Math.sqrt((xSpeed*xSpeed)+(ySpeed*ySpeed));
if (speed>maxSpeed) {
xSpeed *= maxSpeed/speed;
ySpeed *= maxSpeed/speed;
}
//
// move based on calculations above
_y -= ySpeed;
_x += xSpeed;
}
vandaar.
Emveedee
%Europe/Berlin %737 %2006, 18:42
Helemaal niet.
Je kunt makkelijk bepalen aan het einde waar je je mc
beweegt of ie naar links/rechts en boven/onder beweegt.
frankje
%Europe/Berlin %739 %2006, 18:44
Distance checking: http://www.flashfocus.nl/forum/showpost.php?p=175216&postcount=7
Je tekent namelijk een (denkbeeldinge) cirkel om je object.. dat is het makkelijkste :)
Ja, dit is waarschijnlijk waar ik naar op zoek ben. Ik hoop dat het me lukt dit toe te passen. Ik ga het vanavond proberen. |)
Bedankt!
frankje
%Europe/Berlin %740 %2006, 18:46
Helemaal niet.
Je kunt makkelijk bepalen aan het einde waar je je mc
beweegt of ie naar links/rechts en boven/onder beweegt.
Oke, ik ben daar niet goed in. Het is niet dat als je de rechter toets indrukt dat je dan naar rechts gaat op het scherm, dus net iets te hoog gegrepen voor mij...
BernardV
%Europe/Berlin %742 %2006, 18:48
OK.. ik ben bezig met een tut over stuiterballen.. misschien heb je iets aan de tekst die ik tot nu toe heb :P
Ik heb een rar toegevoegd met code en in het mapje docs staat de tekst tot nu toe!
Het is nog lang niet klaar, maar ik denk dat je er wel iets mee kunt... aangezien hier ook ballen op elkaar stuiteren :P Dus niet eens diagonale , maar ronde ;)
In het deploy mapje staat een swf.
Daar kun je zien hoe het draait.. pak een bal op en gooi hem weg ;)
//EDIT: Ik ga nu ook niet meer uitleggen dan hier staat, dan wacht je maar op de volledige tut.
frankje
%Europe/Berlin %912 %2006, 22:53
OK.. ik ben bezig met een tut over stuiterballen..
Enorm tof die swf, ik hoop iets dergelijks ook in mijn spel kwijt te kunnen, hoewel ik geen muis wil gebruiken.
Een klein dingetje viel me trouwens op... als twee ballen het zelvde formaat hebben zou de kracht van de ene in de andere verder moeten gaan. Dit leek in je voorbeeldje net niet helemaal het geval(?)
http://www.trendwarenhandel.de/images/mini/pe-5234.jpg
Trouwens over het toepassen van:
var ts:Number = this._width>this._height?this._width:this._height;
for(var i:Number=0;i<aantalBlocks;i++){
var bs:Number = _root['block'+i]._width>_root['block'+i]._height?_root['block'+i]._width:_root['block'+i]._height:
var minDist:Number = ts/2 +bs /2;
var dx:Number = this._x - _root['block'+i]._x;
var dy:Number = this._y - _root['block'+i]._y;
var currDist:Number = Math.sqrt(dx*dx + dy*dy);
if(currDist < minDist)
{
if(this.hitTest(_root['block'+i])){
shizlemynizle();
}
}
}
lukt me helaas niet echt... ik weet van de helft niet wat het is. (Ik ben AS nog aan het leren...doe dit vooral door stukjes uit werkzame examples te gebruiken en te combineren)
Ik zou dit scriptje toch mee moeten geven aan mijn char? en de muur instances "block 1 t/m 99" moeten noemen? Of zit ik er heel ver naast? :)
BernardV
%Europe/Berlin %923 %2006, 23:10
Wat deze code eigenlijk doet is dit:
Je neemt het verschil in x en verschil in y tussen 2 objecten
dus obj1._x - obj2._x.. zelfde voor de _y waarde
De minimale afstand van objecten is de grootste waarde (breedte of hoogte) van object 1 + de grootste waarde (breedte of hoogte) van object 2
En dat gedeelt door 2, mits het registratiepunt in het midden ligt. En voor dit soort berekeningen is het verdomd handig dat ie dat wel ligt, omdat je anders nog moet gaan kijken aan welke kant objecten elkaar raken.
Nu je dus de minimale afstand tussen de objecten weet, kun je met de wortel van:
afstand obj1 tot obj2 op _x in het kwadraat
plus
afstand obj1 tot obj2 op _y in het kwadraat
De werkelijke afstand berekenen...
Dit zijn de afstanden tot het middelpunt er vanuit gaande dat je de hoogste waarde voor de "denkbeeldige" cirkel hebt gekozen.
Nu je die waarde weet, kun je die vergelijken met de minimale waarde. Als deze dus kleiner is, doe dan een hittest anders hoef je het niet te doen, want dan is het toch altijd false.
Hoop dat dit iets meer duidelijkheid geeft... blijft altijd lastig dit soort dingen uit te leggen.. daarom zit ik ook wat vast in de tut ;)
//EDIT: Over de krachten:
Het zou best kunnen dat dit niet 100% klopt.. het blijft ook verdomd moeilijke wiskunde in mijn ogen ;)
Maar het is wel zo dat er ook kracht verloren gaat bij een botsing, dus niet 100% van de kracht gaat door...
//EDIT2:
Mocht je niet je registratiepunt in het midden hebben liggen, maar linksboven.. kun je natuurlijk dit gebruiken:
var x:Number = obj1._x + obj1._width/2;
var y:Number = obj1._y + obj1._height/2;
en dat ook voor de andere objecten...
frankje
%Europe/Berlin %938 %2006, 23:32
Wat deze code eigenlijk doet is dit:
(...)
Juist dat is dus wat er achter zit. Nu het praktische gedeelte :S
output:
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 1: ':' expected
var ts:Number = this._width>this._height?this._width:this._height;
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 3: ':' expected
var bs:Number = _root['block'+i]._width>_root['block'+i]._height?_root['block'+i]._width:_root['block'+i]._height:
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 2: Statement must appear within onClipEvent handler
for(var i:Number=0;i<aantalBlocks;i++){
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 4: Statement must appear within onClipEvent handler
var minDist:Number = ts/2 +bs /2;
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 5: Statement must appear within onClipEvent handler
var dx:Number = this._x - _root['block'+i]._x;
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 6: Statement must appear within onClipEvent handler
var dy:Number = this._y - _root['block'+i]._y;
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 7: Statement must appear within onClipEvent handler
var currDist:Number = Math.sqrt(dx*dx + dy*dy);
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 9: Statement must appear within onClipEvent handler
if(currDist < minDist)
Scene=Scene 1, Layer=Layer 6, Frame=1: Line 15: Unexpected '}' encountered
}
:P
Over de krachten:
Het zou best kunnen dat dit niet 100% klopt.. het blijft ook verdomd moeilijke wiskunde in mijn ogen ;)
Ach ja, het heeft in wezen niets met het formaat maar met de massa van een bal te maken...Ook weet ik niet of die ballen exact even groot zijn. |)
SaphuA
%Europe/Berlin %941 %2006, 23:35
Ok. Je wilt kijken waneer een object die 'hittestjes' van je raakt? Die moeilijke methodes werken ook allemaal goed, maar ik vraag me af of dat allemaal nodig zal zijn.
Kun je niet een voorbeeld geven van hoe het hele 'level' of wat het mag worden eruit zal zien? Wellicht is er een veel eenvoudigere methode beschikbaar.
PS: Bernard, puik werk die stuiterballen :)
frankje
%Europe/Berlin %952 %2006, 23:51
Ok. Je wilt kijken waneer een object die 'hittestjes' van je raakt? Die moeilijke methodes werken ook allemaal goed, maar ik vraag me af of dat allemaal nodig zal zijn.
Kun je niet een voorbeeld geven van hoe het hele 'level' of wat het mag worden eruit zal zien? Wellicht is er een veel eenvoudigere methode beschikbaar.
PS: Bernard, puik werk die stuiterballen :)
Nee, ik wil het aantal onnodige berekeningen terugbrengen. ;)
Hier een ruw voorbeeldje van wat ik aan het maken ben....(ver van hoe het uiteindelijk zal zijn btw.)
http://rapidshare.de/files/37095008/walls1big.rar.html
Eventuele offtopic feedback is natuurlijk welkom maar doe maar PM.
SaphuA
%Europe/Berlin %953 %2006, 23:53
Kun je contact met me opnemen via mail of msn? Ik denk dat ik een veel betere methode voor je heb dat ook nog eens eenvoudig te implementeren is. Wellicht dat we even kunnen praten, dan zal ik je er bij helpen.
~Sph
saphua_fk[at]hotmail.com
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.