Gamestudio Links
Zorro Links
Newest Posts
Series within loop
by Spirit
Today at 03:38
ein Truetype wie ein Bitmap Font laden?
by tagimbul
Yesterday at 21:46
'you' and c_scan
by 3run
Yesterday at 17:24
rayp's old school fast zombie FPS project
by 3run
Yesterday at 11:01
No Trades Using Workshop 6
by peterhw
Yesterday at 10:59
Actual PIP Cost for backtesting
by tradingest
10/14/18 16:36
Rigid Force Alpha - Classic side-scrolling shoot'em up
by Turrican
10/14/18 11:44
AUM Magazine
Latest Screens
Worst Case Z
AckCon'18 - Lotter vs the World 2 - Preview Release
Evonet Beta v1.0 : Online Project Development Template
Lake scene
Who's Online
5 registered (kvm, Ayumi, jenGs, PSA, jumpman), 463 Guests and 4 Spiders online.
Key: Admin, Global Mod, Mod
Newest Members
BazGen, pallab1964, wOrlD21, peterhw, 7th_zorro
18076 Registered Users
Page 1 of 2 1 2 >
Topic Options
Rate This Topic
#474396 - 10/11/18 21:36 'you' and c_scan
3run Offline
Senior Expert

Registered: 05/05/09
Posts: 5072
Loc: Caucasus
Hi guys. I'm back to Acknex, and facing indeed a very noobish problem.
c_scan doesn't set 'you' pointer, in EVENT_SCAN for scanned entity..

Take a look at this code, press space key and you will get error:
Code:
#define PRAGMA_POINTER

void ph_object_event(){
	
	if(event_type == EVENT_SCAN){
		
		set(you, INVISIBLE);
		
	}
	
}

void main(){
	
	warn_level = 6;
	level_load("");
	
	vec_set(&camera->x, vector(-250, 0, 100));
	vec_set(&camera->pan, vector(0, -10, 0));
	
	ENTITY *ent1 = ent_create(CUBE_MDL, nullvector, NULL);
	set(ent1, PASSABLE | TRANSLUCENT);
	
	ENTITY *ent2 = ent_create(CUBE_MDL, vector(0, 32, 32), NULL);
	ent2->emask |= (ENABLE_SCAN);
	ent2->event = ph_object_event;
	
	while(!key_esc){
		
		if(key_space){
			
			if(ent1->skill1 == 0){
				
				c_scan(&ent1->x, &ent1->pan, vector(360, 0, 200), SCAN_LIMIT);
				ent1->skill1 = 1;
				
			}
			
		}
		else{
			
			ent1->skill1 = 0;
			
		}
		
		wait(1);
		
	}
	
}



Can anyone tell me, what's wrong in this code? Thank you guys.

Edit: can't get ENABLE_DETECT working too.. this makes me mad. I set ENABLE_DETECT for entity that performs the c_scan, and ENABLE_SCAN for scanned entity... in the event of scanning entity, I try to make all scanned entities INVISIBLE, but just nothing happens (as if scanning doesn't find any entities with ENABLE_SCAN event set on).
_________________________
Looking for free stuff?? Take a look here: http://badcom.at.ua

Top
#474398 - 10/11/18 22:24 Re: 'you' and c_scan [Re: 3run]
HellThunder Offline
Member

Registered: 11/14/05
Posts: 193
Loc: Bavaria
Hi 3run,

I think there are two possible ways, in dependence of the needed result.

If you want this one entity (ent2) to hide after scaning it, you need to take the my pointer instead of the you pointer for its event. This would be the first solution.
Code:
////////////////////////////////////////////////////////////////////////
// Template main script:
// Created by WED.
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
// entry: Start Level
// entry_help: Name of the level loaded at start
char* t_levelname = "%NAME%.wmb";

////////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
#define PRAGMA_POINTER

