I got a plaform kinda thingy going on and I’m collecting coins xD
The coins are collected by:
A near sensor on the coin that filters the player property (player is just a cube)
That near sensor sends a message and ends the object
On-screen you see an overlay with a counter.
The counter is set up to receive the message and add one to the property that then gets assigned to text.
But when collecting lots of coins in short amount of time I lose some coins.
I now how many are in my level but I never get that number on screen.
I’ve seen this bug myself. A good idea is to use a Collision sensor instead of a Near sensor. That way, you’ll be triggering fewer coins at a time (which in my experience is the problem, the logic can only keep up with so many things per frame), while also cutting down on resource use (near sensors are major resource drains).
When I use the collision sensor i can jump on/against them before they dissapear. that’s why I tried something else.
Also the near is set to tap is it still a big resource drain then?
You can enable ghost physics on the coin objects, (Meaning they detect collisions but don’t actually react to them, like stopping your character or actually colliding with it)
But if you already did add ghost physics to the object but aren’t satisfied by having to actually touch the object to make it disappear, you can simply give it a collision object bigger than the actual coin and make it invisible.
import bge
cont = bge.logic.getCurrentController()
own = cont.owner
Collision = cont.sensors['Collision']
if Collision.positive:
for objects in collision.hitObjectList:
own['Coins']+=objects['CoinValue']
objects.endObject()
The design does not support collecting multiple coins at the same frame very well.
A) when the collected coin sends a message, several messages can be received at the same time.
Solution:
use a custom brick (Python controller) to deal with all received messages. The advantage is you could send the coin value in the body of the message.
Snippet:
import bge
def printCoinValues():
value = sumMessageBodies()
print("value of collected coins this frame:", value)
def sumMessageBodies():
total = 0
bodies = getMessageBodies()
for body in bodies:
total += float(body)
return total
def getMessageBodies():
bodies = []
for sensor in bge.logic.getCurrentController().sensors:
try:
bodies += sensor.bodies
except AttributeError:
continue
return bodies
B) sensing multiple coins at the same time
Similar to the message solution, this requires more dynamic behavior. The default behavior deals with the fact that anything gets sensed. It does not deal with the sensed objects. So you need a custom bricks that does that for you.
BPR’s code: if I collide with an object coin with the property “CoinValue” it ends the object.
That part worked fine, all the coins get ended by collision or the near sensor.
It’s the counter that can’t handle the amount of messages in a short amount of time.
Monster’s Code: makes a function printcoinvalue by counting the number of message-bodies per frame.
I’ve tried both the script and the module.
I can’t make either work!
With BPR’s code the obj’s don’t end when i collide and nothing in the console for Monster’s module
Again I’ve only made a script run once!
So probably I’m doing something wrong.
On what do i put the module? Does it even matter? it just needs to be a message sensor connected to the module right?
There are a plenty of quite good online curses including exercises. I suggest to look for pure Python (without BGE). I do not have a link available. I just know they exist ;).