void ph_object_event(){
	
	if(event_type == EVENT_SCAN){
		
		//if(my)
		set(my, INVISIBLE);
		
	}
}
void main(){
	
	warn_level = 6;
	level_load("");
	
	vec_set(&camera->x, vector(-250, 0, 100));
	vec_set(&camera->pan, vector(0, -10, 0));
	
	ENTITY *ent1 = ent_create(CUBE_MDL, nullvector, NULL);
	
	set(ent1, PASSABLE | TRANSLUCENT);
	
	ENTITY *ent2 = ent_create(CUBE_MDL, vector(0, 32, 32), NULL);
	ent2->emask |= (ENABLE_SCAN);
	ent2->event = ph_object_event;
	
	while(!key_esc){
		
		
		if(key_space){
			
			if(ent1->skill1 == 0){
				
				c_scan(&ent1->x, &ent1->pan, vector(360, 0, 200), SCAN_ENTS | SCAN_LIMIT );
			}
			
		}
		else{
			
			ent1->skill1 = 0;
			
		}
		wait(1);
	}
	
}





If ent1 should be able to hide all entities which will be, you have to assign the event to ent1 and enable scan for it too. Then the you pointer would work too.
Code:
void ph_object_event(){
	
	if(event_type == EVENT_SCAN){
		
		if(you)
		set(you, INVISIBLE);
		
	}
}
void main(){
	
	warn_level = 6;
	level_load("");
	
	vec_set(&camera->x, vector(-250, 0, 100));
	vec_set(&camera->pan, vector(0, -10, 0));
	
	ENTITY *ent1 = ent_create(CUBE_MDL, nullvector, NULL);
	ent1->emask |= (ENABLE_SCAN);
	
	set(ent1, PASSABLE | TRANSLUCENT);
	
	ENTITY *ent2 = ent_create(CUBE_MDL, vector(0, 32, 32), NULL);
	ent2->emask |= (ENABLE_SCAN);
	ent1->event = ph_object_event;
	
	while(!key_esc){
		
		
		if(key_space){
			
			if(ent1->skill1 == 0){
				
				c_scan(&ent1->x, &ent1->pan, vector(360, 0, 200), SCAN_ENTS | SCAN_LIMIT );
			}
			
		}
		else{
			
			ent1->skill1 = 0;
			
		}
		wait(1);
	}
	
}




Cheers!


Edited by HellThunder (10/11/18 22:27)
Edit Reason: my condition wasn't needed

Top
#474399 - 10/11/18 22:51 Re: 'you' and c_scan [Re: HellThunder]
3run Offline
Senior Expert

Registered: 05/05/09
Posts: 5072
Loc: Caucasus
Hey HellThunder! Thank you for a quick help!

About MY instead of YOU pointer, in the event in order to make scanned entity invisible grin No, that wasn't a point of my question (you probably mistaken with what I wrote about ENABLE_DETECT). I just couldn't get pointer to the scanning entity, which should be in this case YOU pointer. I was expecting (almost all events work this way) ENABLE_SCAN event to set YOU pointer automatically to the scanning entity, but in my example it didn't work and resulted in E1513. Yes, I could add if(you) check in order to avoid poping up error message grin But my case was - 'why doesn't ENABLE_SCAN set YOU pointer to the scanning entity?'.

Your second solution is what I tried to do with ENABLE_SCAN, but why didn't it work in my example? Isn't setting ENABLE_SCAN for entity which should be scanned enough to set you pointer? I used c_scan with SCAN_LIMIT but without setting SCAN_ENTS, could that cause the problem?

Edit: just noticed that you set ENABLE_SCAN for ent2 and event function for ent1.. Why? Usually when you use events, you set event and the event function which should be triggered for the same entity, right? (as for ENABLE_BLOCK, IMPACT, ENTITY, SHOOT etc).

Edit2: added a picture, to make it more clear grin



Edit3: now this is weird... maybe tomorrow with a fresh head I'll find out the difference, but I got it working (as it should work!) here:
Code:
#define PRAGMA_POINTER

void obj_event(){
	
	if(event_type == EVENT_SCAN){
		
		set(you, INVISIBLE);
		
	}
	
}

void obj(){
	
	c_setminmax(my);
	set(my, POLYGON);
	
	my->emask |= (ENABLE_SCAN | ENABLE_FRAME);
	my->event = obj_event;
	
}

void hero(){
	
	while(my){
		
		if(key_space == 1){
			
			if(my->skill1 == 0){
				
				c_scan(&my->x, &my->pan, vector(360, 0, 200), SCAN_LIMIT);
				my->skill1 = 1;
				
			}
		}
		else{
			
			my->skill1 = 0;
			
		}
		
		wait(1);
		
	}
	
}

void main(){
	
	warn_level = 6;
	level_load("");
	
	vec_set(&camera->x, vector(-250, 0, 100));
	vec_set(&camera->pan, vector(0, -10, 0));
	
	ent_create(CUBE_MDL, nullvector, hero);
	ent_create(CUBE_MDL, vector(0, 32, 32), obj);
	
}

But anyway, I can't understand, why my first example doesn't work??

Edit4: seems that I got it working only cause I've put 'c_scan' into the 'hero' function.. If I assign to that entity a pointer and try to c_scan from main function, it gives E1513.. And I can't understand why.

My best regards! Thank you for your time and help!


Edited by 3run (10/11/18 23:30)
_________________________
Looking for free stuff?? Take a look here: http://badcom.at.ua

Top
#474400 - 10/12/18 11:46 Re: 'you' and c_scan [Re: 3run]
Superku Offline
Senior Expert

Registered: 09/13/03
Posts: 6757
Loc: Kiel (Germany)
The reason that your first example does not yield the desired result (set the you pointer) is that the my pointer is NULL in the main function.
c_scan does not have an entity parameter (compared to let's say c_move) as you are aware:

c_scan (VECTOR* pos, ANGLE* ang, VECTOR* sector, var mode)

When you use ent1->x and ent1->pan as arguments you "lose" all context to the entity (ent1).
Workaround for keeping it in the main function:

me = ent1; // or save the old me pointer in case you use stuff like this somewhere else, ENTITY* oldMe = me;
c_scan(...);
me = NULL; // me = oldMe;
_________________________
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Superku The Game

Severely outdated footage: http://store.steampowered.com/app/407570

Top
#474402 - 10/12/18 12:33 Re: 'you' and c_scan [Re: Superku]
3run Offline
Senior Expert

Registered: 05/05/09
Posts: 5072
Loc: Caucasus
Originally Posted By: Superku
c_scan does not have an entity parameter (compared to let's say c_move) as you are aware:

c_scan (VECTOR* pos, ANGLE* ang, VECTOR* sector, var mode)
Superku, you (as always) just opened my eyes. I missed such an obvious part... cry
Thank you very much for being part of this community!

My best regards!
_________________________
Looking for free stuff?? Take a look here: http://badcom.at.ua

Top
#474428 - Yesterday at 06:07 Re: 'you' and c_scan [Re: 3run]
jumpman Online
Serious User

Registered: 04/17/02
Posts: 1199
Loc: ny
Is it really worth it to put the whole game loop into main? Is having separate actions/whiles that bad?
_________________________
A8 Pro 8.47

Top
#474431 - Yesterday at 10:51 Re: 'you' and c_scan [Re: jumpman]
3run Offline
Senior Expert

Registered: 05/05/09
Posts: 5072
Loc: Caucasus
Originally Posted By: jumpman
Is it really worth it to put the whole game loop into main? Is having separate actions/whiles that bad?
Don't take example in my first post too serious, I just wanted to prototype something and faced this prob (cause I'm dumb grin ). In my projects, I usually use 'event_frame' instead of while loops, for entities, props etc (thanks to MasterQ32). Then one while loop inside of player's action (player's movement, weapons etc), and one loop inside of main function for all gui, shader pipeline etc. I think it's better to avoid using loops, if possible. I remember having performance issues when I used while loop for each NPC etc.

Best regards!
_________________________
Looking for free stuff?? Take a look here: http://badcom.at.ua

Top
#474434 - Yesterday at 12:12 Re: 'you' and c_scan [Re: 3run]
Superku Offline
Senior Expert

Registered: 09/13/03
Posts: 6757
Loc: Kiel (Germany)
Having one game loop is the way to go IMO, so as long as your project isn't that complex already change it.
wait(1) is rather "slow" and you have no real influence on when functions are executed. proc_mode (in particular PROC_GLOBAL) is a game and project killer, leading to seemingly random crashes as it affects all kinds of functions you don't want it to have an impact on. Example:
Click to reveal..
Code:
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////

void projectile()
{
    my.skill1 = 128;
    my.pan = random(20)-10;
    my.tilt = random(20)-10;
    while(my.skill1 > 0)
    {
        c_move(me,vector(16*time_step,0,0),nullvector,0);
        my.skill1 -= time_step;
        
        VECTOR temp;
        vec_set(temp,my.x);
        if(vec_to_screen(temp,camera)) draw_text(str_printf(NULL,"%d",(int)proc_mode),temp.x,temp.y,COLOR_RED);
        
        wait(1);
    }
    ptr_remove(me);
}

void spawnProjectile()
{
    proc_mode = PROC_GLOBAL;
    wait(1); // <- doesn't help as proc_mode is restored after wait
    ent_create(CUBE_MDL,vector(0,random(16)-8,0),projectile);
}

void reload()
{
    level_load(NULL);
}

void main()
{
    fps_max = 60;
    video_mode = 10;
    level_load(NULL);
    on_mouse_left = spawnProjectile; // press left mouse button a few times,
    on_mouse_right = reload; // then the right mouse button to crash the game
}



What I've done for the past few years for new projects was to use on_frame, like this:

Code:
///////////////////////////////
#include <acknex.h>
#include <default.c>

// header files
#include "player.h"

// implementation:
#include "player.c"

///////////////////////////////

void mainFrameEvent()
{
	input update function;
	if(gameMode == GAME_MODE_PLAY)
	{
		objectsUpdate();
		enemiesUpdate();
		playerUpdate();
	}
	if(gameMode == other modes) { ... }
}

void main()
{
	fps_max = 60;
	level_load(NULL);
	...
	on_frame = mainFrameEvent;
}



This way you have complete control over what gets executed when and how. You could for example freeze all enemies or projectiles in the game with a simple if(variable) check, while allowing the player to move freely.
You only have to let's say create a list of objects after level_load (on_level_load or what it's called) and free that list on or before level change.

I still use wait(1) entity loops here and there but just for some level decoration/ dynamic objects which don't have an actual influence on gameplay.
_________________________
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Superku The Game

Severely outdated footage: http://store.steampowered.com/app/407570

Top
#474435 - Yesterday at 16:08 Re: 'you' and c_scan [Re: Superku]
3run Offline
Senior Expert

Registered: 05/05/09
Posts: 5072
Loc: Caucasus
Superku, that's an awesome idea! Got to give it a try. Thank you very much!

Edit: it's sad that you can't find anything about 'on_frame' in manual.
_________________________
Looking for free stuff?? Take a look here: http://badcom.at.ua

Top
#474436 - Yesterday at 17:23 Re: 'you' and c_scan [Re: 3run]
Emre Offline
Senior Member

Registered: 07/28/07
Posts: 485
Loc: Turkey, izmir
Originally Posted By: 3run

Edit: it's sad that you can't find anything about 'on_frame' in manual.


There is a title about on_frame... but only in A7 manual i guess. That's weird.


Top
Page 1 of 2 1 2 >


Moderator:  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de